Exemple #1
0
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],
            }
        },
    }
Exemple #3
0
 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()
Exemple #4
0
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],
            }
        },
    }
Exemple #5
0
 def __init__(self, *args, **kwargs):
     super().__init__(*args, **kwargs)
     self.node_desc = NodeDescriptor(0x01, 0x40, 0x8E, 0x101E, 0x52, 0x00FF,
                                     0x2C00, 0x00FF, 0x00)
Exemple #6
0
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
Exemple #7
0
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()