Skip to content

Commit b2751a2

Browse files
authored
Convert IKEA Styrbar quirks to v2 quirk (zigpy#3175)
* Convert IKEA Styrbar quirks to v2 quirk * Remove `fourbtnremote` from `test_quirk_device_automation_triggers_unique` The test does not handle v2 quirks yet and we'll need to see how we want to implement this, as all v2 quirks share the same quirk class. For now, this just removes the `fourbtnremote` from the test.
1 parent 31c51ce commit b2751a2

File tree

2 files changed

+78
-211
lines changed

2 files changed

+78
-211
lines changed

tests/test_quirks.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -641,12 +641,6 @@ def test_migrated_lighting_automation_triggers(quirk: CustomDevice) -> None:
641641
(zhaquirks.aurora.aurora_dimmer.COLOR_DOWN, const.LEFT),
642642
],
643643
],
644-
zhaquirks.ikea.fourbtnremote.IkeaTradfriRemoteV1: [
645-
[
646-
(const.LONG_RELEASE, const.DIM_UP),
647-
(const.LONG_RELEASE, const.DIM_DOWN),
648-
]
649-
],
650644
zhaquirks.paulmann.fourbtnremote.PaulmannRemote4Btn: [
651645
[
652646
(const.LONG_RELEASE, const.BUTTON_1),
@@ -666,6 +660,7 @@ def test_migrated_lighting_automation_triggers(quirk: CustomDevice) -> None:
666660
}
667661

668662

663+
# XXX: Test does not handle v2 quirks
669664
@pytest.mark.parametrize(
670665
"quirk",
671666
[q for q in ALL_QUIRK_CLASSES if getattr(q, "device_automation_triggers", None)],

zhaquirks/ikea/fourbtnremote.py

Lines changed: 77 additions & 205 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,6 @@
11
"""Device handler for IKEA of Sweden TRADFRI remote control."""
2-
from zigpy.profiles import zha
3-
from zigpy.quirks import CustomDevice
4-
from zigpy.zcl.clusters.general import (
5-
Basic,
6-
Identify,
7-
LevelControl,
8-
OnOff,
9-
Ota,
10-
PollControl,
11-
PowerConfiguration,
12-
)
13-
from zigpy.zcl.clusters.lightlink import LightLink
2+
from zigpy.quirks.v2 import add_to_registry_v2
3+
from zigpy.zcl import ClusterType
144

155
from zhaquirks.const import (
166
CLUSTER_ID,
@@ -23,214 +13,96 @@
2313
COMMAND_PRESS,
2414
COMMAND_STOP,
2515
COMMAND_STOP_ON_OFF,
26-
DEVICE_TYPE,
2716
DIM_DOWN,
2817
DIM_UP,
2918
ENDPOINT_ID,
30-
ENDPOINTS,
31-
INPUT_CLUSTERS,
3219
LEFT,
3320
LONG_PRESS,
3421
LONG_RELEASE,
35-
MODELS_INFO,
36-
OUTPUT_CLUSTERS,
3722
PARAMS,
38-
PROFILE_ID,
3923
RIGHT,
4024
SHORT_PRESS,
4125
TURN_OFF,
4226
TURN_ON,
4327
)
44-
from zhaquirks.ikea import (
45-
IKEA,
46-
IKEA_CLUSTER_ID,
47-
WWAH_CLUSTER_ID,
48-
DoublingPowerConfig2AAACluster,
49-
ScenesCluster,
50-
)
51-
52-
53-
class IkeaTradfriRemoteV1(CustomDevice):
54-
"""Custom device representing IKEA of Sweden TRADFRI remote control V1.0.024."""
55-
56-
signature = {
57-
# <SimpleDescriptor endpoint=1 profile=260 device_type=820
58-
# device_version=1
59-
# input_clusters=[0, 1, 3, 32, 4096, 64599]
60-
# output_clusters=[3, 6, 8, 25, 4096]>
61-
MODELS_INFO: [(IKEA, "Remote Control N2")],
62-
ENDPOINTS: {
63-
1: {
64-
PROFILE_ID: zha.PROFILE_ID,
65-
DEVICE_TYPE: zha.DeviceType.NON_COLOR_CONTROLLER,
66-
INPUT_CLUSTERS: [
67-
Basic.cluster_id,
68-
PowerConfiguration.cluster_id,
69-
Identify.cluster_id,
70-
PollControl.cluster_id,
71-
LightLink.cluster_id,
72-
WWAH_CLUSTER_ID,
73-
],
74-
OUTPUT_CLUSTERS: [
75-
Identify.cluster_id,
76-
OnOff.cluster_id,
77-
LevelControl.cluster_id,
78-
Ota.cluster_id,
79-
LightLink.cluster_id,
80-
],
81-
}
82-
},
83-
}
28+
from zhaquirks.ikea import IKEA, DoublingPowerConfig2AAACluster, ScenesCluster
8429

85-
replacement = {
86-
ENDPOINTS: {
87-
1: {
88-
PROFILE_ID: zha.PROFILE_ID,
89-
DEVICE_TYPE: zha.DeviceType.NON_COLOR_CONTROLLER,
90-
INPUT_CLUSTERS: [
91-
Basic.cluster_id,
92-
DoublingPowerConfig2AAACluster,
93-
Identify.cluster_id,
94-
PollControl.cluster_id,
95-
LightLink.cluster_id,
96-
WWAH_CLUSTER_ID,
97-
],
98-
OUTPUT_CLUSTERS: [
99-
Identify.cluster_id,
100-
ScenesCluster,
101-
OnOff.cluster_id,
102-
LevelControl.cluster_id,
103-
Ota.cluster_id,
104-
LightLink.cluster_id,
105-
],
106-
}
107-
}
108-
}
109-
110-
device_automation_triggers = {
111-
(SHORT_PRESS, TURN_ON): {COMMAND: COMMAND_ON, CLUSTER_ID: 6, ENDPOINT_ID: 1},
112-
(LONG_PRESS, DIM_UP): {
113-
COMMAND: COMMAND_MOVE_ON_OFF,
114-
CLUSTER_ID: 8,
115-
ENDPOINT_ID: 1,
116-
PARAMS: {"move_mode": 0},
117-
},
118-
(LONG_RELEASE, DIM_UP): {
119-
COMMAND: COMMAND_STOP_ON_OFF,
120-
CLUSTER_ID: 8,
121-
ENDPOINT_ID: 1,
122-
},
123-
(SHORT_PRESS, TURN_OFF): {COMMAND: COMMAND_OFF, CLUSTER_ID: 6, ENDPOINT_ID: 1},
124-
(LONG_PRESS, DIM_DOWN): {
125-
COMMAND: COMMAND_MOVE,
126-
CLUSTER_ID: 8,
127-
ENDPOINT_ID: 1,
128-
PARAMS: {"move_mode": 1},
129-
},
130-
(LONG_RELEASE, DIM_DOWN): {
131-
COMMAND: COMMAND_STOP,
132-
CLUSTER_ID: 8,
133-
ENDPOINT_ID: 1,
134-
},
135-
(SHORT_PRESS, LEFT): {
136-
COMMAND: COMMAND_PRESS,
137-
CLUSTER_ID: 5,
138-
ENDPOINT_ID: 1,
139-
PARAMS: {
140-
"param1": 257,
141-
"param2": 13,
142-
"param3": 0,
30+
(
31+
add_to_registry_v2(IKEA, "Remote Control N2")
32+
.replaces(DoublingPowerConfig2AAACluster) # will only double for old firmware
33+
.replaces(ScenesCluster, cluster_type=ClusterType.Client)
34+
.device_automation_triggers(
35+
{
36+
(SHORT_PRESS, TURN_ON): {
37+
COMMAND: COMMAND_ON,
38+
CLUSTER_ID: 6,
39+
ENDPOINT_ID: 1,
14340
},
144-
},
145-
(LONG_PRESS, LEFT): {
146-
COMMAND: COMMAND_HOLD,
147-
CLUSTER_ID: 5,
148-
ENDPOINT_ID: 1,
149-
PARAMS: {
150-
"param1": 3329,
151-
"param2": 0,
41+
(LONG_PRESS, DIM_UP): {
42+
COMMAND: COMMAND_MOVE_ON_OFF,
43+
CLUSTER_ID: 8,
44+
ENDPOINT_ID: 1,
45+
PARAMS: {"move_mode": 0},
15246
},
153-
},
154-
(SHORT_PRESS, RIGHT): {
155-
COMMAND: COMMAND_PRESS,
156-
CLUSTER_ID: 5,
157-
ENDPOINT_ID: 1,
158-
PARAMS: {
159-
"param1": 256,
160-
"param2": 13,
161-
"param3": 0,
47+
(LONG_RELEASE, DIM_UP): {
48+
COMMAND: COMMAND_STOP_ON_OFF,
49+
CLUSTER_ID: 8,
50+
ENDPOINT_ID: 1,
16251
},
163-
},
164-
(LONG_PRESS, RIGHT): {
165-
COMMAND: COMMAND_HOLD,
166-
CLUSTER_ID: 5,
167-
ENDPOINT_ID: 1,
168-
PARAMS: {
169-
"param1": 3328,
170-
"param2": 0,
52+
(SHORT_PRESS, TURN_OFF): {
53+
COMMAND: COMMAND_OFF,
54+
CLUSTER_ID: 6,
55+
ENDPOINT_ID: 1,
56+
},
57+
(LONG_PRESS, DIM_DOWN): {
58+
COMMAND: COMMAND_MOVE,
59+
CLUSTER_ID: 8,
60+
ENDPOINT_ID: 1,
61+
PARAMS: {"move_mode": 1},
62+
},
63+
(LONG_RELEASE, DIM_DOWN): {
64+
COMMAND: COMMAND_STOP,
65+
CLUSTER_ID: 8,
66+
ENDPOINT_ID: 1,
67+
},
68+
(SHORT_PRESS, LEFT): {
69+
COMMAND: COMMAND_PRESS,
70+
CLUSTER_ID: 5,
71+
ENDPOINT_ID: 1,
72+
PARAMS: {
73+
"param1": 257,
74+
"param2": 13,
75+
"param3": 0,
76+
},
77+
},
78+
(LONG_PRESS, LEFT): {
79+
COMMAND: COMMAND_HOLD,
80+
CLUSTER_ID: 5,
81+
ENDPOINT_ID: 1,
82+
PARAMS: {
83+
"param1": 3329,
84+
"param2": 0,
85+
},
86+
},
87+
(SHORT_PRESS, RIGHT): {
88+
COMMAND: COMMAND_PRESS,
89+
CLUSTER_ID: 5,
90+
ENDPOINT_ID: 1,
91+
PARAMS: {
92+
"param1": 256,
93+
"param2": 13,
94+
"param3": 0,
95+
},
96+
},
97+
(LONG_PRESS, RIGHT): {
98+
COMMAND: COMMAND_HOLD,
99+
CLUSTER_ID: 5,
100+
ENDPOINT_ID: 1,
101+
PARAMS: {
102+
"param1": 3328,
103+
"param2": 0,
104+
},
171105
},
172-
},
173-
}
174-
175-
176-
class IkeaTradfriRemoteV2(CustomDevice):
177-
"""Custom device representing IKEA of Sweden TRADFRI remote control Version 2.4.5."""
178-
179-
signature = {
180-
# <SimpleDescriptor endpoint=1 profile=260 device_type=820
181-
# device_version=1
182-
# input_clusters=[0, 1, 3, 32, 4096, 64599, 64636]
183-
# output_clusters=[3, 5, 6, 8, 25, 4096]>
184-
MODELS_INFO: [(IKEA, "Remote Control N2")],
185-
ENDPOINTS: {
186-
1: {
187-
PROFILE_ID: zha.PROFILE_ID,
188-
DEVICE_TYPE: zha.DeviceType.NON_COLOR_CONTROLLER,
189-
INPUT_CLUSTERS: [
190-
Basic.cluster_id,
191-
PowerConfiguration.cluster_id,
192-
Identify.cluster_id,
193-
PollControl.cluster_id,
194-
LightLink.cluster_id,
195-
WWAH_CLUSTER_ID,
196-
IKEA_CLUSTER_ID,
197-
],
198-
OUTPUT_CLUSTERS: [
199-
Identify.cluster_id,
200-
ScenesCluster.cluster_id,
201-
OnOff.cluster_id,
202-
LevelControl.cluster_id,
203-
Ota.cluster_id,
204-
LightLink.cluster_id,
205-
],
206-
}
207-
},
208-
}
209-
210-
replacement = {
211-
ENDPOINTS: {
212-
1: {
213-
PROFILE_ID: zha.PROFILE_ID,
214-
DEVICE_TYPE: zha.DeviceType.NON_COLOR_CONTROLLER,
215-
INPUT_CLUSTERS: [
216-
Basic.cluster_id,
217-
PowerConfiguration.cluster_id,
218-
Identify.cluster_id,
219-
PollControl.cluster_id,
220-
LightLink.cluster_id,
221-
WWAH_CLUSTER_ID,
222-
IKEA_CLUSTER_ID,
223-
],
224-
OUTPUT_CLUSTERS: [
225-
Identify.cluster_id,
226-
ScenesCluster,
227-
OnOff.cluster_id,
228-
LevelControl.cluster_id,
229-
Ota.cluster_id,
230-
LightLink.cluster_id,
231-
],
232-
}
233106
}
234-
}
235-
236-
device_automation_triggers = IkeaTradfriRemoteV1.device_automation_triggers.copy()
107+
)
108+
)

0 commit comments

Comments
 (0)