11"""Device handler for IKEA of Sweden TRADFRI remote control."""
22
3+ from typing import Any , Optional , Union
4+
35from zigpy .profiles import zha , zll
4- from zigpy .quirks import CustomDevice
6+ from zigpy .quirks import CustomCluster , CustomDevice
7+ import zigpy .types as t
8+ from zigpy .zcl import foundation
59from zigpy .zcl .clusters .closures import WindowCovering
610from zigpy .zcl .clusters .general import (
711 Alarms ,
4044 SHORT_PRESS ,
4145 TURN_OFF ,
4246 TURN_ON ,
47+ ZHA_SEND_EVENT ,
4348)
4449from zhaquirks .ikea import (
4550 IKEA ,
4853 PowerConfig1AAACluster ,
4954)
5055
56+ COMMAND_LONG_RELESE_DIM_UP = "long_release_dim_up"
57+ COMMAND_LONG_RELESE_DIM_DOWN = "long_release_dim_down"
58+
59+
60+ class IkeaRemoteLongReleaseControl (CustomCluster , LevelControl ):
61+ """Ikea Remote Long Release Control cluster."""
62+
63+ def __init__ (self , * args , ** kwargs ):
64+ """Initialize instance."""
65+ super ().__init__ (* args , ** kwargs )
66+ self ._dim_direction_down = None
67+
68+ def handle_cluster_request (
69+ self ,
70+ hdr : foundation .ZCLHeader ,
71+ args : list [Any ],
72+ * ,
73+ dst_addressing : Optional [
74+ Union [t .Addressing .Group , t .Addressing .IEEE , t .Addresszhing .NWK ]
75+ ] = None ,
76+ ) -> None :
77+ """Handle cluster specific commands.
78+
79+ We just want to keep track of direction, to associate it with the stop command.
80+ """
81+
82+ cmd_name = self .server_commands [hdr .command_id ].name
83+ if cmd_name == COMMAND_MOVE_ON_OFF :
84+ self ._dim_direction_down = False
85+ elif cmd_name == COMMAND_MOVE :
86+ self ._dim_direction_down = True
87+ elif cmd_name in (COMMAND_STOP_ON_OFF , COMMAND_STOP ):
88+ action = (
89+ COMMAND_LONG_RELESE_DIM_DOWN
90+ if self ._dim_direction_down
91+ else COMMAND_LONG_RELESE_DIM_UP
92+ )
93+ self .listener_event (ZHA_SEND_EVENT , action , [])
94+
5195
5296class IkeaTradfriRemote2Btn (CustomDevice ):
5397 """Custom device representing IKEA of Sweden TRADFRI remote control."""
@@ -102,7 +146,7 @@ class IkeaTradfriRemote2Btn(CustomDevice):
102146 Identify .cluster_id ,
103147 Groups .cluster_id ,
104148 OnOff .cluster_id ,
105- LevelControl . cluster_id ,
149+ IkeaRemoteLongReleaseControl ,
106150 Ota .cluster_id ,
107151 WindowCovering .cluster_id ,
108152 LightLink .cluster_id ,
@@ -120,7 +164,7 @@ class IkeaTradfriRemote2Btn(CustomDevice):
120164 PARAMS : {"move_mode" : 0 },
121165 },
122166 (LONG_RELEASE , DIM_UP ): {
123- COMMAND : COMMAND_STOP_ON_OFF ,
167+ COMMAND : COMMAND_LONG_RELESE_DIM_UP ,
124168 CLUSTER_ID : 8 ,
125169 ENDPOINT_ID : 1 ,
126170 },
@@ -132,7 +176,7 @@ class IkeaTradfriRemote2Btn(CustomDevice):
132176 PARAMS : {"move_mode" : 1 },
133177 },
134178 (LONG_RELEASE , DIM_DOWN ): {
135- COMMAND : COMMAND_STOP ,
179+ COMMAND : COMMAND_LONG_RELESE_DIM_DOWN ,
136180 CLUSTER_ID : 8 ,
137181 ENDPOINT_ID : 1 ,
138182 },
@@ -191,7 +235,7 @@ class IkeaTradfriRemote2BtnZLL(CustomDevice):
191235 Identify .cluster_id ,
192236 Groups .cluster_id ,
193237 OnOff .cluster_id ,
194- LevelControl . cluster_id ,
238+ IkeaRemoteLongReleaseControl ,
195239 Ota .cluster_id ,
196240 WindowCovering .cluster_id ,
197241 LightLink .cluster_id ,
@@ -253,7 +297,7 @@ class IkeaRodretRemote2Btn(CustomDevice):
253297 Identify .cluster_id ,
254298 Groups .cluster_id ,
255299 OnOff .cluster_id ,
256- LevelControl . cluster_id ,
300+ IkeaRemoteLongReleaseControl ,
257301 Ota .cluster_id ,
258302 LightLink .cluster_id ,
259303 ],
@@ -315,7 +359,7 @@ class IkeaRodretRemote2BtnNew(CustomDevice):
315359 Identify .cluster_id ,
316360 Groups .cluster_id ,
317361 OnOff .cluster_id ,
318- LevelControl . cluster_id ,
362+ IkeaRemoteLongReleaseControl ,
319363 Ota .cluster_id ,
320364 LightLink .cluster_id ,
321365 ],
0 commit comments