diff --git a/zhaquirks/const.py b/zhaquirks/const.py index aa24202f20..55d831ba59 100644 --- a/zhaquirks/const.py +++ b/zhaquirks/const.py @@ -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" @@ -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" diff --git a/zhaquirks/icasa/__init__.py b/zhaquirks/icasa/__init__.py new file mode 100644 index 0000000000..3dad5e28d5 --- /dev/null +++ b/zhaquirks/icasa/__init__.py @@ -0,0 +1 @@ +"""Module for icasa devices.""" diff --git a/zhaquirks/icasa/iczb_kpd12.py b/zhaquirks/icasa/iczb_kpd12.py new file mode 100644 index 0000000000..02066752fe --- /dev/null +++ b/zhaquirks/icasa/iczb_kpd12.py @@ -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}, + }, + } diff --git a/zhaquirks/icasa/iczb_kpd14s.py b/zhaquirks/icasa/iczb_kpd14s.py new file mode 100644 index 0000000000..4a3bf60291 --- /dev/null +++ b/zhaquirks/icasa/iczb_kpd14s.py @@ -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}, + }, + } diff --git a/zhaquirks/icasa/iczb_kpd18s.py b/zhaquirks/icasa/iczb_kpd18s.py new file mode 100644 index 0000000000..e695d25104 --- /dev/null +++ b/zhaquirks/icasa/iczb_kpd18s.py @@ -0,0 +1,206 @@ +"""icasa KPD18S 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, + BUTTON_3, + BUTTON_4, + BUTTON_5, + BUTTON_6, + 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 IcasaKPD18S(CustomDevice): + """icasa KPD18S device (looks like a white label Sunricher).""" + + signature = { + MODELS_INFO: [("icasa", "ICZB-KPD18S")], + 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}, + }, + (SHORT_PRESS, BUTTON_3): { + COMMAND: COMMAND_RECALL, + ENDPOINT_ID: 1, + CLUSTER_ID: 5, + PARAMS: {"group_id": 0, "scene_id": 3}, + }, + (SHORT_PRESS, BUTTON_4): { + COMMAND: COMMAND_RECALL, + ENDPOINT_ID: 1, + CLUSTER_ID: 5, + PARAMS: {"group_id": 0, "scene_id": 4}, + }, + (SHORT_PRESS, BUTTON_5): { + COMMAND: COMMAND_RECALL, + ENDPOINT_ID: 1, + CLUSTER_ID: 5, + PARAMS: {"group_id": 0, "scene_id": 5}, + }, + (SHORT_PRESS, BUTTON_6): { + COMMAND: COMMAND_RECALL, + ENDPOINT_ID: 1, + CLUSTER_ID: 5, + PARAMS: {"group_id": 0, "scene_id": 6}, + }, + (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}, + }, + (LONG_PRESS, BUTTON_3): { + COMMAND: COMMAND_STORE, + ENDPOINT_ID: 1, + CLUSTER_ID: 5, + PARAMS: {"group_id": 0, "scene_id": 3}, + }, + (LONG_PRESS, BUTTON_4): { + COMMAND: COMMAND_STORE, + ENDPOINT_ID: 1, + CLUSTER_ID: 5, + PARAMS: {"group_id": 0, "scene_id": 4}, + }, + (LONG_PRESS, BUTTON_5): { + COMMAND: COMMAND_STORE, + ENDPOINT_ID: 1, + CLUSTER_ID: 5, + PARAMS: {"group_id": 0, "scene_id": 5}, + }, + (LONG_PRESS, BUTTON_6): { + COMMAND: COMMAND_STORE, + ENDPOINT_ID: 1, + CLUSTER_ID: 5, + PARAMS: {"group_id": 0, "scene_id": 6}, + }, + }