Skip to content

Commit 91adfc4

Browse files
authored
Add Inovelli switch VZM30-SN (#3689)
1 parent 73c9c92 commit 91adfc4

File tree

2 files changed

+400
-0
lines changed

2 files changed

+400
-0
lines changed

zhaquirks/inovelli/VZM30SN.py

Lines changed: 324 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,324 @@
1+
"""VZM30-SN Switch."""
2+
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
19+
20+
from zhaquirks.const import (
21+
DEVICE_TYPE,
22+
ENDPOINTS,
23+
INPUT_CLUSTERS,
24+
MODELS_INFO,
25+
OUTPUT_CLUSTERS,
26+
PROFILE_ID,
27+
)
28+
from zhaquirks.inovelli import INOVELLI_AUTOMATION_TRIGGERS, InovelliVZM30SNCluster
29+
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

0 commit comments

Comments
 (0)