Skip to content

Instantly share code, notes, and snippets.

@Nullcaller
Created January 3, 2026 21:17
Show Gist options
  • Select an option

  • Save Nullcaller/746f3a44ff694043c1141a84e66c4483 to your computer and use it in GitHub Desktop.

Select an option

Save Nullcaller/746f3a44ff694043c1141a84e66c4483 to your computer and use it in GitHub Desktop.
ZHA quirk for Yandex devices
"""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