Skip to content

Commit aaf89ff

Browse files
Replace Inovelli quirks with v2 quirks (#3232)
Co-authored-by: TheJulianJES <[email protected]>
1 parent a24ba30 commit aaf89ff

File tree

7 files changed

+1535
-1681
lines changed

7 files changed

+1535
-1681
lines changed

tests/test_inovelli_blue.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
from unittest.mock import MagicMock
55

66
import zigpy.types as t
7+
from zigpy.zcl import ClusterType
78

89
import zhaquirks
9-
from zhaquirks.inovelli.VZM31SN import InovelliVZM31SNv11
1010

1111
zhaquirks.setup()
1212

1313

14-
def test_mfg_cluster_events(zigpy_device_from_quirk):
14+
def test_mfg_cluster_events(zigpy_device_from_v2_quirk):
1515
"""Test Inovelli manufacturer cluster generates correct events."""
1616
data = b"\x15/\x12\x05\x00\x03\x00" # button_3_press event
1717
cluster_id = 0xFC31
@@ -20,7 +20,9 @@ def test_mfg_cluster_events(zigpy_device_from_quirk):
2020
class Listener:
2121
zha_send_event = mock.MagicMock()
2222

23-
device = zigpy_device_from_quirk(InovelliVZM31SNv11)
23+
device = zigpy_device_from_v2_quirk(
24+
"Inovelli", "VZM31-SN", cluster_ids={2: {0xFC31: ClusterType.Client}}
25+
)
2426
device._packet_debouncer.filter = MagicMock(return_value=False)
2527
cluster_listener = Listener()
2628
device.endpoints[endpoint_id].out_clusters[cluster_id].add_listener(

zhaquirks/inovelli/VZM30SN.py

Lines changed: 10 additions & 320 deletions
Original file line numberDiff line numberDiff line change
@@ -1,324 +1,14 @@
1-
"""VZM30-SN Switch."""
1+
"""VZM30-SN Smart On/Off Switch."""
22

3-
from zigpy.profiles import zgp, zha
4-
from zigpy.profiles.zha import DeviceType
5-
from zigpy.quirks import CustomDevice
6-
from zigpy.zcl.clusters.general import (
7-
Basic,
8-
GreenPowerProxy,
9-
Groups,
10-
Identify,
11-
LevelControl,
12-
OnOff,
13-
Ota,
14-
Scenes,
15-
)
16-
from zigpy.zcl.clusters.homeautomation import Diagnostic, ElectricalMeasurement
17-
from zigpy.zcl.clusters.measurement import RelativeHumidity, TemperatureMeasurement
18-
from zigpy.zcl.clusters.smartenergy import Metering
3+
from zigpy.profiles import zha
4+
from zigpy.quirks.v2 import QuirkBuilder
195

20-
from zhaquirks.const import (
21-
DEVICE_TYPE,
22-
ENDPOINTS,
23-
INPUT_CLUSTERS,
24-
MODELS_INFO,
25-
OUTPUT_CLUSTERS,
26-
PROFILE_ID,
27-
)
286
from zhaquirks.inovelli import INOVELLI_AUTOMATION_TRIGGERS, InovelliVZM30SNCluster
297

30-
INOVELLI_VZM30SN_CLUSTER_ID = 64561
31-
WWAH_CLUSTER_ID = 64599
32-
33-
34-
class InovelliVZM30SNv1(CustomDevice):
35-
"""VZM30-SN mmWave Dimmer Switch."""
36-
37-
signature = {
38-
MODELS_INFO: [("Inovelli", "VZM30-SN")],
39-
ENDPOINTS: {
40-
1: {
41-
PROFILE_ID: zha.PROFILE_ID,
42-
DEVICE_TYPE: DeviceType.DIMMABLE_LIGHT,
43-
INPUT_CLUSTERS: [
44-
Basic.cluster_id,
45-
Identify.cluster_id,
46-
Groups.cluster_id,
47-
Scenes.cluster_id,
48-
OnOff.cluster_id,
49-
LevelControl.cluster_id,
50-
Metering.cluster_id,
51-
ElectricalMeasurement.cluster_id,
52-
Diagnostic.cluster_id,
53-
INOVELLI_VZM30SN_CLUSTER_ID,
54-
WWAH_CLUSTER_ID,
55-
],
56-
OUTPUT_CLUSTERS: [Ota.cluster_id],
57-
},
58-
2: {
59-
PROFILE_ID: zha.PROFILE_ID,
60-
DEVICE_TYPE: DeviceType.DIMMER_SWITCH,
61-
INPUT_CLUSTERS: [Basic.cluster_id, Identify.cluster_id],
62-
OUTPUT_CLUSTERS: [
63-
Identify.cluster_id,
64-
OnOff.cluster_id,
65-
LevelControl.cluster_id,
66-
INOVELLI_VZM30SN_CLUSTER_ID,
67-
],
68-
},
69-
3: {
70-
PROFILE_ID: zha.PROFILE_ID,
71-
DEVICE_TYPE: DeviceType.DIMMER_SWITCH,
72-
INPUT_CLUSTERS: [
73-
Basic.cluster_id,
74-
Identify.cluster_id,
75-
],
76-
OUTPUT_CLUSTERS: [
77-
Identify.cluster_id,
78-
OnOff.cluster_id,
79-
LevelControl.cluster_id,
80-
INOVELLI_VZM30SN_CLUSTER_ID,
81-
],
82-
},
83-
4: {
84-
PROFILE_ID: zha.PROFILE_ID,
85-
DEVICE_TYPE: 0x0302,
86-
INPUT_CLUSTERS: [
87-
Basic.cluster_id,
88-
Identify.cluster_id,
89-
TemperatureMeasurement.cluster_id,
90-
RelativeHumidity.cluster_id,
91-
],
92-
OUTPUT_CLUSTERS: [
93-
Identify.cluster_id,
94-
],
95-
},
96-
242: {
97-
PROFILE_ID: zgp.PROFILE_ID,
98-
DEVICE_TYPE: 0x0061,
99-
OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],
100-
},
101-
},
102-
}
103-
104-
replacement = {
105-
ENDPOINTS: {
106-
1: {
107-
PROFILE_ID: zha.PROFILE_ID,
108-
DEVICE_TYPE: DeviceType.DIMMABLE_LIGHT,
109-
INPUT_CLUSTERS: [
110-
Basic.cluster_id,
111-
Identify.cluster_id,
112-
Groups.cluster_id,
113-
Scenes.cluster_id,
114-
OnOff.cluster_id,
115-
LevelControl.cluster_id,
116-
Metering.cluster_id,
117-
ElectricalMeasurement.cluster_id,
118-
Diagnostic.cluster_id,
119-
InovelliVZM30SNCluster,
120-
WWAH_CLUSTER_ID,
121-
],
122-
OUTPUT_CLUSTERS: [
123-
Ota.cluster_id,
124-
],
125-
},
126-
2: {
127-
PROFILE_ID: zha.PROFILE_ID,
128-
DEVICE_TYPE: DeviceType.DIMMER_SWITCH,
129-
INPUT_CLUSTERS: [Basic.cluster_id, Identify.cluster_id],
130-
OUTPUT_CLUSTERS: [
131-
Identify.cluster_id,
132-
OnOff.cluster_id,
133-
LevelControl.cluster_id,
134-
InovelliVZM30SNCluster,
135-
],
136-
},
137-
3: {
138-
PROFILE_ID: zha.PROFILE_ID,
139-
DEVICE_TYPE: DeviceType.DIMMER_SWITCH,
140-
INPUT_CLUSTERS: [Basic.cluster_id, Identify.cluster_id],
141-
OUTPUT_CLUSTERS: [
142-
Identify.cluster_id,
143-
OnOff.cluster_id,
144-
LevelControl.cluster_id,
145-
InovelliVZM30SNCluster,
146-
],
147-
},
148-
4: {
149-
PROFILE_ID: zha.PROFILE_ID,
150-
DEVICE_TYPE: 0x0302,
151-
INPUT_CLUSTERS: [
152-
Basic.cluster_id,
153-
Identify.cluster_id,
154-
TemperatureMeasurement.cluster_id,
155-
RelativeHumidity.cluster_id,
156-
],
157-
OUTPUT_CLUSTERS: [
158-
Identify.cluster_id,
159-
],
160-
},
161-
242: {
162-
PROFILE_ID: zgp.PROFILE_ID,
163-
DEVICE_TYPE: 0x0061,
164-
OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],
165-
},
166-
},
167-
}
168-
169-
device_automation_triggers = INOVELLI_AUTOMATION_TRIGGERS
170-
171-
172-
class InovelliVZM30SNv2(CustomDevice):
173-
"""VZM30-SN mmWave Dimmer Switch."""
174-
175-
signature = {
176-
MODELS_INFO: [("Inovelli", "VZM30-SN")],
177-
ENDPOINTS: {
178-
1: {
179-
PROFILE_ID: zha.PROFILE_ID,
180-
DEVICE_TYPE: DeviceType.ON_OFF_LIGHT,
181-
INPUT_CLUSTERS: [
182-
Basic.cluster_id,
183-
Identify.cluster_id,
184-
Groups.cluster_id,
185-
Scenes.cluster_id,
186-
OnOff.cluster_id,
187-
LevelControl.cluster_id,
188-
Metering.cluster_id,
189-
ElectricalMeasurement.cluster_id,
190-
Diagnostic.cluster_id,
191-
INOVELLI_VZM30SN_CLUSTER_ID,
192-
WWAH_CLUSTER_ID,
193-
],
194-
OUTPUT_CLUSTERS: [Ota.cluster_id],
195-
},
196-
2: {
197-
PROFILE_ID: zha.PROFILE_ID,
198-
DEVICE_TYPE: DeviceType.DIMMER_SWITCH,
199-
INPUT_CLUSTERS: [
200-
Basic.cluster_id,
201-
Identify.cluster_id,
202-
Groups.cluster_id,
203-
Scenes.cluster_id,
204-
],
205-
OUTPUT_CLUSTERS: [
206-
Identify.cluster_id,
207-
OnOff.cluster_id,
208-
LevelControl.cluster_id,
209-
INOVELLI_VZM30SN_CLUSTER_ID,
210-
],
211-
},
212-
3: {
213-
PROFILE_ID: zha.PROFILE_ID,
214-
DEVICE_TYPE: DeviceType.DIMMER_SWITCH,
215-
INPUT_CLUSTERS: [
216-
Basic.cluster_id,
217-
Identify.cluster_id,
218-
Groups.cluster_id,
219-
Scenes.cluster_id,
220-
],
221-
OUTPUT_CLUSTERS: [
222-
Identify.cluster_id,
223-
OnOff.cluster_id,
224-
LevelControl.cluster_id,
225-
INOVELLI_VZM30SN_CLUSTER_ID,
226-
],
227-
},
228-
4: {
229-
PROFILE_ID: zha.PROFILE_ID,
230-
DEVICE_TYPE: 0x0302,
231-
INPUT_CLUSTERS: [
232-
Basic.cluster_id,
233-
Identify.cluster_id,
234-
TemperatureMeasurement.cluster_id,
235-
RelativeHumidity.cluster_id,
236-
],
237-
OUTPUT_CLUSTERS: [
238-
Identify.cluster_id,
239-
],
240-
},
241-
242: {
242-
PROFILE_ID: zgp.PROFILE_ID,
243-
DEVICE_TYPE: 0x0061,
244-
OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],
245-
},
246-
},
247-
}
248-
249-
replacement = {
250-
ENDPOINTS: {
251-
1: {
252-
PROFILE_ID: zha.PROFILE_ID,
253-
DEVICE_TYPE: DeviceType.DIMMABLE_LIGHT,
254-
INPUT_CLUSTERS: [
255-
Basic.cluster_id,
256-
Identify.cluster_id,
257-
Groups.cluster_id,
258-
Scenes.cluster_id,
259-
OnOff.cluster_id,
260-
LevelControl.cluster_id,
261-
Metering.cluster_id,
262-
ElectricalMeasurement.cluster_id,
263-
Diagnostic.cluster_id,
264-
InovelliVZM30SNCluster,
265-
WWAH_CLUSTER_ID,
266-
],
267-
OUTPUT_CLUSTERS: [
268-
Ota.cluster_id,
269-
],
270-
},
271-
2: {
272-
PROFILE_ID: zha.PROFILE_ID,
273-
DEVICE_TYPE: DeviceType.DIMMER_SWITCH,
274-
INPUT_CLUSTERS: [
275-
Basic.cluster_id,
276-
Identify.cluster_id,
277-
Groups.cluster_id,
278-
Scenes.cluster_id,
279-
],
280-
OUTPUT_CLUSTERS: [
281-
Identify.cluster_id,
282-
OnOff.cluster_id,
283-
LevelControl.cluster_id,
284-
InovelliVZM30SNCluster,
285-
],
286-
},
287-
3: {
288-
PROFILE_ID: zha.PROFILE_ID,
289-
DEVICE_TYPE: DeviceType.DIMMER_SWITCH,
290-
INPUT_CLUSTERS: [
291-
Basic.cluster_id,
292-
Identify.cluster_id,
293-
Groups.cluster_id,
294-
Scenes.cluster_id,
295-
],
296-
OUTPUT_CLUSTERS: [
297-
Identify.cluster_id,
298-
OnOff.cluster_id,
299-
LevelControl.cluster_id,
300-
InovelliVZM30SNCluster,
301-
],
302-
},
303-
4: {
304-
PROFILE_ID: zha.PROFILE_ID,
305-
DEVICE_TYPE: 0x0302,
306-
INPUT_CLUSTERS: [
307-
Basic.cluster_id,
308-
Identify.cluster_id,
309-
TemperatureMeasurement.cluster_id,
310-
RelativeHumidity.cluster_id,
311-
],
312-
OUTPUT_CLUSTERS: [
313-
Identify.cluster_id,
314-
],
315-
},
316-
242: {
317-
PROFILE_ID: zgp.PROFILE_ID,
318-
DEVICE_TYPE: 0x0061,
319-
OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],
320-
},
321-
},
322-
}
323-
324-
device_automation_triggers = INOVELLI_AUTOMATION_TRIGGERS
8+
(
9+
QuirkBuilder("Inovelli", "VZM30-SN")
10+
.replaces_endpoint(1, device_type=zha.DeviceType.DIMMABLE_LIGHT)
11+
.replace_cluster_occurrences(InovelliVZM30SNCluster)
12+
.device_automation_triggers(INOVELLI_AUTOMATION_TRIGGERS)
13+
.add_to_registry()
14+
)

0 commit comments

Comments
 (0)