Created
January 3, 2026 21:17
-
-
Save Nullcaller/746f3a44ff694043c1141a84e66c4483 to your computer and use it in GitHub Desktop.
ZHA quirk for Yandex devices
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ZHA qurik for Yandex devices.""" | |
| from __future__ import annotations | |
| from typing import Final | |
| from zigpy.quirks import CustomCluster | |
| import zigpy.types as t | |
| from zigpy.zcl.foundation import ( | |
| BaseAttributeDefs, | |
| BaseCommandDefs, | |
| Direction, | |
| ZCLAttributeDef, | |
| ZCLCommandDef, | |
| ) | |
| from zigpy.profiles import zgp, zha | |
| from zigpy.quirks import CustomDevice | |
| from zigpy.zcl.clusters.general import ( | |
| Basic, | |
| GreenPowerProxy, | |
| Groups, | |
| Identify, | |
| LevelControl, | |
| OnOff, | |
| Ota, | |
| PowerConfiguration, | |
| Scenes, | |
| ) | |
| from zigpy.zcl.clusters.closures import ( | |
| ConfigStatus, | |
| WindowCovering, | |
| WindowCoveringMode, | |
| WindowCoveringType, | |
| ) | |
| from zigpy.zcl.clusters.homeautomation import ( | |
| Diagnostic, | |
| ) | |
| from zhaquirks.const import ( | |
| CLUSTER_ID, | |
| COMMAND, | |
| COMMAND_OFF, | |
| COMMAND_ON, | |
| COMMAND_TOGGLE, | |
| DEVICE_TYPE, | |
| DOUBLE_PRESS, | |
| ENDPOINT_ID, | |
| ENDPOINTS, | |
| INPUT_CLUSTERS, | |
| LONG_PRESS, | |
| MODELS_INFO, | |
| OUTPUT_CLUSTERS, | |
| PROFILE_ID, | |
| SHORT_PRESS, | |
| ) | |
| ### CONSTANTS ### | |
| YANDEX = "Yandex" | |
| YANDEX_CLUSTER_ID = 0xFC03 | |
| YANDEX_MANUFACTURER_CODE = 0x140A | |
| ### TYPES ### | |
| class YandexType_SwitchMode(t.enum8): | |
| """Wired switches: gang mode.""" | |
| Control_Relay = 0x00 | |
| Up_Decoupled = 0x01 | |
| Decoupled = 0x02 | |
| Down_Decoupled = 0x03 | |
| class YandexType_SwitchType(t.enum8): | |
| """Relays: connected switch type.""" | |
| Rocker = 0x00 | |
| Button = 0x01 | |
| Decoupled = 0x02 | |
| class YandexType_PowerType(t.enum8): | |
| """Wired devices: power level.""" | |
| High = 0x00 | |
| Medium = 0x01 | |
| Low = 0x02 | |
| class YandexType_LedIndicator(t.basic.enum8): | |
| """Enable/disable LED indicator.""" | |
| Enabled = 0 | |
| Disabled = 1 | |
| class YandexType_Interlock(t.basic.enum8): | |
| """Double relay only: enable/disable interlock mode.""" | |
| Disabled = 0 | |
| Enabled = 1 | |
| class YandexType_ButtonMode(t.enum8): | |
| """Dimmer only: button presses interpretation.""" | |
| General = 0x00 | |
| Alternative = 0x01 | |
| ### ATTRIBUTE DEFINITIONS ### | |
| YANDEX_ATTRIBUTE_SWITCH_MODE = ZCLAttributeDef( | |
| id=0x0001, | |
| name="switch_mode", | |
| type=YandexType_SwitchMode, | |
| access="rw", | |
| ) | |
| YANDEX_ATTRIBUTE_SWITCH_TYPE = ZCLAttributeDef( | |
| id=0x0002, | |
| name="switch_type", | |
| type=YandexType_SwitchType, | |
| access="rw", | |
| ) | |
| YANDEX_ATTRIBUTE_POWER_TYPE = ZCLAttributeDef( | |
| id=0x0003, | |
| name="power_type", | |
| type=YandexType_PowerType, | |
| access="rw", | |
| ) | |
| YANDEX_ATTRIBUTE_LED_INDICATOR = ZCLAttributeDef( | |
| id=0x0005, | |
| name="led_indicator", | |
| type=YandexType_LedIndicator, | |
| access="rw", | |
| ) | |
| YANDEX_ATTRIBUTE_INTERLOCK = ZCLAttributeDef( | |
| id=0x0007, | |
| name="interlock", | |
| type=YandexType_Interlock, | |
| access="rw", | |
| ) | |
| YANDEX_ATTRIBUTE_BUTTON_MODE = ZCLAttributeDef( | |
| id=0x0008, | |
| name="button_mode", | |
| type=YandexType_ButtonMode, | |
| access="rw", | |
| ) | |
| ### COMMAND DEFINITIONS ### | |
| YANDEX_COMMAND_SWITCH_MODE = ZCLCommandDef( | |
| id=0x01, | |
| name="switch_mode", | |
| schema={"value": YandexType_SwitchMode}, | |
| direction=False, | |
| is_manufacturer_specific=True, | |
| ) | |
| YANDEX_COMMAND_SWITCH_TYPE = ZCLCommandDef( | |
| id=0x02, | |
| name="switch_type", | |
| schema={"value": YandexType_SwitchType}, | |
| direction=False, | |
| is_manufacturer_specific=True, | |
| ) | |
| YANDEX_COMMAND_POWER_TYPE = ZCLCommandDef( | |
| id=0x03, | |
| name="power_type", | |
| schema={"value": YandexType_PowerType}, | |
| direction=False, | |
| is_manufacturer_specific=True, | |
| ) | |
| YANDEX_COMMAND_LED_INDICATOR = ZCLCommandDef( | |
| id=0x05, | |
| name="led_indicator", | |
| schema={"value": YandexType_LedIndicator}, | |
| direction=False, | |
| is_manufacturer_specific=True, | |
| ) | |
| YANDEX_COMMAND_INTERLOCK = ZCLCommandDef( | |
| id=0x07, | |
| name="interlock", | |
| schema={"value": YandexType_Interlock}, | |
| direction=False, | |
| is_manufacturer_specific=True, | |
| ) | |
| YANDEX_COMMAND_BUTTON_MODE = ZCLCommandDef( | |
| id=0x08, | |
| name="button_mode", | |
| schema={"value": YandexType_ButtonMode}, | |
| direction=False, | |
| is_manufacturer_specific=True, | |
| ) | |
| ### COMMON CLUSTERS ### | |
| class YandexCluster(CustomCluster): | |
| """Common Yandex manufacturer-specific cluster properties.""" | |
| cluster_id = YANDEX_CLUSTER_ID | |
| manufacturer_id_override = YANDEX_MANUFACTURER_CODE | |
| class YandexClusterFull(YandexCluster): | |
| """Complete Yandex manufacturer-specific cluster, with all commands and attributes.""" | |
| class AttributeDefs(BaseAttributeDefs): | |
| """Attribute definitions.""" | |
| switch_mode: Final = YANDEX_ATTRIBUTE_SWITCH_MODE | |
| switch_type: Final = YANDEX_ATTRIBUTE_SWITCH_TYPE | |
| power_type: Final = YANDEX_ATTRIBUTE_POWER_TYPE | |
| led_indicator: Final = YANDEX_ATTRIBUTE_LED_INDICATOR | |
| interlock: Final = YANDEX_ATTRIBUTE_INTERLOCK | |
| button_mode: Final = YANDEX_ATTRIBUTE_BUTTON_MODE | |
| class ServerCommandDefs(BaseCommandDefs): | |
| """Command definitions.""" | |
| switch_mode: Final = YANDEX_COMMAND_SWITCH_MODE | |
| switch_type: Final = YANDEX_COMMAND_SWITCH_TYPE | |
| power_type: Final = YANDEX_COMMAND_POWER_TYPE | |
| led_indicator: Final = YANDEX_COMMAND_LED_INDICATOR | |
| interlock: Final = YANDEX_COMMAND_INTERLOCK | |
| button_mode: Final = YANDEX_COMMAND_BUTTON_MODE | |
| ### YNDX-00530 DIMMER ### | |
| class YandexClusterDimmer(YandexCluster): | |
| """Cluster for dimmer.""" | |
| class AttributeDefs(BaseAttributeDefs): | |
| """Attribute definitions.""" | |
| led_indicator: Final = YANDEX_ATTRIBUTE_LED_INDICATOR | |
| button_mode: Final = YANDEX_ATTRIBUTE_BUTTON_MODE | |
| class ServerCommandDefs(BaseCommandDefs): | |
| """Command definitions.""" | |
| button_mode: Final = YANDEX_COMMAND_BUTTON_MODE | |
| class YandexDimmer(CustomDevice): | |
| """Dimmer.""" | |
| signature = { | |
| MODELS_INFO: [(YANDEX, "YNDX-00530")], | |
| ENDPOINTS: { | |
| # <SimpleDescriptor endpoint=1 profile=260 device_type=257 | |
| # device_version=0 | |
| # input_clusters=[0, 3, 4, 6, 8, 64515] | |
| # output_clusters=[25]> | |
| 1: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.DIMMABLE_LIGHT, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| Groups.cluster_id, | |
| Scenes.cluster_id, | |
| OnOff.cluster_id, | |
| LevelControl.cluster_id, | |
| YANDEX_CLUSTER_ID, | |
| ], | |
| OUTPUT_CLUSTERS: [Ota.cluster_id], | |
| }, | |
| # <SimpleDescriptor endpoint=242 profile=41440 device_type=97 | |
| # device_version=0 | |
| # input_clusters=[] | |
| # output_clusters=[33]> | |
| 242: { | |
| PROFILE_ID: zgp.PROFILE_ID, | |
| DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, | |
| INPUT_CLUSTERS: [], | |
| OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id], | |
| }, | |
| }, | |
| } | |
| replacement = { | |
| ENDPOINTS: { | |
| 1: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.DIMMABLE_LIGHT, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| Groups.cluster_id, | |
| Scenes.cluster_id, | |
| OnOff.cluster_id, | |
| LevelControl.cluster_id, | |
| YandexClusterDimmer, | |
| ], | |
| OUTPUT_CLUSTERS: [Ota.cluster_id], | |
| }, | |
| 242: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, | |
| INPUT_CLUSTERS: [], | |
| OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id], | |
| }, | |
| }, | |
| } | |
| ### YNDX-00531 & YNDX-00532 SINGLE-GANG & DOUBLE-GANG WIRED SWITCHES ### | |
| YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_DOWN_ENDPOINT_ID = 2 | |
| YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_UP_ENDPOINT_ID = 3 | |
| YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_DOWN_NAME = "Button (Down)" | |
| YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_UP_NAME = "Button (Up)" | |
| YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_DOWN_ENDPOINT_ID = 3 | |
| YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_DOWN_ENDPOINT_ID = 4 | |
| YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_UP_ENDPOINT_ID = 5 | |
| YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_UP_ENDPOINT_ID = 6 | |
| YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_DOWN_NAME = "Button 1 (Down)" | |
| YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_DOWN_NAME = "Button 2 (Down)" | |
| YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_UP_NAME = "Button 1 (Up)" | |
| YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_UP_NAME = "Button 2 (Up)" | |
| class YandexClusterWiredSwitchMain(YandexCluster): | |
| """Main cluster for all wired Yandex switches.""" | |
| class AttributeDefs(BaseAttributeDefs): | |
| """Attribute definitions.""" | |
| switch_mode: Final = YANDEX_ATTRIBUTE_SWITCH_MODE | |
| power_type: Final = YANDEX_ATTRIBUTE_POWER_TYPE | |
| led_indicator: Final = YANDEX_ATTRIBUTE_LED_INDICATOR | |
| class ServerCommandDefs(BaseCommandDefs): | |
| """Command definitions.""" | |
| switch_mode: Final = YANDEX_COMMAND_SWITCH_MODE | |
| power_type: Final = YANDEX_COMMAND_POWER_TYPE | |
| class YandexClusterWiredSwitchSecondary(YandexCluster): | |
| """Secondary cluster for all wired Yandex switches.""" | |
| class AttributeDefs(BaseAttributeDefs): | |
| """Attribute definitions.""" | |
| switch_mode: Final = YANDEX_ATTRIBUTE_SWITCH_MODE | |
| class ServerCommandDefs(BaseCommandDefs): | |
| """Command definitions.""" | |
| switch_mode: Final = YANDEX_COMMAND_SWITCH_MODE | |
| class YandexSingleGangWiredSwitch(CustomDevice): | |
| """Single-gang wired switch.""" | |
| signature = { | |
| MODELS_INFO: [(YANDEX, "YNDX-00531")], | |
| ENDPOINTS: { | |
| # <SimpleDescriptor endpoint=1 profile=260 device_type=256 | |
| # device_version=0 | |
| # input_clusters=[0, 3, 6, 64515] | |
| # output_clusters=[25]> | |
| 1: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| YANDEX_CLUSTER_ID, | |
| ], | |
| OUTPUT_CLUSTERS: [Ota.cluster_id], | |
| } | |
| }, | |
| } | |
| replacement = { | |
| ENDPOINTS: { | |
| 1: { | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| YandexClusterWiredSwitchMain, | |
| ], | |
| OUTPUT_CLUSTERS: [Ota.cluster_id], | |
| }, | |
| # Down | |
| YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_DOWN_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [Identify.cluster_id, OnOff.cluster_id], | |
| }, | |
| # Up | |
| YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_UP_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [Identify.cluster_id, OnOff.cluster_id], | |
| }, | |
| } | |
| } | |
| device_automation_triggers = { | |
| (SHORT_PRESS, YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_DOWN_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_DOWN_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_DOWN_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_DOWN_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_DOWN_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_DOWN_ENDPOINT_ID, | |
| }, | |
| (SHORT_PRESS, YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_UP_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_UP_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_UP_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_UP_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_UP_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_GANG_WIRED_SWITCH_BUTTON_UP_ENDPOINT_ID, | |
| }, | |
| } | |
| class YandexDoubleGangWiredSwitch(CustomDevice): | |
| """Double-gang wired switch.""" | |
| signature = { | |
| MODELS_INFO: [(YANDEX, "YNDX-00532")], | |
| ENDPOINTS: { | |
| # <SimpleDescriptor endpoint=1 profile=260 device_type=256 | |
| # device_version=0 | |
| # input_clusters=[0, 3, 6, 64515] | |
| # output_clusters=[25]> | |
| 1: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| YANDEX_CLUSTER_ID, | |
| ], | |
| OUTPUT_CLUSTERS: [Ota.cluster_id], | |
| }, | |
| # <SimpleDescriptor endpoint=2 profile=260 device_type=256 | |
| # device_version=0 | |
| # input_clusters=[0, 3, 6, 64515] | |
| # output_clusters=[]> | |
| 2: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| YANDEX_CLUSTER_ID, | |
| ], | |
| OUTPUT_CLUSTERS: [], | |
| }, | |
| }, | |
| } | |
| replacement = { | |
| ENDPOINTS: { | |
| 1: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| YandexClusterWiredSwitchMain, | |
| ], | |
| OUTPUT_CLUSTERS: [Ota.cluster_id], | |
| }, | |
| 2: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| YandexClusterWiredSwitchSecondary, | |
| ], | |
| OUTPUT_CLUSTERS: [Ota.cluster_id], | |
| }, | |
| # Button 1 Down | |
| YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_DOWN_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [Identify.cluster_id, OnOff.cluster_id], | |
| }, | |
| # Button 2 Down | |
| YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_DOWN_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [Identify.cluster_id, OnOff.cluster_id], | |
| }, | |
| # Button 1 Up | |
| YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_UP_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [Identify.cluster_id, OnOff.cluster_id], | |
| }, | |
| # Button 2 Up | |
| YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_UP_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [Identify.cluster_id, OnOff.cluster_id], | |
| }, | |
| } | |
| } | |
| device_automation_triggers = { | |
| (SHORT_PRESS, YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_DOWN_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_DOWN_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_DOWN_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_DOWN_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_DOWN_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_DOWN_ENDPOINT_ID, | |
| }, | |
| (SHORT_PRESS, YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_DOWN_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_DOWN_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_DOWN_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_DOWN_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_DOWN_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_DOWN_ENDPOINT_ID, | |
| }, | |
| (SHORT_PRESS, YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_UP_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_UP_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_UP_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_UP_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_UP_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_1_UP_ENDPOINT_ID, | |
| }, | |
| (SHORT_PRESS, YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_UP_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_UP_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_UP_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_UP_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_UP_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRED_SWITCH_BUTTON_2_UP_ENDPOINT_ID, | |
| }, | |
| } | |
| ### YNDX-00534 & YNDX-00535 SINGLE-GANG & DOUBLE-GANG WIRELESS SWITCHES ### | |
| YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_DOWN_ENDPOINT_ID = 1 | |
| YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_UP_ENDPOINT_ID = 2 | |
| YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_DOWN_NAME = "Button (Down)" | |
| YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_UP_NAME = "Button (Up)" | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_DOWN_ENDPOINT_ID = 1 | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_DOWN_ENDPOINT_ID = 2 | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_UP_ENDPOINT_ID = 3 | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_UP_ENDPOINT_ID = 4 | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_DOWN_NAME = "Button 1 (Down)" | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_DOWN_NAME = "Button 2 (Down)" | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_UP_NAME = "Button 1 (Up)" | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_UP_NAME = "Button 2 (Up)" | |
| class YandexSingleGangWirelessSwitch(CustomDevice): | |
| """Single-gang wireless switch.""" | |
| signature = { | |
| MODELS_INFO: [(YANDEX, "YNDX-00534")], | |
| ENDPOINTS: { | |
| # <SimpleDescriptor endpoint=1 profile=260 device_type=259 | |
| # device_version=0 | |
| # input_clusters=[0, 1, 3] | |
| # output_clusters=[3, 6, 25]> | |
| YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_DOWN_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| PowerConfiguration.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [ | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| Ota.cluster_id, | |
| ], | |
| }, | |
| # <SimpleDescriptor endpoint=2 profile=260 device_type=259 | |
| # device_version=0 | |
| # input_clusters=[0, 3] | |
| # output_clusters=[3, 6]> | |
| YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_UP_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [ | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| ], | |
| }, | |
| }, | |
| } | |
| replacement = { | |
| ENDPOINTS: { | |
| # Down | |
| YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_DOWN_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| PowerConfiguration.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [ | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| Ota.cluster_id, | |
| ], | |
| }, | |
| # Up | |
| YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_UP_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [ | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| ], | |
| }, | |
| } | |
| } | |
| device_automation_triggers = { | |
| (SHORT_PRESS, YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_DOWN_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_DOWN_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_DOWN_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_DOWN_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_DOWN_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_DOWN_ENDPOINT_ID, | |
| }, | |
| (SHORT_PRESS, YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_UP_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_UP_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_UP_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_UP_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_UP_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_GANG_WIRELESS_SWITCH_BUTTON_UP_ENDPOINT_ID, | |
| }, | |
| } | |
| class YandexDoubleGangWirelessSwitch(CustomDevice): | |
| """Double-gang wireless switch.""" | |
| signature = { | |
| MODELS_INFO: [(YANDEX, "YNDX-00535")], | |
| ENDPOINTS: { | |
| # <SimpleDescriptor endpoint=1 profile=260 device_type=259 | |
| # device_version=0 | |
| # input_clusters=[0, 1, 3] | |
| # output_clusters=[3, 6, 25]> | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_DOWN_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| PowerConfiguration.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [ | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| Ota.cluster_id, | |
| ], | |
| }, | |
| # <SimpleDescriptor endpoint=2 profile=260 device_type=259 | |
| # device_version=0 | |
| # input_clusters=[0, 3] | |
| # output_clusters=[3, 6]> | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_DOWN_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [ | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| ], | |
| }, | |
| # <SimpleDescriptor endpoint=3 profile=260 device_type=259 | |
| # device_version=0 | |
| # input_clusters=[0, 3] | |
| # output_clusters=[3, 6]> | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_UP_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [ | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| ], | |
| }, | |
| # <SimpleDescriptor endpoint=4 profile=260 device_type=259 | |
| # device_version=0 | |
| # input_clusters=[0, 3] | |
| # output_clusters=[3, 6]> | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_UP_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [ | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| ], | |
| }, | |
| }, | |
| } | |
| replacement = { | |
| ENDPOINTS: { | |
| # Button 1 Down | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_DOWN_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| PowerConfiguration.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [ | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| Ota.cluster_id, | |
| ], | |
| }, | |
| # Button 2 Down | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_DOWN_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [ | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| ], | |
| }, | |
| # Button 1 Up | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_UP_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [ | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| ], | |
| }, | |
| # Button 2 Up | |
| YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_UP_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [ | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| ], | |
| }, | |
| } | |
| } | |
| device_automation_triggers = { | |
| (SHORT_PRESS, YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_DOWN_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_DOWN_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_DOWN_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_DOWN_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_DOWN_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_DOWN_ENDPOINT_ID, | |
| }, | |
| (SHORT_PRESS, YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_DOWN_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_DOWN_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_DOWN_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_DOWN_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_DOWN_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_DOWN_ENDPOINT_ID, | |
| }, | |
| (SHORT_PRESS, YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_UP_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_UP_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_UP_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_UP_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_UP_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_1_UP_ENDPOINT_ID, | |
| }, | |
| (SHORT_PRESS, YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_UP_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_UP_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_UP_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_UP_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_UP_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_GANG_WIRELESS_SWITCH_BUTTON_2_UP_ENDPOINT_ID, | |
| }, | |
| } | |
| ### YNDX-00537 SINGLE RELAY ### | |
| YANDEX_SINGLE_RELAY_BUTTON_ENDPOINT_ID = 2 | |
| YANDEX_SINGLE_RELAY_BUTTON_NAME = "Button" | |
| YANDEX_DOUBLE_RELAY_BUTTON_1_ENDPOINT_ID = 3 | |
| YANDEX_DOUBLE_RELAY_BUTTON_2_ENDPOINT_ID = 4 | |
| YANDEX_DOUBLE_RELAY_BUTTON_1_NAME = "Button 1" | |
| YANDEX_DOUBLE_RELAY_BUTTON_2_NAME = "Button 2" | |
| class YandexClusterSingleRelay(YandexCluster): | |
| """Cluster for single relay.""" | |
| class AttributeDefs(BaseAttributeDefs): | |
| """Attribute definitions.""" | |
| switch_type: Final = YANDEX_ATTRIBUTE_SWITCH_TYPE | |
| power_type: Final = YANDEX_ATTRIBUTE_POWER_TYPE | |
| class ServerCommandDefs(BaseCommandDefs): | |
| """Command definitions.""" | |
| switch_type: Final = YANDEX_COMMAND_SWITCH_TYPE | |
| power_type: Final = YANDEX_COMMAND_POWER_TYPE | |
| class YandexSingleRelay(CustomDevice): | |
| """Single relay.""" | |
| signature = { | |
| MODELS_INFO: [(YANDEX, "YNDX-00537")], | |
| ENDPOINTS: { | |
| # <SimpleDescriptor endpoint=1 profile=260 device_type=256 | |
| # device_version=0 | |
| # input_clusters=[0, 3, 6, 64515] | |
| # output_clusters=[25]> | |
| 1: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| YANDEX_CLUSTER_ID, | |
| ], | |
| OUTPUT_CLUSTERS: [Ota.cluster_id], | |
| }, | |
| }, | |
| } | |
| replacement = { | |
| ENDPOINTS: { | |
| 1: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| YandexClusterSingleRelay, | |
| ], | |
| OUTPUT_CLUSTERS: [Ota.cluster_id], | |
| }, | |
| # Button (decoupled) | |
| YANDEX_SINGLE_RELAY_BUTTON_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [Identify.cluster_id, OnOff.cluster_id], | |
| }, | |
| }, | |
| } | |
| device_automation_triggers = { | |
| (SHORT_PRESS, YANDEX_SINGLE_RELAY_BUTTON_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_RELAY_BUTTON_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_SINGLE_RELAY_BUTTON_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_RELAY_BUTTON_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_SINGLE_RELAY_BUTTON_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_SINGLE_RELAY_BUTTON_ENDPOINT_ID, | |
| }, | |
| } | |
| ### YNDX-00538 DOUBLE RELAY ### | |
| class YandexClusterDoubleRelayMain(YandexCluster): | |
| """Main cluster for double relay.""" | |
| class AttributeDefs(BaseAttributeDefs): | |
| """Attribute definitions.""" | |
| switch_type: Final = YANDEX_ATTRIBUTE_SWITCH_TYPE | |
| power_type: Final = YANDEX_ATTRIBUTE_POWER_TYPE | |
| interlock: Final = YANDEX_ATTRIBUTE_INTERLOCK | |
| class ServerCommandDefs(BaseCommandDefs): | |
| """Command definitions.""" | |
| switch_type: Final = YANDEX_COMMAND_SWITCH_TYPE | |
| power_type: Final = YANDEX_COMMAND_POWER_TYPE | |
| interlock: Final = YANDEX_COMMAND_INTERLOCK | |
| class YandexClusterDoubleRelaySecondary(YandexCluster): | |
| """Secondary cluster for double relay.""" | |
| class AttributeDefs(BaseAttributeDefs): | |
| """Attribute definitions.""" | |
| switch_type: Final = YANDEX_ATTRIBUTE_SWITCH_TYPE | |
| class ServerCommandDefs(BaseCommandDefs): | |
| """Command definitions.""" | |
| switch_type: Final = YANDEX_COMMAND_SWITCH_TYPE | |
| class YandexDoubleRelay(CustomDevice): | |
| """Double relay.""" | |
| signature = { | |
| MODELS_INFO: [(YANDEX, "YNDX-00538")], | |
| ENDPOINTS: { | |
| # <SimpleDescriptor endpoint=1 profile=260 device_type=256 | |
| # device_version=0 | |
| # input_clusters=[0, 3, 6, 64515] | |
| # output_clusters=[25]> | |
| 1: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| YANDEX_CLUSTER_ID, | |
| ], | |
| OUTPUT_CLUSTERS: [Ota.cluster_id], | |
| }, | |
| # <SimpleDescriptor endpoint=2 profile=260 device_type=256 | |
| # device_version=0 | |
| # input_clusters=[0, 3, 6, 64515] | |
| # output_clusters=[]> | |
| 2: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| YANDEX_CLUSTER_ID, | |
| ], | |
| OUTPUT_CLUSTERS: [], | |
| }, | |
| }, | |
| } | |
| replacement = { | |
| ENDPOINTS: { | |
| 1: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| YandexClusterDoubleRelayMain, | |
| ], | |
| OUTPUT_CLUSTERS: [Ota.cluster_id], | |
| }, | |
| 2: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| OnOff.cluster_id, | |
| YandexClusterDoubleRelaySecondary, | |
| ], | |
| OUTPUT_CLUSTERS: [Ota.cluster_id], | |
| }, | |
| # Button 1 | |
| YANDEX_DOUBLE_RELAY_BUTTON_1_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [Identify.cluster_id, OnOff.cluster_id], | |
| }, | |
| # Button 2 | |
| YANDEX_DOUBLE_RELAY_BUTTON_2_ENDPOINT_ID: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT_SWITCH, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [Identify.cluster_id, OnOff.cluster_id], | |
| }, | |
| }, | |
| } | |
| device_automation_triggers = { | |
| (SHORT_PRESS, YANDEX_DOUBLE_RELAY_BUTTON_1_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_RELAY_BUTTON_1_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_DOUBLE_RELAY_BUTTON_1_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_RELAY_BUTTON_1_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_DOUBLE_RELAY_BUTTON_1_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_RELAY_BUTTON_1_ENDPOINT_ID, | |
| }, | |
| (SHORT_PRESS, YANDEX_DOUBLE_RELAY_BUTTON_2_NAME): { | |
| COMMAND: COMMAND_TOGGLE, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_RELAY_BUTTON_2_ENDPOINT_ID, | |
| }, | |
| (DOUBLE_PRESS, YANDEX_DOUBLE_RELAY_BUTTON_2_NAME): { | |
| COMMAND: COMMAND_ON, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_RELAY_BUTTON_2_ENDPOINT_ID, | |
| }, | |
| (LONG_PRESS, YANDEX_DOUBLE_RELAY_BUTTON_2_NAME): { | |
| COMMAND: COMMAND_OFF, | |
| CLUSTER_ID: OnOff.cluster_id, | |
| ENDPOINT_ID: YANDEX_DOUBLE_RELAY_BUTTON_2_ENDPOINT_ID, | |
| }, | |
| } | |
| class YandexWindowCovering(WindowCovering): | |
| cluster_id: Final[t.uint16_t] = 0x0102 | |
| name: Final = "Window Covering" | |
| ep_attribute: Final = "window_covering" | |
| class AttributeDefs(BaseAttributeDefs): | |
| # Window Covering Information | |
| window_covering_type: Final = ZCLAttributeDef( | |
| id=0x0000, type=WindowCoveringType, access="r", mandatory=True | |
| ) | |
| config_status: Final = ZCLAttributeDef( | |
| id=0x0007, type=ConfigStatus, access="r", mandatory=True | |
| ) | |
| # All subsequent attributes are mandatory if their control types are enabled | |
| current_position_lift_percentage: Final = ZCLAttributeDef( | |
| id=0x0008, type=t.uint8_t, access="rps" | |
| ) | |
| # Window Covering Settings | |
| installed_open_limit_lift: Final = ZCLAttributeDef( | |
| id=0x0010, type=t.uint16_t, access="r" | |
| ) | |
| installed_closed_limit_lift: Final = ZCLAttributeDef( | |
| id=0x0011, type=t.uint16_t, access="r" | |
| ) | |
| velocity_lift: Final = ZCLAttributeDef(id=0x0014, type=t.uint16_t, access="rw") | |
| window_covering_mode: Final = ZCLAttributeDef( | |
| id=0x0017, type=WindowCoveringMode, access="rw", mandatory=True | |
| ) | |
| class ServerCommandDefs(BaseCommandDefs): | |
| down_close: Final = ZCLCommandDef( | |
| id=0x00, schema={}, direction=Direction.Client_to_Server | |
| ) | |
| up_open: Final = ZCLCommandDef( | |
| id=0x01, schema={}, direction=Direction.Client_to_Server | |
| ) | |
| stop: Final = ZCLCommandDef( | |
| id=0x02, schema={}, direction=Direction.Client_to_Server | |
| ) | |
| go_to_lift_percentage: Final = ZCLCommandDef( | |
| id=0x05, | |
| schema={"percentage_lift_value": t.uint8_t}, | |
| direction=Direction.Client_to_Server, | |
| ) | |
| class YandexCurtainMotor(CustomDevice): | |
| """Yandex curtain motor.""" | |
| signature = { | |
| MODELS_INFO: [(YANDEX, "YNDX-00591")], | |
| ENDPOINTS: { | |
| # <SimpleDescriptor endpoint=1 profile=260 device_type=514 | |
| # device_version=0 | |
| # input_clusters=[0, 3, 4, 5, 258, 2821] | |
| # output_clusters=[3, 25]> | |
| 1: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.WINDOW_COVERING_DEVICE, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| Groups.cluster_id, | |
| Scenes.cluster_id, | |
| WindowCovering.cluster_id, | |
| Diagnostic.cluster_id, | |
| ], | |
| OUTPUT_CLUSTERS: [Identify.cluster_id, Ota.cluster_id], | |
| }, | |
| # <SimpleDescriptor endpoint=242 profile=41440 device_type=97 | |
| # device_version=0 | |
| # input_clusters=[] | |
| # output_clusters=[33]> | |
| 242: { | |
| PROFILE_ID: zgp.PROFILE_ID, | |
| DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, | |
| INPUT_CLUSTERS: [], | |
| OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id], | |
| }, | |
| }, | |
| } | |
| replacement = { | |
| ENDPOINTS: { | |
| 1: { | |
| PROFILE_ID: zha.PROFILE_ID, | |
| DEVICE_TYPE: zha.DeviceType.WINDOW_COVERING_DEVICE, | |
| INPUT_CLUSTERS: [ | |
| Basic.cluster_id, | |
| Identify.cluster_id, | |
| Groups.cluster_id, | |
| Scenes.cluster_id, | |
| YandexWindowCovering, | |
| 0x0B05, | |
| ], | |
| OUTPUT_CLUSTERS: [Identify.cluster_id, Ota.cluster_id], | |
| }, | |
| 242: { | |
| PROFILE_ID: zgp.PROFILE_ID, | |
| DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC, | |
| INPUT_CLUSTERS: [], | |
| OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id], | |
| }, | |
| }, | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment