Skip to content

Commit d35fc05

Browse files
authored
Fix energy and current divisors for Innr plugs, clean up (#2782)
* Fix Metering divisor for Innr SP240 plug * Use `CustomCluster` for Innr 0xE001 manufacturer cluster This is to avoid test failure * Add docstring for `InnrCluster` * Move `MeteringClusterInnr` to main innr file This is so other devices will be able to use it too. * Add constant with "innr" manufacturer name * Replace local `MeteringCluster` with `MeteringClusterInnr` for SP120 * Change `ElectricalMeasurementCluster` for SP234 to use `AttributeDefs` * Also use modified `MeteringClusterInnr` for SP234 See comment in #2781 #2781 (comment) * Change `ElectricalMeasurementCluster` for SP120 to use `AttributeDefs` * Improve comment for SP234 plug * Slightly update comment * Align comments, class name with other Innr plug quirks * Move EM cluster classes into main Innr file to fix current divider * Update comment
1 parent 95a06d7 commit d35fc05

File tree

5 files changed

+145
-38
lines changed

5 files changed

+145
-38
lines changed

zhaquirks/innr/__init__.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,29 @@
11
"""Module for Innr quirks implementations."""
2+
from zigpy.quirks import CustomCluster
3+
from zigpy.zcl.clusters.homeautomation import ElectricalMeasurement
4+
from zigpy.zcl.clusters.smartenergy import Metering
5+
6+
INNR = "innr"
7+
8+
9+
class MeteringClusterInnr(CustomCluster, Metering):
10+
"""Provide constant multiplier and divisor.
11+
12+
The device seems to supply the summation_formatting attribute correctly, but ZHA doesn't use it for kWh for now.
13+
"""
14+
15+
_CONSTANT_ATTRIBUTES = {
16+
Metering.AttributeDefs.multiplier.id: 1,
17+
Metering.AttributeDefs.divisor.id: 100,
18+
}
19+
20+
21+
class ElectricalMeasurementClusterInnr(CustomCluster, ElectricalMeasurement):
22+
"""Fix multiplier and divisor for AC current and power."""
23+
24+
_CONSTANT_ATTRIBUTES = {
25+
ElectricalMeasurement.AttributeDefs.ac_current_multiplier.id: 1,
26+
ElectricalMeasurement.AttributeDefs.ac_current_divisor.id: 1000,
27+
ElectricalMeasurement.AttributeDefs.ac_power_divisor.id: 1,
28+
ElectricalMeasurement.AttributeDefs.ac_power_multiplier.id: 1,
29+
}

zhaquirks/innr/innr_sp120_plug.py

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Innr SP 120 plug."""
22
from zigpy.profiles import zll
3-
from zigpy.quirks import CustomCluster, CustomDevice
3+
from zigpy.quirks import CustomDevice
44
from zigpy.zcl.clusters.general import (
55
Basic,
66
Groups,
@@ -23,31 +23,14 @@
2323
OUTPUT_CLUSTERS,
2424
PROFILE_ID,
2525
)
26-
27-
MANUFACTURER = "innr"
28-
MODEL = "SP 120"
29-
30-
31-
class MeteringCluster(CustomCluster, Metering):
32-
"""Fix multiplier and divisor."""
33-
34-
MULTIPLIER = 0x0301
35-
DIVISOR = 0x0302
36-
_CONSTANT_ATTRIBUTES = {MULTIPLIER: 1, DIVISOR: 100}
37-
38-
39-
class ElectricalMeasurementCluster(CustomCluster, ElectricalMeasurement):
40-
"""Fix multiplier and divisor."""
41-
42-
MULTIPLIER = 0x0602
43-
DIVISOR = 0x0603
44-
_CONSTANT_ATTRIBUTES = {MULTIPLIER: 1, DIVISOR: 1000}
26+
from zhaquirks.innr import INNR, ElectricalMeasurementClusterInnr, MeteringClusterInnr
4527

4628

4729
class SP120(CustomDevice):
4830
"""Innr SP 120 smart plug."""
4931

5032
signature = {
33+
MODELS_INFO: [(INNR, "SP 120")],
5134
ENDPOINTS: {
5235
1: {
5336
PROFILE_ID: zll.PROFILE_ID,
@@ -78,7 +61,6 @@ class SP120(CustomDevice):
7861
OUTPUT_CLUSTERS: [],
7962
},
8063
},
81-
MODELS_INFO: [(MANUFACTURER, MODEL)],
8264
}
8365

8466
replacement = {
@@ -88,11 +70,11 @@ class SP120(CustomDevice):
8870
DEVICE_TYPE: zll.DeviceType.ON_OFF_PLUGIN_UNIT,
8971
INPUT_CLUSTERS: [
9072
Basic.cluster_id,
91-
ElectricalMeasurementCluster,
73+
ElectricalMeasurementClusterInnr,
9274
Groups.cluster_id,
9375
Identify.cluster_id,
9476
LevelControl.cluster_id,
95-
MeteringCluster,
77+
MeteringClusterInnr,
9678
OnOff.cluster_id,
9779
Scenes.cluster_id,
9880
Time.cluster_id,

zhaquirks/innr/innr_sp234_plug.py

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Innr SP 234 plug."""
22
from zigpy.profiles import zgp, zha
3-
from zigpy.quirks import CustomCluster, CustomDevice
3+
from zigpy.quirks import CustomDevice
44
from zigpy.zcl.clusters.general import (
55
Basic,
66
GreenPowerProxy,
@@ -23,22 +23,14 @@
2323
OUTPUT_CLUSTERS,
2424
PROFILE_ID,
2525
)
26-
27-
MANUFACTURER = "innr"
28-
MODEL = "SP 234"
29-
30-
31-
class ElectricalMeasurementCluster(CustomCluster, ElectricalMeasurement):
32-
"""Fix divisor."""
33-
34-
AC_POWER_DIVISOR = 0x0605
35-
_CONSTANT_ATTRIBUTES = {AC_POWER_DIVISOR: 1}
26+
from zhaquirks.innr import INNR, ElectricalMeasurementClusterInnr, MeteringClusterInnr
3627

3728

3829
class SP234(CustomDevice):
3930
"""Innr SP 234 smart plug."""
4031

4132
signature = {
33+
MODELS_INFO: [(INNR, "SP 234")],
4234
ENDPOINTS: {
4335
1: {
4436
PROFILE_ID: zha.PROFILE_ID,
@@ -69,7 +61,6 @@ class SP234(CustomDevice):
6961
OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],
7062
},
7163
},
72-
MODELS_INFO: [(MANUFACTURER, MODEL)],
7364
}
7465

