Skip to content

Commit 1037865

Browse files
committed
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.
1 parent fa734ad commit 1037865

File tree

5 files changed

+135
-36
lines changed

5 files changed

+135
-36
lines changed

zhaquirks/sinope/__init__.py

Lines changed: 73 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,18 @@
77
ARGS,
88
ATTRIBUTE_ID,
99
ATTRIBUTE_NAME,
10+
BUTTON,
1011
CLUSTER_ID,
1112
COMMAND,
12-
COMMAND_BUTTON_DOUBLE,
13-
COMMAND_BUTTON_HOLD,
14-
COMMAND_BUTTON_SINGLE,
13+
COMMAND_M_INITIAL_PRESS,
14+
COMMAND_M_LONG_RELEASE,
15+
COMMAND_M_MULTI_PRESS_COMPLETE,
16+
COMMAND_M_SHORT_RELEASE,
1517
DOUBLE_PRESS,
1618
ENDPOINT_ID,
17-
LONG_PRESS,
19+
LONG_RELEASE,
1820
SHORT_PRESS,
21+
SHORT_RELEASE,
1922
TURN_OFF,
2023
TURN_ON,
2124
VALUE,
@@ -29,38 +32,90 @@
2932
(SHORT_PRESS, TURN_ON): {
3033
ENDPOINT_ID: 1,
3134
CLUSTER_ID: 65281,
32-
COMMAND: COMMAND_BUTTON_SINGLE,
33-
ARGS: {ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, VALUE: 2},
35+
COMMAND: COMMAND_M_INITIAL_PRESS,
36+
ARGS: {
37+
ATTRIBUTE_ID: 84,
38+
ATTRIBUTE_NAME: ATTRIBUTE_ACTION,
39+
BUTTON: TURN_ON,
40+
VALUE: 1,
41+
},
3442
},
3543
(SHORT_PRESS, TURN_OFF): {
3644
ENDPOINT_ID: 1,
3745
CLUSTER_ID: 65281,
38-
COMMAND: COMMAND_BUTTON_SINGLE,
39-
ARGS: {ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, VALUE: 18},
46+
COMMAND: COMMAND_M_INITIAL_PRESS,
47+
ARGS: {
48+
ATTRIBUTE_ID: 84,
49+
ATTRIBUTE_NAME: ATTRIBUTE_ACTION,
50+
BUTTON: TURN_OFF,
51+
VALUE: 17,
52+
},
53+
},
54+
(SHORT_RELEASE, TURN_ON): {
55+
ENDPOINT_ID: 1,
56+
CLUSTER_ID: 65281,
57+
COMMAND: COMMAND_M_SHORT_RELEASE,
58+
ARGS: {
59+
ATTRIBUTE_ID: 84,
60+
ATTRIBUTE_NAME: ATTRIBUTE_ACTION,
61+
BUTTON: TURN_ON,
62+
VALUE: 2,
63+
},
64+
},
65+
(SHORT_RELEASE, TURN_OFF): {
66+
ENDPOINT_ID: 1,
67+
CLUSTER_ID: 65281,
68+
COMMAND: COMMAND_M_SHORT_RELEASE,
69+
ARGS: {
70+
ATTRIBUTE_ID: 84,
71+
ATTRIBUTE_NAME: ATTRIBUTE_ACTION,
72+
BUTTON: TURN_OFF,
73+
VALUE: 18,
74+
},
4075
},
4176
(DOUBLE_PRESS, TURN_ON): {
4277
ENDPOINT_ID: 1,
4378
CLUSTER_ID: 65281,
44-
COMMAND: COMMAND_BUTTON_DOUBLE,
45-
ARGS: {ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, VALUE: 4},
79+
COMMAND: COMMAND_M_MULTI_PRESS_COMPLETE,
80+
ARGS: {
81+
ATTRIBUTE_ID: 84,
82+
ATTRIBUTE_NAME: ATTRIBUTE_ACTION,
83+
BUTTON: TURN_ON,
84+
VALUE: 4,
85+
},
4686
},
4787
(DOUBLE_PRESS, TURN_OFF): {
4888
ENDPOINT_ID: 1,
4989
CLUSTER_ID: 65281,
50-
COMMAND: COMMAND_BUTTON_DOUBLE,
51-
ARGS: {ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, VALUE: 20},
90+
COMMAND: COMMAND_M_MULTI_PRESS_COMPLETE,
91+
ARGS: {
92+
ATTRIBUTE_ID: 84,
93+
ATTRIBUTE_NAME: ATTRIBUTE_ACTION,
94+
BUTTON: TURN_OFF,
95+
VALUE: 20,
96+
},
5297
},
53-
(LONG_PRESS, TURN_ON): {
98+
(LONG_RELEASE, TURN_ON): {
5499
ENDPOINT_ID: 1,
55100
CLUSTER_ID: 65281,
56-
COMMAND: COMMAND_BUTTON_HOLD,
57-
ARGS: {ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, VALUE: 3},
101+
COMMAND: COMMAND_M_LONG_RELEASE,
102+
ARGS: {
103+
ATTRIBUTE_ID: 84,
104+
ATTRIBUTE_NAME: ATTRIBUTE_ACTION,
105+
BUTTON: TURN_ON,
106+
VALUE: 3,
107+
},
58108
},
59-
(LONG_PRESS, TURN_OFF): {
109+
(LONG_RELEASE, TURN_OFF): {
60110
ENDPOINT_ID: 1,
61111
CLUSTER_ID: 65281,
62-
COMMAND: COMMAND_BUTTON_HOLD,
63-
ARGS: {ATTRIBUTE_ID: 84, ATTRIBUTE_NAME: ATTRIBUTE_ACTION, VALUE: 19},
112+
COMMAND: COMMAND_M_LONG_RELEASE,
113+
ARGS: {
114+
ATTRIBUTE_ID: 84,
115+
ATTRIBUTE_NAME: ATTRIBUTE_ACTION,
116+
BUTTON: TURN_OFF,
117+
VALUE: 19,
118+
},
64119
},
65120
}
66121

zhaquirks/sinope/light.py

Lines changed: 56 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,24 @@
2929
from zhaquirks.const import (
3030
ATTRIBUTE_ID,
3131
ATTRIBUTE_NAME,
32-
COMMAND_BUTTON_DOUBLE,
33-
COMMAND_BUTTON_HOLD,
32+
BUTTON,
33+
COMMAND_M_INITIAL_PRESS,
34+
COMMAND_M_LONG_RELEASE,
35+
COMMAND_M_MULTI_PRESS_COMPLETE,
36+
COMMAND_M_SHORT_RELEASE,
3437
DEVICE_TYPE,
3538
ENDPOINTS,
3639
INPUT_CLUSTERS,
3740
MODELS_INFO,
3841
OUTPUT_CLUSTERS,
3942
PROFILE_ID,
43+
TURN_OFF,
44+
TURN_ON,
4045
VALUE,
4146
ZHA_SEND_EVENT,
4247
)
43-
from zhaquirks.sinope import (
48+
49+
from . import (
4450
ATTRIBUTE_ACTION,
4551
LIGHT_DEVICE_TRIGGERS,
4652
SINOPE,
@@ -192,27 +198,66 @@ def handle_cluster_general_request(
192198
)
193199

194200
value = attr.value.value
201+
202+
action = self._get_command_from_action(self.Action(value))
203+
if not action:
204+
return
205+
206+
button = self._get_button_from_action(self.Action(value))
207+
if not button:
208+
return
209+
195210
event_args = {
196211
ATTRIBUTE_ID: 84,
197212
ATTRIBUTE_NAME: ATTRIBUTE_ACTION,
213+
BUTTON: button,
198214
VALUE: value.value,
199215
}
200-
action = self._get_command_from_action(self.Action(value))
201-
if not action:
202-
return
216+
217+
self.debug(
218+
"SINOPE ZHA_SEND_EVENT action: '%s' event_args: %s",
219+
self.Action(value),
220+
event_args,
221+
)
222+
203223
self.listener_event(ZHA_SEND_EVENT, action, event_args)
204224

205225
def _get_command_from_action(self, action: ButtonAction) -> str | None:
206-
# const lookup = {2: 'up_single', 3: 'up_hold', 4: 'up_double',
207-
# 18: 'down_single', 19: 'down_hold', 20: 'down_double'};
226+
# const lookup = {1: 'up_single', 2: 'up_single_released', 3: 'up_hold', 4: 'up_double',
227+
# 17: 'down_single, 18: 'down_single_released', 19: 'down_hold', 20: 'down_double'};
208228
match action:
209229
case self.Action.Single_off | self.Action.Single_on:
210-
return None
230+
return COMMAND_M_INITIAL_PRESS
231+
case self.Action.Single_release_off | self.Action.Single_release_on:
232+
return COMMAND_M_SHORT_RELEASE
211233
case self.Action.Double_off | self.Action.Double_on:
212-
return COMMAND_BUTTON_DOUBLE
234+
return COMMAND_M_MULTI_PRESS_COMPLETE
213235
case self.Action.Long_off | self.Action.Long_on:
214-
return COMMAND_BUTTON_HOLD
236+
return COMMAND_M_LONG_RELEASE
237+
case _:
238+
self.debug("SINOPE unhandled action: %s", action)
239+
return None
240+
241+
def _get_button_from_action(self, action: ButtonAction) -> str | None:
242+
# const lookup = {1: 'up_single', 2: 'up_single_released', 3: 'up_hold', 4: 'up_double',
243+
# 17: 'down_single, 18: 'down_single_released', 19: 'down_hold', 20: 'down_double'};
244+
match action:
245+
case (
246+
self.Action.Single_off
247+
| self.Action.Single_release_off
248+
| self.Action.Double_off
249+
| self.Action.Long_off
250+
):
251+
return TURN_OFF
252+
case (
253+
self.Action.Single_on
254+
| self.Action.Single_release_on
255+
| self.Action.Double_on
256+
| self.Action.Long_on
257+
):
258+
return TURN_ON
215259
case _:
260+
self.debug("SINOPE unhandled action: %s", action)
216261
return None
217262

218263

zhaquirks/sinope/sensor.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
OUTPUT_CLUSTERS,
3131
PROFILE_ID,
3232
)
33-
from zhaquirks.sinope import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID
33+
34+
from . import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID
3435

3536

3637
class LeakStatus(t.enum8):

zhaquirks/sinope/switch.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,8 @@
4343
OUTPUT_CLUSTERS,
4444
PROFILE_ID,
4545
)
46-
from zhaquirks.sinope import (
47-
SINOPE,
48-
SINOPE_MANUFACTURER_CLUSTER_ID,
49-
CustomDeviceTemperatureCluster,
50-
)
46+
47+
from . import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID, CustomDeviceTemperatureCluster
5148

5249

5350
class KeypadLock(t.enum8):

zhaquirks/sinope/thermostat.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
OUTPUT_CLUSTERS,
3434
PROFILE_ID,
3535
)
36-
from zhaquirks.sinope import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID
36+
37+
from . import SINOPE, SINOPE_MANUFACTURER_CLUSTER_ID
3738

3839

3940
class KeypadLock(t.enum8):

0 commit comments

Comments
 (0)