From 448973d9ffd72ed7cfe840e87ff1a32876f58a0f Mon Sep 17 00:00:00 2001 From: David Racine Date: Sun, 13 Oct 2024 04:51:23 -0400 Subject: [PATCH 1/3] zhaquirks SINOPE SW2500ZB: Added support for both press and release button events in order to properly support short and long press events. Also added the pressed button in the event arguments to simplify automations processing it. --- tests/test_sinope.py | 30 +++++++---- zhaquirks/sinope/__init__.py | 91 +++++++++++++++++++++++++++------- zhaquirks/sinope/light.py | 61 +++++++++++++++++------ zhaquirks/sinope/sensor.py | 3 +- zhaquirks/sinope/switch.py | 7 +-- zhaquirks/sinope/thermostat.py | 3 +- 6 files changed, 144 insertions(+), 51 deletions(-) diff --git a/tests/test_sinope.py b/tests/test_sinope.py index 0680d45163..3dd6a5221b 100644 --- a/tests/test_sinope.py +++ b/tests/test_sinope.py @@ -11,7 +11,14 @@ from tests.common import ClusterListener import zhaquirks -from zhaquirks.const import COMMAND_BUTTON_DOUBLE, COMMAND_BUTTON_HOLD +from zhaquirks.const import ( + COMMAND_M_INITIAL_PRESS, + COMMAND_M_LONG_RELEASE, + COMMAND_M_MULTI_PRESS_COMPLETE, + COMMAND_M_SHORT_RELEASE, + TURN_OFF, + TURN_ON, +) from zhaquirks.sinope import SINOPE_MANUFACTURER_CLUSTER_ID from zhaquirks.sinope.light import ( SinopeTechnologieslight, @@ -92,20 +99,22 @@ def _get_packet_data( @pytest.mark.parametrize("quirk", (SinopeTechnologieslight,)) @pytest.mark.parametrize( - "press_type,exp_event", + "press_type,button,exp_event", ( - (ButtonAction.Single_off, None), - (ButtonAction.Single_on, None), - (ButtonAction.Double_on, COMMAND_BUTTON_DOUBLE), - (ButtonAction.Double_off, COMMAND_BUTTON_DOUBLE), - (ButtonAction.Long_on, COMMAND_BUTTON_HOLD), - (ButtonAction.Long_off, COMMAND_BUTTON_HOLD), + (ButtonAction.Single_off, TURN_OFF, COMMAND_M_INITIAL_PRESS), + (ButtonAction.Single_on, TURN_ON, COMMAND_M_INITIAL_PRESS), + (ButtonAction.Single_release_off, TURN_OFF, COMMAND_M_SHORT_RELEASE), + (ButtonAction.Single_release_on, TURN_ON, COMMAND_M_SHORT_RELEASE), + (ButtonAction.Double_on, TURN_ON, COMMAND_M_MULTI_PRESS_COMPLETE), + (ButtonAction.Double_off, TURN_OFF, COMMAND_M_MULTI_PRESS_COMPLETE), + (ButtonAction.Long_on, TURN_ON, COMMAND_M_LONG_RELEASE), + (ButtonAction.Long_off, TURN_OFF, COMMAND_M_LONG_RELEASE), # Should gracefully handle broken actions. - (t.uint8_t(0x00), None), + (t.uint8_t(0x00), None, None), ), ) async def test_sinope_light_switch( - zigpy_device_from_quirk, quirk, press_type, exp_event + zigpy_device_from_quirk, quirk, press_type, button, exp_event ): """Test that button presses are sent as events.""" device: Device = zigpy_device_from_quirk(quirk) @@ -137,6 +146,7 @@ class Listener: { "attribute_id": 84, "attribute_name": "action_report", + "button": button, "value": press_type.value, }, ) diff --git a/zhaquirks/sinope/__init__.py b/zhaquirks/sinope/__init__.py index 1a2bffbb94..439b283217 100644 --- a/zhaquirks/sinope/__init__.py +++ b/zhaquirks/sinope/__init__.py @@ -7,15 +7,18 @@ ARGS, ATTRIBUTE_ID, ATTRIBUTE_NAME, + BUTTON, CLUSTER_ID, COMMAND, - COMMAND_BUTTON_DOUBLE, - COMMAND_BUTTON_HOLD, - COMMAND_BUTTON_SINGLE, + COMMAND_M_INITIAL_PRESS, + COMMAND_M_LONG_RELEASE, + COMMAND_M_MULTI_PRESS_COMPLETE, + COMMAND_M_SHORT_RELEASE, DOUBLE_PRESS, ENDPOINT_ID, - LONG_PRESS, + LONG_RELEASE, SHORT_PRESS, + SHORT_RELEASE, TURN_OFF, TURN_ON, VALUE, @@ -29,38 +32,90 @@ (SHORT_PRESS, TURN_ON): { ENDPOINT_ID: 1, CLUSTER_ID: 65281, - COMMAND: COMMAND_BUTTON_SINGLE, - ARGS: {ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, VALUE: 2}, + COMMAND: COMMAND_M_INITIAL_PRESS, + ARGS: { + ATTRIBUTE_ID: 84, + ATTRIBUTE_NAME: ATTRIBUTE_ACTION, + BUTTON: TURN_ON, + VALUE: 1, + }, }, (SHORT_PRESS, TURN_OFF): { ENDPOINT_ID: 1, CLUSTER_ID: 65281, - COMMAND: COMMAND_BUTTON_SINGLE, - ARGS: {ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, VALUE: 18}, + COMMAND: COMMAND_M_INITIAL_PRESS, + ARGS: { + ATTRIBUTE_ID: 84, + ATTRIBUTE_NAME: ATTRIBUTE_ACTION, + BUTTON: TURN_OFF, + VALUE: 17, + }, + }, + (SHORT_RELEASE, TURN_ON): { + ENDPOINT_ID: 1, + CLUSTER_ID: 65281, + COMMAND: COMMAND_M_SHORT_RELEASE, + ARGS: { + ATTRIBUTE_ID: 84, + ATTRIBUTE_NAME: ATTRIBUTE_ACTION, + BUTTON: TURN_ON, + VALUE: 2, + }, + }, + (SHORT_RELEASE, TURN_OFF): { + ENDPOINT_ID: 1, + CLUSTER_ID: 65281, + COMMAND: COMMAND_M_SHORT_RELEASE, + ARGS: { + ATTRIBUTE_ID: 84, + ATTRIBUTE_NAME: ATTRIBUTE_ACTION, + BUTTON: TURN_OFF, + VALUE: 18, + }, }, (DOUBLE_PRESS, TURN_ON): { ENDPOINT_ID: 1, CLUSTER_ID: 65281, - COMMAND: COMMAND_BUTTON_DOUBLE, - ARGS: {ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, VALUE: 4}, + COMMAND: COMMAND_M_MULTI_PRESS_COMPLETE, + ARGS: { + ATTRIBUTE_ID: 84, + ATTRIBUTE_NAME: ATTRIBUTE_ACTION, + BUTTON: TURN_ON, + VALUE: 4, + }, }, (DOUBLE_PRESS, TURN_OFF): { ENDPOINT_ID: 1, CLUSTER_ID: 65281, - COMMAND: COMMAND_BUTTON_DOUBLE, - ARGS: {ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, VALUE: 20}, + COMMAND: COMMAND_M_MULTI_PRESS_COMPLETE, + ARGS: { + ATTRIBUTE_ID: 84, + ATTRIBUTE_NAME: ATTRIBUTE_ACTION, + BUTTON: TURN_OFF, + VALUE: 20, + }, }, - (LONG_PRESS, TURN_ON): { + (LONG_RELEASE, TURN_ON): { ENDPOINT_ID: 1, CLUSTER_ID: 65281, - COMMAND: COMMAND_BUTTON_HOLD, - ARGS: {ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, VALUE: 3}, + COMMAND: COMMAND_M_LONG_RELEASE, + ARGS: { + ATTRIBUTE_ID: 84, + ATTRIBUTE_NAME: ATTRIBUTE_ACTION, + BUTTON: TURN_ON, + VALUE: 3, + }, }, - (LONG_PRESS, TURN_OFF): { + (LONG_RELEASE, TURN_OFF): { ENDPOINT_ID: 1, CLUSTER_ID: 65281, - COMMAND: COMMAND_BUTTON_HOLD, - ARGS: {ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, VALUE: 19}, + COMMAND: COMMAND_M_LONG_RELEASE, + ARGS: { + ATTRIBUTE_ID: 84, + ATTRIBUTE_NAME: ATTRIBUTE_ACTION, + BUTTON: TURN_OFF, + VALUE: 19, + }, }, } diff --git a/zhaquirks/sinope/light.py b/zhaquirks/sinope/light.py index a95d4b35a9..94b7acd729 100644 --- a/zhaquirks/sinope/light.py +++ b/zhaquirks/sinope/light.py @@ -29,18 +29,24 @@ from zhaquirks.const import ( ATTRIBUTE_ID, ATTRIBUTE_NAME, - COMMAND_BUTTON_DOUBLE, - COMMAND_BUTTON_HOLD, + BUTTON, + COMMAND_M_INITIAL_PRESS, + COMMAND_M_LONG_RELEASE, + COMMAND_M_MULTI_PRESS_COMPLETE, + COMMAND_M_SHORT_RELEASE, DEVICE_TYPE, ENDPOINTS, INPUT_CLUSTERS, MODELS_INFO, OUTPUT_CLUSTERS, PROFILE_ID, + TURN_OFF, + TURN_ON, VALUE, ZHA_SEND_EVENT, ) -from zhaquirks.sinope import ( + +from . import ( ATTRIBUTE_ACTION, LIGHT_DEVICE_TRIGGERS, SINOPE, @@ -192,28 +198,51 @@ def handle_cluster_general_request( ) value = attr.value.value + + action, button = self._get_command_from_action(self.Action(value)) + if not action or not button: + return + event_args = { ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, + BUTTON: button, VALUE: value.value, } - action = self._get_command_from_action(self.Action(value)) - if not action: - return + + self.debug( + "SINOPE ZHA_SEND_EVENT action: '%s' event_args: %s", + self.Action(value), + event_args, + ) + self.listener_event(ZHA_SEND_EVENT, action, event_args) - def _get_command_from_action(self, action: ButtonAction) -> str | None: - # const lookup = {2: 'up_single', 3: 'up_hold', 4: 'up_double', - # 18: 'down_single', 19: 'down_hold', 20: 'down_double'}; + def _get_command_from_action( + self, action: ButtonAction + ) -> tuple[str | None, str | None]: + # const lookup = {1: 'up_single', 2: 'up_single_released', 3: 'up_hold', 4: 'up_double', + # 17: 'down_single, 18: 'down_single_released', 19: 'down_hold', 20: 'down_double'}; match action: - case self.Action.Single_off | self.Action.Single_on: - return None - case self.Action.Double_off | self.Action.Double_on: - return COMMAND_BUTTON_DOUBLE - case self.Action.Long_off | self.Action.Long_on: - return COMMAND_BUTTON_HOLD + case self.Action.Single_off: + return COMMAND_M_INITIAL_PRESS, TURN_OFF + case self.Action.Single_on: + return COMMAND_M_INITIAL_PRESS, TURN_ON + case self.Action.Single_release_off: + return COMMAND_M_SHORT_RELEASE, TURN_OFF + case self.Action.Single_release_on: + return COMMAND_M_SHORT_RELEASE, TURN_ON + case self.Action.Double_off: + return COMMAND_M_MULTI_PRESS_COMPLETE, TURN_OFF + case self.Action.Double_on: + return COMMAND_M_MULTI_PRESS_COMPLETE, TURN_ON + case self.Action.Long_off: + return COMMAND_M_LONG_RELEASE, TURN_OFF + case self.Action.Long_on: + return COMMAND_M_LONG_RELEASE, TURN_ON case _: - return None + self.debug("SINOPE unhandled action: %s", action) + return None, None class LightManufacturerCluster(EventableCluster, SinopeTechnologiesManufacturerCluster): diff --git a/zhaquirks/sinope/sensor.py b/zhaquirks/sinope/sensor.py index 7fbdf1dbb7..f6e73b3321 100644 --- a/zhaquirks/sinope/sensor.py +++ b/zhaquirks/sinope/sensor.py @@ -30,7 +30,8 @@ OUTPUT_CLUSTERS, PROFILE_ID, ) -from zhaquirks.sinope import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID + +from . import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID class LeakStatus(t.enum8): diff --git a/zhaquirks/sinope/switch.py b/zhaquirks/sinope/switch.py index e3eada7b84..b008c3fa61 100644 --- a/zhaquirks/sinope/switch.py +++ b/zhaquirks/sinope/switch.py @@ -43,11 +43,8 @@ OUTPUT_CLUSTERS, PROFILE_ID, ) -from zhaquirks.sinope import ( - SINOPE, - SINOPE_MANUFACTURER_CLUSTER_ID, - CustomDeviceTemperatureCluster, -) + +from . import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID, CustomDeviceTemperatureCluster class KeypadLock(t.enum8): diff --git a/zhaquirks/sinope/thermostat.py b/zhaquirks/sinope/thermostat.py index 401015f194..2746d3b10a 100644 --- a/zhaquirks/sinope/thermostat.py +++ b/zhaquirks/sinope/thermostat.py @@ -33,7 +33,8 @@ OUTPUT_CLUSTERS, PROFILE_ID, ) -from zhaquirks.sinope import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID + +from . import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID class KeypadLock(t.enum8): From 4d90189fb969ec319f14b6536ee6d06f766a7137 Mon Sep 17 00:00:00 2001 From: David Racine Date: Mon, 21 Oct 2024 20:08:27 -0400 Subject: [PATCH 2/3] Made HA events backward compatible. Also send more information as arguments of the `zha_event`: Added "description" containing the ButtonAction name. Got rid of deprecation warnings in test_sinope.py --- tests/test_sinope.py | 40 +++++++++++++++++++++++++++++------- zhaquirks/sinope/__init__.py | 37 +++++++++++++++++++++++---------- zhaquirks/sinope/light.py | 38 +++++++++++++--------------------- 3 files changed, 73 insertions(+), 42 deletions(-) diff --git a/tests/test_sinope.py b/tests/test_sinope.py index 3dd6a5221b..3f377a858d 100644 --- a/tests/test_sinope.py +++ b/tests/test_sinope.py @@ -101,10 +101,10 @@ def _get_packet_data( @pytest.mark.parametrize( "press_type,button,exp_event", ( - (ButtonAction.Single_off, TURN_OFF, COMMAND_M_INITIAL_PRESS), - (ButtonAction.Single_on, TURN_ON, COMMAND_M_INITIAL_PRESS), - (ButtonAction.Single_release_off, TURN_OFF, COMMAND_M_SHORT_RELEASE), - (ButtonAction.Single_release_on, TURN_ON, COMMAND_M_SHORT_RELEASE), + (ButtonAction.Pressed_off, TURN_OFF, COMMAND_M_INITIAL_PRESS), + (ButtonAction.Pressed_on, TURN_ON, COMMAND_M_INITIAL_PRESS), + (ButtonAction.Released_off, TURN_OFF, COMMAND_M_SHORT_RELEASE), + (ButtonAction.Released_on, TURN_ON, COMMAND_M_SHORT_RELEASE), (ButtonAction.Double_on, TURN_ON, COMMAND_M_MULTI_PRESS_COMPLETE), (ButtonAction.Double_off, TURN_OFF, COMMAND_M_MULTI_PRESS_COMPLETE), (ButtonAction.Long_on, TURN_ON, COMMAND_M_LONG_RELEASE), @@ -135,7 +135,16 @@ class Listener: ), ) data = _get_packet_data(foundation.GeneralCommand.Report_Attributes, attr) - device.handle_message(260, cluster_id, endpoint_id, endpoint_id, data) + + device.packet_received( + t.ZigbeePacket( + profile_id=260, + cluster_id=cluster_id, + src_ep=endpoint_id, + dst_ep=endpoint_id, + data=t.SerializableBytes(data), + ) + ) if exp_event is None: assert cluster_listener.zha_send_event.call_count == 0 @@ -147,6 +156,7 @@ class Listener: "attribute_id": 84, "attribute_name": "action_report", "button": button, + "description": press_type.name, "value": press_type.value, }, ) @@ -172,7 +182,15 @@ class Listener: # read attributes general command data = _get_packet_data(foundation.GeneralCommand.Read_Attributes) - device.handle_message(260, cluster_id, endpoint_id, endpoint_id, data) + device.packet_received( + t.ZigbeePacket( + profile_id=260, + cluster_id=cluster_id, + src_ep=endpoint_id, + dst_ep=endpoint_id, + data=t.SerializableBytes(data), + ) + ) # no ZHA events emitted because we only handle Report_Attributes assert cluster_listener.zha_send_event.call_count == 0 @@ -184,7 +202,15 @@ class Listener: ), # 0x29 = t.int16s ) data = _get_packet_data(foundation.GeneralCommand.Report_Attributes, attr) - device.handle_message(260, cluster_id, endpoint_id, endpoint_id, data) + device.packet_received( + t.ZigbeePacket( + profile_id=260, + cluster_id=cluster_id, + src_ep=endpoint_id, + dst_ep=endpoint_id, + data=t.SerializableBytes(data), + ) + ) # ZHA event emitted because we pass non "action_report" # reports to the base class handler. assert cluster_listener.zha_send_event.call_count == 1 diff --git a/zhaquirks/sinope/__init__.py b/zhaquirks/sinope/__init__.py index 439b283217..ff59f319da 100644 --- a/zhaquirks/sinope/__init__.py +++ b/zhaquirks/sinope/__init__.py @@ -1,6 +1,7 @@ """Module for Sinope quirks implementations.""" from zigpy.quirks import CustomCluster +import zigpy.types as t from zigpy.zcl.clusters.general import DeviceTemperature from zhaquirks.const import ( @@ -16,7 +17,7 @@ COMMAND_M_SHORT_RELEASE, DOUBLE_PRESS, ENDPOINT_ID, - LONG_RELEASE, + LONG_PRESS, SHORT_PRESS, SHORT_RELEASE, TURN_OFF, @@ -28,6 +29,20 @@ SINOPE_MANUFACTURER_CLUSTER_ID = 0xFF01 ATTRIBUTE_ACTION = "action_report" + +class ButtonAction(t.enum8): + """Action_report values.""" + + Pressed_on = 0x01 + Released_on = 0x02 + Long_on = 0x03 + Double_on = 0x04 + Pressed_off = 0x11 + Released_off = 0x12 + Long_off = 0x13 + Double_off = 0x14 + + LIGHT_DEVICE_TRIGGERS = { (SHORT_PRESS, TURN_ON): { ENDPOINT_ID: 1, @@ -37,7 +52,7 @@ ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, BUTTON: TURN_ON, - VALUE: 1, + VALUE: ButtonAction.Pressed_on, }, }, (SHORT_PRESS, TURN_OFF): { @@ -48,7 +63,7 @@ ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, BUTTON: TURN_OFF, - VALUE: 17, + VALUE: ButtonAction.Pressed_off, }, }, (SHORT_RELEASE, TURN_ON): { @@ -59,7 +74,7 @@ ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, BUTTON: TURN_ON, - VALUE: 2, + VALUE: ButtonAction.Released_on, }, }, (SHORT_RELEASE, TURN_OFF): { @@ -70,7 +85,7 @@ ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, BUTTON: TURN_OFF, - VALUE: 18, + VALUE: ButtonAction.Released_off, }, }, (DOUBLE_PRESS, TURN_ON): { @@ -81,7 +96,7 @@ ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, BUTTON: TURN_ON, - VALUE: 4, + VALUE: ButtonAction.Double_on, }, }, (DOUBLE_PRESS, TURN_OFF): { @@ -92,10 +107,10 @@ ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, BUTTON: TURN_OFF, - VALUE: 20, + VALUE: ButtonAction.Double_off, }, }, - (LONG_RELEASE, TURN_ON): { + (LONG_PRESS, TURN_ON): { ENDPOINT_ID: 1, CLUSTER_ID: 65281, COMMAND: COMMAND_M_LONG_RELEASE, @@ -103,10 +118,10 @@ ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, BUTTON: TURN_ON, - VALUE: 3, + VALUE: ButtonAction.Long_on, }, }, - (LONG_RELEASE, TURN_OFF): { + (LONG_PRESS, TURN_OFF): { ENDPOINT_ID: 1, CLUSTER_ID: 65281, COMMAND: COMMAND_M_LONG_RELEASE, @@ -114,7 +129,7 @@ ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, BUTTON: TURN_OFF, - VALUE: 19, + VALUE: ButtonAction.Long_off, }, }, } diff --git a/zhaquirks/sinope/light.py b/zhaquirks/sinope/light.py index 94b7acd729..a7defffaa6 100644 --- a/zhaquirks/sinope/light.py +++ b/zhaquirks/sinope/light.py @@ -34,6 +34,7 @@ COMMAND_M_LONG_RELEASE, COMMAND_M_MULTI_PRESS_COMPLETE, COMMAND_M_SHORT_RELEASE, + DESCRIPTION, DEVICE_TYPE, ENDPOINTS, INPUT_CLUSTERS, @@ -51,6 +52,7 @@ LIGHT_DEVICE_TRIGGERS, SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID, + ButtonAction, CustomDeviceTemperatureCluster, ) @@ -79,19 +81,6 @@ class DoubleFull(t.enum8): On = 0x01 -class ButtonAction(t.enum8): - """Action_report values.""" - - Single_on = 0x01 - Single_release_on = 0x02 - Long_on = 0x03 - Double_on = 0x04 - Single_off = 0x11 - Single_release_off = 0x12 - Long_off = 0x13 - Double_off = 0x14 - - class SinopeTechnologiesManufacturerCluster(CustomCluster): """SinopeTechnologiesManufacturerCluster manufacturer cluster.""" @@ -197,26 +186,27 @@ def handle_cluster_general_request( hdr, args, dst_addressing=dst_addressing ) - value = attr.value.value + action = self.Action(attr.value.value) - action, button = self._get_command_from_action(self.Action(value)) - if not action or not button: + command, button = self._get_command_from_action(action) + if not command or not button: return event_args = { ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, BUTTON: button, - VALUE: value.value, + DESCRIPTION: action.name, + VALUE: action.value, } self.debug( - "SINOPE ZHA_SEND_EVENT action: '%s' event_args: %s", - self.Action(value), + "SINOPE ZHA_SEND_EVENT command: '%s' event_args: %s", + command, event_args, ) - self.listener_event(ZHA_SEND_EVENT, action, event_args) + self.listener_event(ZHA_SEND_EVENT, command, event_args) def _get_command_from_action( self, action: ButtonAction @@ -224,13 +214,13 @@ def _get_command_from_action( # const lookup = {1: 'up_single', 2: 'up_single_released', 3: 'up_hold', 4: 'up_double', # 17: 'down_single, 18: 'down_single_released', 19: 'down_hold', 20: 'down_double'}; match action: - case self.Action.Single_off: + case self.Action.Pressed_off: return COMMAND_M_INITIAL_PRESS, TURN_OFF - case self.Action.Single_on: + case self.Action.Pressed_on: return COMMAND_M_INITIAL_PRESS, TURN_ON - case self.Action.Single_release_off: + case self.Action.Released_off: return COMMAND_M_SHORT_RELEASE, TURN_OFF - case self.Action.Single_release_on: + case self.Action.Released_on: return COMMAND_M_SHORT_RELEASE, TURN_ON case self.Action.Double_off: return COMMAND_M_MULTI_PRESS_COMPLETE, TURN_OFF From f922d1439e2665d0a23a290a3e75017ff0544d1a Mon Sep 17 00:00:00 2001 From: David Racine Date: Fri, 25 Oct 2024 17:44:17 -0400 Subject: [PATCH 3/3] Bring back absolute import paths to "simplify" quirks usage. --- zhaquirks/sinope/light.py | 3 +-- zhaquirks/sinope/sensor.py | 3 +-- zhaquirks/sinope/switch.py | 7 +++++-- zhaquirks/sinope/thermostat.py | 3 +-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/zhaquirks/sinope/light.py b/zhaquirks/sinope/light.py index a7defffaa6..328315f5bb 100644 --- a/zhaquirks/sinope/light.py +++ b/zhaquirks/sinope/light.py @@ -46,8 +46,7 @@ VALUE, ZHA_SEND_EVENT, ) - -from . import ( +from zhaquirks.sinope import ( ATTRIBUTE_ACTION, LIGHT_DEVICE_TRIGGERS, SINOPE, diff --git a/zhaquirks/sinope/sensor.py b/zhaquirks/sinope/sensor.py index f6e73b3321..7fbdf1dbb7 100644 --- a/zhaquirks/sinope/sensor.py +++ b/zhaquirks/sinope/sensor.py @@ -30,8 +30,7 @@ OUTPUT_CLUSTERS, PROFILE_ID, ) - -from . import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID +from zhaquirks.sinope import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID class LeakStatus(t.enum8): diff --git a/zhaquirks/sinope/switch.py b/zhaquirks/sinope/switch.py index b008c3fa61..e3eada7b84 100644 --- a/zhaquirks/sinope/switch.py +++ b/zhaquirks/sinope/switch.py @@ -43,8 +43,11 @@ OUTPUT_CLUSTERS, PROFILE_ID, ) - -from . import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID, CustomDeviceTemperatureCluster +from zhaquirks.sinope import ( + SINOPE, + SINOPE_MANUFACTURER_CLUSTER_ID, + CustomDeviceTemperatureCluster, +) class KeypadLock(t.enum8): diff --git a/zhaquirks/sinope/thermostat.py b/zhaquirks/sinope/thermostat.py index 2746d3b10a..401015f194 100644 --- a/zhaquirks/sinope/thermostat.py +++ b/zhaquirks/sinope/thermostat.py @@ -33,8 +33,7 @@ OUTPUT_CLUSTERS, PROFILE_ID, ) - -from . import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID +from zhaquirks.sinope import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID class KeypadLock(t.enum8):