7566
replacement = {
@@ -83,8 +74,8 @@ class SP234(CustomDevice):
8374
Groups.cluster_id,
8475
Scenes.cluster_id,
8576
OnOff.cluster_id,
86-
Metering.cluster_id,
87-
ElectricalMeasurementCluster,
77+
MeteringClusterInnr,
78+
ElectricalMeasurementClusterInnr,
8879
Diagnostic.cluster_id,
8980
LightLink.cluster_id,
9081
0xFC57,

zhaquirks/innr/innr_sp240_plug.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
"""Innr SP 240 plug."""
2+
3+
from zigpy.profiles import zgp, zha
4+
from zigpy.quirks import CustomCluster, CustomDevice
5+
from zigpy.zcl.clusters.general import (
6+
Basic,
7+
GreenPowerProxy,
8+
Groups,
9+
Identify,
10+
LevelControl,
11+
OnOff,
12+
Ota,
13+
Scenes,
14+
Time,
15+
)
16+
from zigpy.zcl.clusters.homeautomation import ElectricalMeasurement
17+
from zigpy.zcl.clusters.lightlink import LightLink
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.innr import INNR, MeteringClusterInnr
29+
30+
31+
class InnrCluster(CustomCluster):
32+
"""Innr manufacturer specific cluster."""
33+
34+
cluster_id = 0xE001
35+
36+
37+
class SP240(CustomDevice):
38+
"""Innr SP 240 smart plug."""
39+
40+
signature = {
41+
MODELS_INFO: [(INNR, "SP 240")],
42+
ENDPOINTS: {
43+
1: {
44+
PROFILE_ID: zha.PROFILE_ID,
45+
DEVICE_TYPE: zha.DeviceType.ON_OFF_PLUG_IN_UNIT,
46+
INPUT_CLUSTERS: [
47+
Basic.cluster_id,
48+
Identify.cluster_id,
49+
Groups.cluster_id,
50+
Scenes.cluster_id,
51+
OnOff.cluster_id,
52+
LevelControl.cluster_id,
53+
Metering.cluster_id,
54+
ElectricalMeasurement.cluster_id,
55+
LightLink.cluster_id,
56+
InnrCluster.cluster_id,
57+
],
58+
OUTPUT_CLUSTERS: [
59+
Time.cluster_id,
60+
Ota.cluster_id,
61+
],
62+
},
63+
242: {
64+
PROFILE_ID: zgp.PROFILE_ID,
65+
DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC,
66+
INPUT_CLUSTERS: [],
67+
OUTPUT_CLUSTERS: [
68+
GreenPowerProxy.cluster_id,
69+
],
70+
},
71+
},
72+
}
73+
74+
replacement = {
75+
ENDPOINTS: {
76+
1: {
77+
PROFILE_ID: zha.PROFILE_ID,
78+
DEVICE_TYPE: zha.DeviceType.ON_OFF_PLUG_IN_UNIT,
79+
INPUT_CLUSTERS: [
80+
Basic.cluster_id,
81+
Identify.cluster_id,
82+
Groups.cluster_id,
83+
Scenes.cluster_id,
84+
OnOff.cluster_id,
85+
LevelControl.cluster_id,
86+
MeteringClusterInnr,
87+
ElectricalMeasurement.cluster_id,
88+
LightLink.cluster_id,
89+
InnrCluster,
90+
],
91+
OUTPUT_CLUSTERS: [
92+
Time.cluster_id,
93+
Ota.cluster_id,
94+
],
95+
},
96+
242: {
97+
PROFILE_ID: zgp.PROFILE_ID,
98+
DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC,
99+
INPUT_CLUSTERS: [],
100+
OUTPUT_CLUSTERS: [
101+
GreenPowerProxy.cluster_id,
102+
],
103+
},
104+
},
105+
}

zhaquirks/innr/rs228t.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
OUTPUT_CLUSTERS,
2424
PROFILE_ID,
2525
)
26+
from zhaquirks.innr import INNR
2627

2728

2829
class RS228T(CustomDevice):
@@ -33,7 +34,7 @@ class RS228T(CustomDevice):
3334
# device_version=1
3435
# input_clusters=[0, 3, 4, 5, 6, 8, 768, 4096]
3536
# output_clusters=[25]>
36-
MODELS_INFO: [("innr", "RS 228 T")],
37+
MODELS_INFO: [(INNR, "RS 228 T")],
3738
ENDPOINTS: {
3839
1: {
3940
PROFILE_ID: zha.PROFILE_ID,

0 commit comments

Comments
 (0)