Skip to content

Commit

Permalink
Add device automation triggers for Icasa wall-mount remotes (zigpy#2693)
Browse files Browse the repository at this point in the history
Quirk for icasa wall mounted Zigbee remotes ICZB-KPD12, ICZB-KPD14S and ICZB-KPD18S.
Remotes are mentioned here: zigpy#503

ICZB-KPD12: This remote has ON and OFF buttons (hold for dimming up/down)
ICZB-KPD14S: This remote has ON and OFF buttons (hold for dimming up/down) and 2 SCENE buttons (hold for storing, push to recall).
ICZB-KPD18S: This remote has ON and OFF buttons (hold for dimming up/down) and 6 SCENE buttons (hold for storing, push to recall).
  • Loading branch information
Emrvb authored Nov 13, 2023
1 parent b85b04d commit fb79432
Show file tree
Hide file tree
Showing 5 changed files with 489 additions and 0 deletions.
2 changes: 2 additions & 0 deletions zhaquirks/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
COMMAND_ON = "on"
COMMAND_PRESS = "press"
COMMAND_QUAD = "quadruple"
COMMAND_RECALL = "recall"
COMMAND_RELEASE = "release"
COMMAND_SHAKE = "shake"
COMMAND_SINGLE = "single"
Expand All @@ -66,6 +67,7 @@
COMMAND_STOP = "stop"
COMMAND_STOP_MOVE_STEP = "stop_move_step"
COMMAND_STOP_ON_OFF = "stop_with_on_off"
COMMAND_STORE = "store"
COMMAND_TILT = "Tilt"
COMMAND_TOGGLE = "toggle"
COMMAND_TRIPLE = "triple"
Expand Down
1 change: 1 addition & 0 deletions zhaquirks/icasa/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Module for icasa devices."""
126 changes: 126 additions & 0 deletions zhaquirks/icasa/iczb_kpd12.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
"""icasa KPD12 device."""
from zigpy.profiles import zha
from zigpy.quirks import CustomDevice
from zigpy.zcl.clusters.general import (
Basic,
Groups,
Identify,
LevelControl,
OnOff,
Ota,
PowerConfiguration,
Scenes,
)
from zigpy.zcl.clusters.homeautomation import Diagnostic
from zigpy.zcl.clusters.lighting import Color
from zigpy.zcl.clusters.lightlink import LightLink

from zhaquirks.const import (
BUTTON,
CLUSTER_ID,
COMMAND,
COMMAND_MOVE_ON_OFF,
COMMAND_OFF,
COMMAND_ON,
COMMAND_STOP,
DEVICE_TYPE,
DIM_DOWN,
DIM_UP,
ENDPOINT_ID,
ENDPOINTS,
INPUT_CLUSTERS,
LONG_PRESS,
LONG_RELEASE,
MODELS_INFO,
OUTPUT_CLUSTERS,
PARAMS,
PROFILE_ID,
SHORT_PRESS,
TURN_OFF,
TURN_ON,
)


class IcasaKPD12(CustomDevice):
"""icasa KPD12 device (looks like a white label Sunricher)."""

signature = {
MODELS_INFO: [("icasa", "ICZB-KPD12")],
ENDPOINTS: {
1: {
PROFILE_ID: zha.PROFILE_ID,
DEVICE_TYPE: zha.DeviceType.LEVEL_CONTROL_SWITCH,
INPUT_CLUSTERS: [
Basic.cluster_id,
PowerConfiguration.cluster_id,
Identify.cluster_id,
Diagnostic.cluster_id,
],
OUTPUT_CLUSTERS: [
Identify.cluster_id,
Groups.cluster_id,
Scenes.cluster_id,
OnOff.cluster_id,
LevelControl.cluster_id,
Ota.cluster_id,
Color.cluster_id,
LightLink.cluster_id,
],
}
},
}

replacement = {
ENDPOINTS: {
1: {
PROFILE_ID: zha.PROFILE_ID,
DEVICE_TYPE: zha.DeviceType.LEVEL_CONTROL_SWITCH,
INPUT_CLUSTERS: [
Basic.cluster_id,
PowerConfiguration.cluster_id,
Identify.cluster_id,
Diagnostic.cluster_id,
],
OUTPUT_CLUSTERS: [
Identify.cluster_id,
Groups.cluster_id,
Scenes.cluster_id,
OnOff.cluster_id,
LevelControl.cluster_id,
Ota.cluster_id,
Color.cluster_id,
LightLink.cluster_id,
],
}
}
}

device_automation_triggers = {
(SHORT_PRESS, TURN_ON): {
COMMAND: COMMAND_ON,
ENDPOINT_ID: 1,
CLUSTER_ID: 6,
},
(LONG_PRESS, DIM_UP): {
COMMAND: COMMAND_MOVE_ON_OFF,
ENDPOINT_ID: 1,
CLUSTER_ID: 8,
PARAMS: {"move_mode": 0, "rate": 50},
},
(LONG_RELEASE, BUTTON): {
COMMAND: COMMAND_STOP,
ENDPOINT_ID: 1,
CLUSTER_ID: 8,
},
(SHORT_PRESS, TURN_OFF): {
COMMAND: COMMAND_OFF,
ENDPOINT_ID: 1,
CLUSTER_ID: 6,
},
(LONG_PRESS, DIM_DOWN): {
COMMAND: COMMAND_MOVE_ON_OFF,
ENDPOINT_ID: 1,
CLUSTER_ID: 8,
PARAMS: {"move_mode": 1, "rate": 50},
},
}
154 changes: 154 additions & 0 deletions zhaquirks/icasa/iczb_kpd14s.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
"""icasa KPD14S device."""
from zigpy.profiles import zha
from zigpy.quirks import CustomDevice
from zigpy.zcl.clusters.general import (
Basic,
Groups,
Identify,
LevelControl,
OnOff,
Ota,
PowerConfiguration,
Scenes,
)
from zigpy.zcl.clusters.homeautomation import Diagnostic
from zigpy.zcl.clusters.lighting import Color
from zigpy.zcl.clusters.lightlink import LightLink

from zhaquirks.const import (
BUTTON,
BUTTON_1,
BUTTON_2,
CLUSTER_ID,
COMMAND,
COMMAND_MOVE_ON_OFF,
COMMAND_OFF,
COMMAND_ON,
COMMAND_RECALL,
COMMAND_STOP,
COMMAND_STORE,
DEVICE_TYPE,
DIM_DOWN,
DIM_UP,
ENDPOINT_ID,
ENDPOINTS,
INPUT_CLUSTERS,
LONG_PRESS,
LONG_RELEASE,
MODELS_INFO,
OUTPUT_CLUSTERS,
PARAMS,
PROFILE_ID,
SHORT_PRESS,
TURN_OFF,
TURN_ON,
)


class IcasaKPD14S(CustomDevice):
"""icasa KPD14S device (looks like a white label Sunricher)."""

signature = {
MODELS_INFO: [("icasa", "ICZB-KPD14S")],
ENDPOINTS: {
1: {
PROFILE_ID: zha.PROFILE_ID,
DEVICE_TYPE: zha.DeviceType.LEVEL_CONTROL_SWITCH,
INPUT_CLUSTERS: [
Basic.cluster_id,
PowerConfiguration.cluster_id,
Identify.cluster_id,
Diagnostic.cluster_id,
],
OUTPUT_CLUSTERS: [
Identify.cluster_id,
Groups.cluster_id,
Scenes.cluster_id,
OnOff.cluster_id,
LevelControl.cluster_id,
Ota.cluster_id,
Color.cluster_id,
LightLink.cluster_id,
],
}
},
}

replacement = {
ENDPOINTS: {
1: {
PROFILE_ID: zha.PROFILE_ID,
DEVICE_TYPE: zha.DeviceType.LEVEL_CONTROL_SWITCH,
INPUT_CLUSTERS: [
Basic.cluster_id,
PowerConfiguration.cluster_id,
Identify.cluster_id,
Diagnostic.cluster_id,
],
OUTPUT_CLUSTERS: [
Identify.cluster_id,
Groups.cluster_id,
Scenes.cluster_id,
OnOff.cluster_id,
LevelControl.cluster_id,
Ota.cluster_id,
Color.cluster_id,
LightLink.cluster_id,
],
}
}
}

device_automation_triggers = {
(SHORT_PRESS, TURN_ON): {
COMMAND: COMMAND_ON,
ENDPOINT_ID: 1,
CLUSTER_ID: 6,
},
(LONG_PRESS, DIM_UP): {
COMMAND: COMMAND_MOVE_ON_OFF,
ENDPOINT_ID: 1,
CLUSTER_ID: 8,
PARAMS: {"move_mode": 0, "rate": 50},
},
(LONG_RELEASE, BUTTON): {
COMMAND: COMMAND_STOP,
ENDPOINT_ID: 1,
CLUSTER_ID: 8,
},
(SHORT_PRESS, TURN_OFF): {
COMMAND: COMMAND_OFF,
ENDPOINT_ID: 1,
CLUSTER_ID: 6,
},
(LONG_PRESS, DIM_DOWN): {
COMMAND: COMMAND_MOVE_ON_OFF,
ENDPOINT_ID: 1,
CLUSTER_ID: 8,
PARAMS: {"move_mode": 1, "rate": 50},
},
(SHORT_PRESS, BUTTON_1): {
COMMAND: COMMAND_RECALL,
ENDPOINT_ID: 1,
CLUSTER_ID: 5,
PARAMS: {"group_id": 0, "scene_id": 1},
},
(SHORT_PRESS, BUTTON_2): {
COMMAND: COMMAND_RECALL,
ENDPOINT_ID: 1,
CLUSTER_ID: 5,
PARAMS: {"group_id": 0, "scene_id": 2},
},
(LONG_PRESS, BUTTON_1): {
COMMAND: COMMAND_STORE,
ENDPOINT_ID: 1,
CLUSTER_ID: 5,
PARAMS: {"group_id": 0, "scene_id": 1},
},
(LONG_PRESS, BUTTON_2): {
COMMAND: COMMAND_STORE,
ENDPOINT_ID: 1,
CLUSTER_ID: 5,
PARAMS: {"group_id": 0, "scene_id": 2},
},
}
Loading

0 comments on commit fb79432

Please sign in to comment.