Skip to content

Commit cec8a19

Browse files
committed
Migrate Schneider dimmer quirks to v2, add missing models
1 parent 3f4aee0 commit cec8a19

File tree

3 files changed

+29
-185
lines changed

3 files changed

+29
-185
lines changed

tests/test_schneiderelectric.py

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from zigpy.zcl.clusters.closures import WindowCovering
77

88
from tests.common import ClusterListener
9-
import zhaquirks.schneiderelectric.dimmers
109
import zhaquirks.schneiderelectric.shutters
1110

1211
zhaquirks.setup()
@@ -136,62 +135,3 @@ async def test_1gang_shutter_1_lift_percentage_updates(zigpy_device_from_quirk):
136135
23, # 100 - 77
137136
)
138137
assert len(cluster_listener.cluster_commands) == 0
139-
140-
141-
def test_nh_rotary_dimmer_1_signature(assert_signature_matches_quirk):
142-
"""Test signature."""
143-
signature = {
144-
"node_descriptor": (
145-
"NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, "
146-
"user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, "
147-
"mac_capability_flags=<MACCapabilityFlags.FullFunctionDevice|MainsPowered|RxOnWhenIdle|"
148-
"AllocateAddress: 142>, manufacturer_code=4190, maximum_buffer_size=82, maximum_incoming_transfer_size=82, "
149-
"server_mask=11264, maximum_outgoing_transfer_size=82, "
150-
"descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, "
151-
"*is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, "
152-
"*is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, "
153-
"*is_security_capable=False)"
154-
),
155-
"endpoints": {
156-
"3": {
157-
"profile_id": 0x0104,
158-
"device_type": "0x0101",
159-
"in_clusters": [
160-
"0x0000",
161-
"0x0003",
162-
"0x0004",
163-
"0x0005",
164-
"0x0006",
165-
"0x0008",
166-
"0x0301",
167-
"0x0b05",
168-
],
169-
"out_clusters": ["0x0019"],
170-
},
171-
"21": {
172-
"profile_id": 0x0104,
173-
"device_type": "0x0104",
174-
"in_clusters": ["0x0000", "0x0003", "0x0b05", "0xff17"],
175-
"out_clusters": [
176-
"0x0003",
177-
"0x0004",
178-
"0x0005",
179-
"0x0006",
180-
"0x0008",
181-
"0x0102",
182-
],
183-
},
184-
"242": {
185-
"profile_id": 0xA1E0,
186-
"device_type": "0x0061",
187-
"in_clusters": [],
188-
"out_clusters": ["0x0021"],
189-
},
190-
},
191-
"manufacturer": "Schneider Electric",
192-
"model": "NHROTARY/DIMMER/1",
193-
"class": "zigpy.device.Device",
194-
}
195-
assert_signature_matches_quirk(
196-
zhaquirks.schneiderelectric.dimmers.NHRotaryDimmer1, signature
197-
)

zhaquirks/schneiderelectric/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,10 @@ class AttributeDefs(Ballast.AttributeDefs):
167167
id=0xE000, type=SEControlMode, is_manufacturer_specific=True
168168
)
169169
se_wiring_mode: Final = ZCLAttributeDef(
170-
id=0xE002, type=t.enum8, is_manufacturer_specific=True
170+
id=0xE002, type=SEWiringMode, is_manufacturer_specific=True
171171
)
172172
se_dimming_curve: Final = ZCLAttributeDef(
173-
id=0xE002, type=t.enum8, is_manufacturer_specific=True
173+
id=0xE002, type=SEDimmingCurve, is_manufacturer_specific=True
174174
)
175175

176176

Lines changed: 27 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -1,129 +1,33 @@
11
"""Schneider Electric dimmers and switches quirks."""
22

3-
from zigpy.profiles import zgp, zha
4-
from zigpy.quirks import CustomDevice
5-
from zigpy.zcl.clusters.closures import WindowCovering
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
17-
from zigpy.zcl.clusters.lighting import Ballast
3+
from zigpy.quirks.v2 import QuirkBuilder
184

