Skip to content

Commit e9a9e88

Browse files
committed
Add SE shutter related attributes
- Fixed test definition
1 parent 89ea58d commit e9a9e88

File tree

4 files changed

+97
-37
lines changed

4 files changed

+97
-37
lines changed

tests/test_schneiderelectric.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
11
"""Tests for Schneider Electric."""
2-
from unittest import mock
32

4-
import zigpy.device
5-
import zigpy.endpoint
6-
import zigpy.quirks
73
from zigpy.zcl import foundation
8-
import zigpy.zdo.types as zdo_t
94

105
import zhaquirks
116
import zhaquirks.kof.kof_mr101z
127

13-
from tests.conftest import CoroutineMock
14-
158
zhaquirks.setup()
169

1710
Default_Response = foundation.GENERAL_COMMANDS[
@@ -132,7 +125,7 @@ async def test_fls_air_link_4_signature(assert_signature_matches_quirk):
132125
)
133126

134127

135-
async def test_fls_air_link_4_signature(assert_signature_matches_quirk):
128+
async def test_ch10ax_switch_1_signature(assert_signature_matches_quirk):
136129
signature = {
137130
"node_descriptor": "NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4190, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)",
138131
"endpoints": {
Lines changed: 94 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,120 @@
11
"""Module for Schneider Electric devices quirks."""
22
import logging
33

4-
from zigpy.quirks import CustomCluster, CustomDevice
4+
from zigpy.quirks import CustomCluster
55
import zigpy.types as t
66
from zigpy.zcl.clusters.closures import WindowCovering
7-
8-
from zhaquirks import Bus, EventableCluster, LocalDataCluster
7+
from zigpy.zcl.clusters.general import Basic
8+
from zigpy.zcl.clusters.homeautomation import Diagnostic
99

1010
_LOGGER = logging.getLogger(__name__)
1111

1212
SE = "Schneider Electric"
1313

14+
1415
class SEManufCluster(CustomCluster):
1516
"""Schneider Electric manufacturer specific cluster."""
1617

1718
name = "Schneider Electric Manufacturer Specicific"
1819
ep_attribute = "schneider_electric_manufacturer"
1920

2021

22+
class SEBasicCluster(SEManufCluster, Basic):
23+
ATT_ID_E001 = 0xE001
24+
ATT_ID_E002 = 0xE002
25+
ATT_ID_E004 = 0xE004
26+
ATT_ID_E007 = 0xE007
27+
ATT_ID_E008 = 0xE008
28+
ATT_ID_E009 = 0xE009
29+
ATT_ID_E00A = 0xE00A
30+
ATT_ID_E00B = 0xE00B
31+
32+
attributes = Basic.attributes.copy()
33+
34+
attributes.update(
35+
{
36+
ATT_ID_E001: ("57345", t.CharacterString)
37+
}, # attribute_name:"57345" # ex: "002.004.016 R
38+
{
39+
ATT_ID_E002: ("57346", t.CharacterString)
40+
}, # attribute_name:"57346" # ex: "001.000.000"
41+
{
42+
ATT_ID_E004: ("57348", t.CharacterString)
43+
}, # attribute_name:"57348" # ex: "213249FEFF5ECFD"
44+
{ATT_ID_E007: ("57351", t.enum16)}, # attribute_name:"57351"
45+
{
46+
ATT_ID_E008: ("57352", t.CharacterString)
47+
}, # attribute_name:"57352" # ex: "Wiser Light"
48+
{
49+
ATT_ID_E009: ("57353", t.CharacterString)
50+
}, # attribute_name:"57353" # ex: "NHPB/SHUTTER/1"
51+
{
52+
ATT_ID_E00A: ("57354", t.CharacterString)
53+
}, # attribute_name:"57354" # ex: "Wiser Home"
54+
{ATT_ID_E00B: ("57355", t.CharacterString)}, # attribute_name:"57355"
55+
)
56+
57+
2158
class SEManufSwitchCluster(SEManufCluster):
2259
name = "Schneider Electric Manufacturer Specicific"
2360
cluster_id = 0xFF17
2461

62+
ATT_ID_0000 = 0x0000
63+
ATT_ID_0001 = 0x0001
64+
ATT_ID_0010 = 0x0010
65+
ATT_ID_0011 = 0x0011
66+
ATT_ID_0020 = 0x0020
67+
ATT_ID_0021 = 0x0021
68+
ATT_ID_FFFD = 0xFFFD
69+
70+
attributes = {
71+
{ATT_ID_0000: ("0", t.enum8)}, # attribute_name:"0"
72+
{ATT_ID_0001: ("1", t.enum8)}, # attribute_name:"1"
73+
{ATT_ID_0010: ("16", t.uint8_t)}, # attribute_name:"16"
74+
{ATT_ID_0011: ("17", t.uint16_t)}, # attribute_name:"17"
75+
{ATT_ID_0020: ("32", t.uint8_t)}, # attribute_name:"32"
76+
{ATT_ID_0021: ("33", t.uint16_t)}, # attribute_name:"33"
77+
{ATT_ID_FFFD: ("65533", t.uint16_t)}, # attribute_name:"65533"
78+
}
2579

26-
class SEWindowCoverControl(CustomCluster, WindowCovering):
80+
81+
class SEWindowCover(CustomCluster, WindowCovering):
2782
"""Manufacturer Specific Cluster of Device cover."""
2883

84+
ATT_ID_FFFD = 0xFFFD
85+
ATT_ID_E000 = 0xE000
86+
ATT_ID_E010 = 0xE010
87+
ATT_ID_E012 = 0xE012
88+
ATT_ID_E013 = 0xE013
89+
ATT_ID_E014 = 0xE014
90+
ATT_ID_E015 = 0xE015
91+
ATT_ID_E016 = 0xE016
92+
ATT_ID_E017 = 0xE017
93+
2994
attributes = WindowCovering.attributes.copy()
3095

31-
attributes.update({0xE000: ("lift_duration", t.uint16_t)})
32-
33-
# def __init__(self, *args, **kwargs):
34-
# """Initialize instance."""
35-
# super().__init__(*args, **kwargs)
36-
# self.endpoint.device.cover_bus.add_listener(self)
37-
38-
# def cover_event(self, attribute, value):
39-
# """Event listener for cover events."""
40-
# if attribute == "lift_duration":
41-
# lift_duration_attr = self._attr_cache.get("lift_duration") == 1
42-
# self._update_attribute(attribute, value)
43-
# _LOGGER.debug(
44-
# "%s Schneider Attribute Cache : [%s]",
45-
# self.endpoint.device.ieee,
46-
# self._attr_cache,
47-
# )
96+
attributes.update(
97+
{
98+
ATT_ID_FFFD: ("57344", t.uint16_t)
99+
}, # attribute_name:"57344" # seems to be lift_duration
100+
{ATT_ID_E000: ("65533", t.uint16_t)}, # attribute_name:"65533"
101+
{ATT_ID_E010: ("57360", t.bitmap8)}, # attribute_name:"57360"
102+
{ATT_ID_E012: ("57362", t.uint16_t)}, # attribute_name:"57362"
103+
{ATT_ID_E013: ("57363", t.bitmap8)}, # attribute_name:"57363"
104+
{ATT_ID_E014: ("57364", t.uint16_t)}, # attribute_name:"57364"
105+
{ATT_ID_E015: ("57365", t.uint16_t)}, # attribute_name:"57365"
106+
{ATT_ID_E016: ("57366", t.uint16_t)}, # attribute_name:"57366"
107+
{ATT_ID_E017: ("57367", t.uint8_t)}, # attribute_name:"57367"
108+
)
109+
110+
111+
class SEDiagnostic(CustomCluster, Diagnostic):
112+
113+
ATT_ID_FFFD = 0xFFFD
114+
115+
attributes = Diagnostic.attributes.copy()
116+
117+
# TODO: Check -> this attr don't seems to be manufacturer related (no "manf_id")
118+
attributes.update(
119+
{ATT_ID_FFFD: ("65533", t.uint16_t)}, # attribute_name:"65533"
120+
)

zhaquirks/schneiderelectric/shutters.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Quirk for shutters."""
22
from zigpy.profiles import zha
3-
from zigpy.quirks import CustomCluster, CustomDevice
3+
from zigpy.quirks import CustomDevice
44
from zigpy.zcl.clusters.closures import WindowCovering
55
from zigpy.zcl.clusters.general import (
66
Basic,
@@ -14,10 +14,7 @@
1414
)
1515
from zigpy.zcl.clusters.homeautomation import (
1616
Diagnostic,
17-
ElectricalMeasurement,
18-
MeterIdentification,
1917
)
20-
from zigpy.zcl.clusters.smartenergy import Metering
2118

2219
from zhaquirks.const import (
2320
DEVICE_TYPE,

zhaquirks/schneiderelectric/switches.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Quirk for shutters."""
22
from zigpy.profiles import zha
3-
from zigpy.quirks import CustomCluster, CustomDevice
3+
from zigpy.quirks import CustomDevice
44
from zigpy.zcl.clusters.closures import WindowCovering
55
from zigpy.zcl.clusters.general import (
66
Basic,
@@ -14,10 +14,7 @@
1414
)
1515
from zigpy.zcl.clusters.homeautomation import (
1616
Diagnostic,
17-
ElectricalMeasurement,
18-
MeterIdentification,
1917
)
20-
from zigpy.zcl.clusters.smartenergy import Metering
2118

2219
from zhaquirks.const import (
2320
DEVICE_TYPE,

0 commit comments

Comments
 (0)