/**
 * This class represent the <b>Thermostat</b> Cluster as defined by the document:<br>
 * <i>ZigBee Cluster Library</i> public release version 075123r01ZB
 *
 * @author <a href="mailto:[email protected]">Stefano "Kismet" Lenzi</a>
 * @author <a href="mailto:[email protected]">Francesco Furfari</a>
 * @author <a href="mailto:[email protected]">Ryan Press</a>
 * @version $LastChangedRevision: 799 $ ($LastChangedDate: 2015-02-26 19:00:05 +0300 (Thu, 26 Feb
 *     2015) $)
 * @since 0.6.0
 */
public interface ThermostatControl extends Device {

  public static final int DEVICE_ID = 0x0301;
  public static final String NAME = "Thermostat";

  public static final int[] MANDATORY =
      ArraysUtil.append(Device.MANDATORY, new int[] {ZigBeeApiConstants.CLUSTER_ID_THERMOSTAT});

  public static final int[] OPTIONAL =
      ArraysUtil.append(
          Device.OPTIONAL,
          new int[] {
            ZigBeeApiConstants.CLUSTER_ID_SCENES,
            ZigBeeApiConstants.CLUSTER_ID_GROUPS,
            ZigBeeApiConstants.CLUSTER_ID_THERMOSTAT_USER_INTERFACE_CONFIGURATION,
            ZigBeeApiConstants.CLUSTER_ID_FAN_CONTROL,
            ZigBeeApiConstants.CLUSTER_ID_TEMPERATURE_MEASUREMENT,
            ZigBeeApiConstants.CLUSTER_ID_OCCUPANCY_SENSING,
            ZigBeeApiConstants.CLUSTER_ID_RELATIVE_HUMIDITY_MEASUREMENT
          });

  public static final int[] STANDARD = ArraysUtil.append(MANDATORY, OPTIONAL);
  public static final int[] CUSTOM = {};

  /**
   * Access method for the <b>Mandatory</b> cluster: {@link Thermostat}
   *
   * @return the {@link Thermostat} cluster object
   */
  public Thermostat getThermostat();
}
/**
 * @author <a href="mailto:[email protected]">Stefano "Kismet" Lenzi</a>
 * @author <a href="mailto:[email protected]">Francesco Furfari</a>
 * @version $LastChangedRevision: 799 $ ($LastChangedDate: 2013-08-06 19:00:05 +0300 (Tue, 06 Aug
 *     2013) $)
 */
public interface DimmableLight extends Device {

  public static final int DEVICE_ID = 0x0101;
  public static final String NAME = "Dimmable Light";
  public static final int[] MANDATORY =
      ArraysUtil.append(
          Device.MANDATORY,
          new int[] {
            ZigBeeApiConstants.CLUSTER_ID_ON_OFF,
            ZigBeeApiConstants.CLUSTER_ID_LEVEL_CONTROL,
            ZigBeeApiConstants.CLUSTER_ID_SCENES,
            ZigBeeApiConstants.CLUSTER_ID_GROUPS
          });
  public static final int[] OPTIONAL =
      ArraysUtil.append(
          Device.OPTIONAL, new int[] {ZigBeeApiConstants.CLUSTER_ID_OCCUPANCY_SENSING});
  public static final int[] STANDARD = ArraysUtil.append(MANDATORY, OPTIONAL);
  public static final int[] CUSTOM = {};

  /**
   * Access method for the <b>Mandatory</b> cluster: {@link OnOff}
   *
   * @return the {@link OnOff} cluster object
   */
  public OnOff getOnOff();

  /**
   * Access method for the <b>Mandatory</b> cluster: {@link Scenes}
   *
   * @return the {@link Scenes} cluster object
   */
  public Scenes getScenes();

  /**
   * Access method for the <b>Mandatory</b> cluster: {@link Groups}
   *
   * @return the {@link Groups} cluster object
   */
  public Groups getGroups();

  /**
   * Access method for the <b>Mandatory</b> cluster: {@link LevelControl}
   *
   * @return the {@link LevelControl} cluster object
   */
  public LevelControl getLevelControl();

  /**
   * Access method for the <b>Optional</b> cluster: {@link
   * org.bubblecloud.zigbee.api.cluster.measureament_sensing.OccupancySensing}
   *
   * @return the {@link org.bubblecloud.zigbee.api.cluster.measureament_sensing.OccupancySensing}
   *     cluster object if implemented by the device, otherwise <code>null</code>
   */
  public abstract OccupancySensing getOccupacySensing();
}