19-
from zhaquirks.const import (
20-
DEVICE_TYPE,
21-
ENDPOINTS,
22-
INPUT_CLUSTERS,
23-
MODELS_INFO,
24-
OUTPUT_CLUSTERS,
25-
PROFILE_ID,
5+
from zhaquirks.schneiderelectric import (
6+
SE_MANUF_NAME,
7+
SEBallast,
8+
SEBasic,
9+
SEOnOff,
10+
SESpecific,
2611
)
27-
from zhaquirks.schneiderelectric import SE_MANUF_NAME, SEBallast, SEBasic, SESpecific
28-
2912

30-
class NHRotaryDimmer1(CustomDevice):
31-
"""NHROTARY/DIMMER/1 by Schneider Electric."""
13+
(
14+
QuirkBuilder(SE_MANUF_NAME, "NHROTARY/DIMMER/1")
15+
.applies_to(SE_MANUF_NAME, "NHROTARY/UNIDIM/1")
16+
.applies_to(SE_MANUF_NAME, "NHPB/DIMMER/1")
17+
.applies_to(SE_MANUF_NAME, "NHPB/UNIDIM/1")
18+
.replaces(SEBasic, endpoint_id=3)
19+
.replaces(SEBallast, endpoint_id=3)
20+
.replaces(SEOnOff, endpoint_id=3)
21+
.replaces(SEBasic, endpoint_id=21)
22+
.adds(SESpecific, endpoint_id=21)
23+
.add_to_registry()
24+
)
3225

33-
signature = {
34-
MODELS_INFO: [
35-
(SE_MANUF_NAME, "NHROTARY/DIMMER/1"),
36-
],
37-
ENDPOINTS: {
38-
3: {
39-
PROFILE_ID: zha.PROFILE_ID,
40-
DEVICE_TYPE: zha.DeviceType.DIMMABLE_LIGHT,
41-
INPUT_CLUSTERS: [
42-
Basic.cluster_id,
43-
Identify.cluster_id,
44-
Groups.cluster_id,
45-
Scenes.cluster_id,
46-
OnOff.cluster_id,
47-
LevelControl.cluster_id,
48-
Ballast.cluster_id,
49-
Diagnostic.cluster_id,
50-
],
51-
OUTPUT_CLUSTERS: [
52-
Ota.cluster_id,
53-
],
54-
},
55-
21: {
56-
PROFILE_ID: zha.PROFILE_ID,
57-
DEVICE_TYPE: zha.DeviceType.DIMMER_SWITCH,
58-
INPUT_CLUSTERS: [
59-
Basic.cluster_id,
60-
Identify.cluster_id,
61-
Diagnostic.cluster_id,
62-
SESpecific.cluster_id,
63-
],
64-
OUTPUT_CLUSTERS: [
65-
Identify.cluster_id,
66-
Groups.cluster_id,
67-
Scenes.cluster_id,
68-
OnOff.cluster_id,
69-
LevelControl.cluster_id,
70-
WindowCovering.cluster_id,
71-
],
72-
},
73-
242: {
74-
PROFILE_ID: zgp.PROFILE_ID,
75-
DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC,
76-
INPUT_CLUSTERS: [],
77-
OUTPUT_CLUSTERS: [
78-
GreenPowerProxy.cluster_id,
79-
],
80-
},
81-
},
82-
}
83-
replacement = {
84-
ENDPOINTS: {
85-
3: {
86-
PROFILE_ID: zha.PROFILE_ID,
87-
DEVICE_TYPE: zha.DeviceType.DIMMABLE_LIGHT,
88-
INPUT_CLUSTERS: [
89-
SEBasic,
90-
Identify.cluster_id,
91-
Groups.cluster_id,
92-
Scenes.cluster_id,
93-
OnOff.cluster_id,
94-
LevelControl.cluster_id,
95-
SEBallast,
96-
Diagnostic.cluster_id,
97-
],
98-
OUTPUT_CLUSTERS: [
99-
Ota.cluster_id,
100-
],
101-
},
102-
21: {
103-
PROFILE_ID: zha.PROFILE_ID,
104-
DEVICE_TYPE: zha.DeviceType.DIMMER_SWITCH,
105-
INPUT_CLUSTERS: [
106-
SEBasic,
107-
Identify.cluster_id,
108-
Diagnostic.cluster_id,
109-
SESpecific,
110-
],
111-
OUTPUT_CLUSTERS: [
112-
Identify.cluster_id,
113-
Groups.cluster_id,
114-
Scenes.cluster_id,
115-
OnOff.cluster_id,
116-
LevelControl.cluster_id,
117-
WindowCovering.cluster_id,
118-
],
119-
},
120-
242: {
121-
PROFILE_ID: zgp.PROFILE_ID,
122-
DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC,
123-
INPUT_CLUSTERS: [],
124-
OUTPUT_CLUSTERS: [
125-
GreenPowerProxy.cluster_id,
126-
],
127-
},
128-
}
129-
}
26+
(
27+
QuirkBuilder(SE_MANUF_NAME, "NHPB/SWITCH/1")
28+
.replaces(SEBasic)
29+
.replaces(SEOnOff)
30+
.replaces(SEBasic, endpoint_id=21)
31+
.adds(SESpecific, endpoint_id=21)
32+
.add_to_registry()
33+
)

0 commit comments

Comments
 (0)