class TVOCMonitor(XiaomiCustomDevice): """Aqara LUMI lumi.airmonitor.acn01.""" def __init__(self, *args, **kwargs): """Init.""" self.temperature_bus = Bus() self.humidity_bus = Bus() super().__init__(*args, **kwargs) signature = { # <SimpleDescriptor endpoint=1 profile=260 device_type=770 # device_version=1 # input_clusters=[0, 1, 3, 12, 1026, 1029] # output_clusters=[19]> MODELS_INFO: [(LUMI, "lumi.airmonitor.acn01")], ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, INPUT_CLUSTERS: [ Basic.cluster_id, Identify.cluster_id, TemperatureMeasurement.cluster_id, RelativeHumidity.cluster_id, PowerConfigurationCluster.cluster_id, AnalogInput.cluster_id, ], OUTPUT_CLUSTERS: [Ota.cluster_id], } }, } replacement = { NODE_DESCRIPTOR: NodeDescriptor(0x02, 0x40, 0x80, 0x115F, 0x7F, 0x0064, 0x2C00, 0x0064, 0x00), ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, INPUT_CLUSTERS: [ BasicCluster, Identify.cluster_id, TemperatureMeasurementCluster, PowerConfigurationCluster, RelativeHumidityCluster, AnalogInputCluster, EmulatedTVOCMeasurement, XiaomiAqaraE1Cluster, ], OUTPUT_CLUSTERS: [Ota.cluster_id], } }, }
class ZemismartTempHumidity(CustomDevice): """Custom device representing Zemismart temp and humidity sensors.""" signature = { # <SimpleDescriptor endpoint=1 profile=260 device_type=770 # device_version=1 # input_clusters=[0, 1, 3, 1029, 1026, 61183] # output_clusters=[3, 25]> MODELS_INFO: [("_TZ3000_lfa05ajd", "TS0201")], ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, INPUT_CLUSTERS: [ Basic.cluster_id, PowerConfiguration.cluster_id, Identify.cluster_id, RelativeHumidity.cluster_id, TemperatureMeasurement.cluster_id, 0xEEFF, # Unknown ], OUTPUT_CLUSTERS: [Identify.cluster_id, Ota.cluster_id], } }, } replacement = { NODE_DESCRIPTOR: NodeDescriptor( 0x02, 0x40, 0x80, 0x1037, 0x7F, 0x0064, 0x2C00, 0x0064, 0x00, # Forcing capability 0x80 instead of 0x84 so AC Power = false ), ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, INPUT_CLUSTERS: [ Basic.cluster_id, PowerConfiguration.cluster_id, Identify.cluster_id, RelativeHumidity.cluster_id, TemperatureMeasurement.cluster_id, ], OUTPUT_CLUSTERS: [Identify.cluster_id, Ota.cluster_id], } }, }
def __init__(self, ieee, manufacturer, model): """Init fake device.""" self._application = APPLICATION self.ieee = convert_ieee(ieee) self.nwk = 0xb79c self.zdo = Mock() self.endpoints = {0: self.zdo} self.lqi = 255 self.rssi = 8 self.last_seen = time.time() self.status = 2 self.initializing = False self.manufacturer = manufacturer self.model = model from zigpy.zdo.types import NodeDescriptor self.node_desc = NodeDescriptor()
class Illumination(XiaomiCustomDevice): """Aqara LUMI lumi.sen_ill.mgl01.""" signature = { # <SimpleDescriptor endpoint=1 profile=260 device_type=262 # device_version=1 # input_clusters=[0, 1024, 3, 1] # output_clusters=[3]> MODELS_INFO: [(LUMI, "lumi.sen_ill.mgl01"), ("XIAOMI", "lumi.sen_ill.mgl01")], ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.LIGHT_SENSOR, INPUT_CLUSTERS: [ Basic.cluster_id, Identify.cluster_id, IlluminanceMeasurement.cluster_id, PowerConfigurationCluster.cluster_id, ], OUTPUT_CLUSTERS: [Identify.cluster_id], } }, } replacement = { NODE_DESCRIPTOR: NodeDescriptor(0x02, 0x40, 0x80, 0x115F, 0x7F, 0x0064, 0x2C00, 0x0064, 0x00), ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.LIGHT_SENSOR, INPUT_CLUSTERS: [ BasicCluster, Identify.cluster_id, IlluminanceMeasurement.cluster_id, PowerConfigurationCluster, ], OUTPUT_CLUSTERS: [Identify.cluster_id], } }, }
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.node_desc = NodeDescriptor(0x01, 0x40, 0x8E, 0x101E, 0x52, 0x00FF, 0x2C00, 0x00FF, 0x00)
class RemoteB486OPCN01V2(XiaomiCustomDevice): """Aqara Opple 4 button remote device.""" signature = { # <SimpleDescriptor endpoint=1 profile=260 device_type=261 # device_version=1 # input_clusters=[0, 3, 1] # output_clusters=[3, 6, 8, 768]> MODELS_INFO: [(LUMI, "lumi.remote.b486opcn01")], ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.COLOR_DIMMER_SWITCH, INPUT_CLUSTERS: [ Basic.cluster_id, Identify.cluster_id, PowerConfigurationCluster.cluster_id, ], OUTPUT_CLUSTERS: [ Identify.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, ], } }, } replacement = { NODE_DESCRIPTOR: NodeDescriptor(0x02, 0x40, 0x80, 0x115F, 0x7F, 0x0064, 0x2C00, 0x0064, 0x00), ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.COLOR_DIMMER_SWITCH, INPUT_CLUSTERS: [ BasicCluster, Identify.cluster_id, PowerConfigurationCluster, OppleCluster, MultistateInputCluster, ], OUTPUT_CLUSTERS: [ Identify.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, ], }, 2: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, INPUT_CLUSTERS: [Identify.cluster_id, MultistateInputCluster], OUTPUT_CLUSTERS: [Identify.cluster_id, OnOff.cluster_id], }, 3: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, INPUT_CLUSTERS: [MultistateInputCluster], OUTPUT_CLUSTERS: [], }, 4: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, INPUT_CLUSTERS: [MultistateInputCluster], OUTPUT_CLUSTERS: [], }, }, } device_automation_triggers = RemoteB486OPCN01.device_automation_triggers
class RemoteB686OPCN01(XiaomiCustomDevice): """Aqara Opple 6 button remote device.""" signature = { # <SimpleDescriptor endpoint=1 profile=260 device_type=261 # device_version=1 # input_clusters=[0, 3, 1] # output_clusters=[3, 6, 8, 768]> MODELS_INFO: [(LUMI, "lumi.remote.b686opcn01")], ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.COLOR_DIMMER_SWITCH, INPUT_CLUSTERS: [ Basic.cluster_id, Identify.cluster_id, PowerConfigurationCluster.cluster_id, ], OUTPUT_CLUSTERS: [ Identify.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, ], }, # <SimpleDescriptor endpoint=2 profile=260 device_type=259 # device_version=1 # input_clusters=[3] # output_clusters=[6, 3]> 2: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, INPUT_CLUSTERS: [Identify.cluster_id], OUTPUT_CLUSTERS: [Identify.cluster_id, OnOff.cluster_id], }, 3: {}, 4: {}, 5: {}, 6: {}, }, } replacement = { NODE_DESCRIPTOR: NodeDescriptor(0x02, 0x40, 0x80, 0x115F, 0x7F, 0x0064, 0x2C00, 0x0064, 0x00), ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.COLOR_DIMMER_SWITCH, INPUT_CLUSTERS: [ BasicCluster, Identify.cluster_id, PowerConfigurationCluster, OppleCluster, MultistateInputCluster, ], OUTPUT_CLUSTERS: [ Identify.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, ], }, 2: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, INPUT_CLUSTERS: [Identify.cluster_id, MultistateInputCluster], OUTPUT_CLUSTERS: [Identify.cluster_id, OnOff.cluster_id], }, 3: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, INPUT_CLUSTERS: [MultistateInputCluster], OUTPUT_CLUSTERS: [], }, 4: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, INPUT_CLUSTERS: [MultistateInputCluster], OUTPUT_CLUSTERS: [], }, 5: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, INPUT_CLUSTERS: [MultistateInputCluster], OUTPUT_CLUSTERS: [], }, 6: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, INPUT_CLUSTERS: [MultistateInputCluster], OUTPUT_CLUSTERS: [], }, }, } device_automation_triggers = { (SHORT_PRESS, BUTTON_1): { COMMAND: COMMAND_OFF, ENDPOINT_ID: 1 }, (SHORT_PRESS, BUTTON_2): { COMMAND: COMMAND_ON, ENDPOINT_ID: 1 }, (SHORT_PRESS, BUTTON_3): { COMMAND: COMMAND_STEP, ENDPOINT_ID: 1, ARGS: [1, 85, 7], }, (LONG_PRESS, BUTTON_3): { COMMAND: COMMAND_MOVE, ENDPOINT_ID: 1, ARGS: [1, 15] }, (SHORT_PRESS, BUTTON_4): { COMMAND: COMMAND_STEP, ENDPOINT_ID: 1, ARGS: [0, 85, 7], }, (LONG_PRESS, BUTTON_4): { COMMAND: COMMAND_MOVE, ENDPOINT_ID: 1, ARGS: [0, 15] }, (SHORT_PRESS, BUTTON_5): { COMMAND: COMMAND_STEP_COLOR_TEMP, ENDPOINT_ID: 1, ARGS: [1, 69, 7, 0, 0], }, (LONG_PRESS, BUTTON_5): { COMMAND: COMMAND_MOVE_COLOR_TEMP, ENDPOINT_ID: 1, ARGS: [1, 15, 0, 0], }, (SHORT_PRESS, BUTTON_6): { COMMAND: COMMAND_STEP_COLOR_TEMP, ENDPOINT_ID: 1, ARGS: [3, 69, 7, 0, 0], }, (LONG_PRESS, BUTTON_6): { COMMAND: COMMAND_MOVE_COLOR_TEMP, ENDPOINT_ID: 1, ARGS: [3, 15, 0, 0], }, (ALT_SHORT_PRESS, BUTTON_1): { COMMAND: COMMAND_1_SINGLE }, (ALT_DOUBLE_PRESS, BUTTON_1): { COMMAND: COMMAND_1_DOUBLE }, (TRIPLE_PRESS, BUTTON_1): { COMMAND: COMMAND_1_TRIPLE }, (ALT_LONG_PRESS, BUTTON_1): { COMMAND: COMMAND_1_HOLD }, (LONG_RELEASE, BUTTON_1): { COMMAND: COMMAND_1_RELEASE }, (ALT_SHORT_PRESS, BUTTON_2): { COMMAND: COMMAND_2_SINGLE }, (ALT_DOUBLE_PRESS, BUTTON_2): { COMMAND: COMMAND_2_DOUBLE }, (TRIPLE_PRESS, BUTTON_2): { COMMAND: COMMAND_2_TRIPLE }, (ALT_LONG_PRESS, BUTTON_2): { COMMAND: COMMAND_2_HOLD }, (LONG_RELEASE, BUTTON_2): { COMMAND: COMMAND_2_RELEASE }, (ALT_SHORT_PRESS, BUTTON_3): { COMMAND: COMMAND_3_SINGLE }, (ALT_DOUBLE_PRESS, BUTTON_3): { COMMAND: COMMAND_3_DOUBLE }, (TRIPLE_PRESS, BUTTON_3): { COMMAND: COMMAND_3_TRIPLE }, (ALT_LONG_PRESS, BUTTON_3): { COMMAND: COMMAND_3_HOLD }, (LONG_RELEASE, BUTTON_3): { COMMAND: COMMAND_3_RELEASE }, (ALT_SHORT_PRESS, BUTTON_4): { COMMAND: COMMAND_4_SINGLE }, (ALT_DOUBLE_PRESS, BUTTON_4): { COMMAND: COMMAND_4_DOUBLE }, (TRIPLE_PRESS, BUTTON_4): { COMMAND: COMMAND_4_TRIPLE }, (ALT_LONG_PRESS, BUTTON_4): { COMMAND: COMMAND_4_HOLD }, (LONG_RELEASE, BUTTON_4): { COMMAND: COMMAND_4_RELEASE }, (ALT_SHORT_PRESS, BUTTON_5): { COMMAND: COMMAND_5_SINGLE }, (ALT_DOUBLE_PRESS, BUTTON_5): { COMMAND: COMMAND_5_DOUBLE }, (TRIPLE_PRESS, BUTTON_5): { COMMAND: COMMAND_5_TRIPLE }, (ALT_LONG_PRESS, BUTTON_5): { COMMAND: COMMAND_5_HOLD }, (LONG_RELEASE, BUTTON_5): { COMMAND: COMMAND_5_RELEASE }, (ALT_SHORT_PRESS, BUTTON_6): { COMMAND: COMMAND_6_SINGLE }, (ALT_DOUBLE_PRESS, BUTTON_6): { COMMAND: COMMAND_6_DOUBLE }, (TRIPLE_PRESS, BUTTON_6): { COMMAND: COMMAND_6_TRIPLE }, (ALT_LONG_PRESS, BUTTON_6): { COMMAND: COMMAND_6_HOLD }, (LONG_RELEASE, BUTTON_6): { COMMAND: COMMAND_6_RELEASE }, }
CONSUMPTION_REPORTED = "consumption_reported" VOLTAGE_REPORTED = "voltage_reported" ILLUMINANCE_MEASUREMENT = "illuminance_measurement" ILLUMINANCE_REPORTED = "illuminance_reported" XIAOMI_AQARA_ATTRIBUTE = 0xFF01 XIAOMI_ATTR_3 = "X-attrib-3" XIAOMI_ATTR_4 = "X-attrib-4" XIAOMI_ATTR_5 = "X-attrib-5" XIAOMI_ATTR_6 = "X-attrib-6" XIAOMI_MIJA_ATTRIBUTE = 0xFF02 XIAOMI_NODE_DESC = NodeDescriptor( byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4151, maximum_buffer_size=127, maximum_incoming_transfer_size=100, server_mask=0, maximum_outgoing_transfer_size=100, descriptor_capability_field=0, ) ZONE_TYPE = 0x0001 _LOGGER = logging.getLogger(__name__) class XiaomiCustomDevice(CustomDevice): """Custom device representing xiaomi devices.""" def __init__(self, *args, **kwargs): """Init.""" self.battery_bus = Bus()