Skip to content

Commit ad6697a

Browse files
committed
Add V2 Quirk for telink devices with cfw
1 parent e61ecbb commit ad6697a

File tree

2 files changed

+205
-0
lines changed

2 files changed

+205
-0
lines changed

zhaquirks/custom/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"""Quirks for diy devices or with custom firmware."""

zhaquirks/custom/telink.py

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
"""Telink TLSR825x based devices with custom firmware.
2+
3+
see https://github.com/pvvx/ZigbeeTLc
4+
"""
5+
6+
from zigpy.quirks.v2 import QuirkBuilder
7+
from zigpy.quirks.v2.homeassistant import UnitOfTemperature, UnitOfTime
8+
import zigpy.types as t
9+
from zigpy.zcl import ClusterType
10+
from zigpy.zcl.clusters.hvac import UserInterface
11+
from zigpy.zcl.foundation import ZCLAttributeDef
12+
13+
from zhaquirks import CustomCluster
14+
15+
16+
class Display(t.enum8):
17+
"""Turn off the display."""
18+
19+
Off = 0x01
20+
On = 0x00
21+
22+
23+
class CustomUserInterfaceCluster(CustomCluster, UserInterface):
24+
"""Custom User Interface Cluster with smiley control."""
25+
26+
class AttributeDefs(UserInterface.AttributeDefs):
27+
"""Attribute Definitions."""
28+
29+
# display. 0 - display is off, 1 - display is on
30+
display = ZCLAttributeDef(
31+
id=0x0106,
32+
type=Display,
33+
access="rw",
34+
is_manufacturer_specific=True,
35+
)
36+
37+
# comfort temperature min: A value in 0.01ºC to set minimum comfort temperature for happy face
38+
comfort_temperature_min = ZCLAttributeDef(
39+
id=0x0102,
40+
type=t.int16s,
41+
access="rw",
42+
is_manufacturer_specific=True,
43+
)
44+
45+
# comfort temperature max: A value in 0.01ºC to set maximum comfort temperature for happy face
46+
comfort_temperature_max = ZCLAttributeDef(
47+
id=0x0103,
48+
type=t.int16s,
49+
access="rw",
50+
is_manufacturer_specific=True,
51+
)
52+
53+
# comfort humidity min: A value in 0.01%RH to set minimum comfort humidity for happy face
54+
comfort_humidity_min = ZCLAttributeDef(
55+
id=0x0104,
56+
type=t.uint16_t,
57+
access="rw",
58+
is_manufacturer_specific=True,
59+
)
60+
61+
# comfort humidity max: A value in 0.01%RH to set maximum comfort humidity for happy face
62+
comfort_humidity_max = ZCLAttributeDef(
63+
id=0x0105,
64+
type=t.uint16_t,
65+
access="rw",
66+
is_manufacturer_specific=True,
67+
)
68+
69+
# A value in 0.01ºC offset to fix up incorrect values from sensor
70+
temperature_offset = ZCLAttributeDef(
71+
id=0x0100,
72+
type=t.int16s,
73+
access="rw",
74+
is_manufacturer_specific=True,
75+
)
76+
77+
# A value in 0.01%RH offset to fix up incorrect values from sensor
78+
humidity_offset = ZCLAttributeDef(
79+
id=0x0101,
80+
type=t.int16s,
81+
access="rw",
82+
is_manufacturer_specific=True,
83+
)
84+
# Measurement interval, step 1 second, range: 3..255 seconds. Default 10 seconds.
85+
measurement_interval = ZCLAttributeDef(
86+
id=0x0107,
87+
type=t.uint8_t,
88+
access="rw",
89+
is_manufacturer_specific=True,
90+
)
91+
92+
93+
(
94+
QuirkBuilder("MiaoMiaoCe", "MHO-C401N-z")
95+
.applies_to("MiaoMiaoCe", "MHO-C401-z")
96+
.applies_to("Xiaomi", "LYWSD03MMC-z")
97+
.applies_to("Tuya", "TS0201-z")
98+
.applies_to("Tuya", "TH03Z-z")
99+
.applies_to("Tuya", "ZTH01-z")
100+
.applies_to("Tuya", "ZTH02-z")
101+
.applies_to("Tuya", "LKTMZL02-z")
102+
.applies_to("Sonoff", "TH03-z")
103+
.applies_to("MiaoMiaoCe", "MHO-C122-z")
104+
.applies_to("Qingping", "CGDK2-z")
105+
.removes(CustomUserInterfaceCluster.cluster_id, cluster_type=ClusterType.Client)
106+
.adds(CustomUserInterfaceCluster)
107+
.number(
108+
CustomUserInterfaceCluster.AttributeDefs.temperature_offset.name,
109+
CustomUserInterfaceCluster.cluster_id,
110+
min_value=-327.67,
111+
max_value=327.67,
112+
step=0.01,
113+
unit=UnitOfTemperature.CELSIUS,
114+
translation_key="temperature_offset",
115+
fallback_name="Temperature offset",
116+
multiplier=0.01,
117+
mode="box",
118+
)
119+
.number(
120+
CustomUserInterfaceCluster.AttributeDefs.humidity_offset.name,
121+
CustomUserInterfaceCluster.cluster_id,
122+
min_value=-327.67,
123+
max_value=327.67,
124+
step=0.01,
125+
# unit=PERCENTAGE,
126+
translation_key="humidity_offset",
127+
fallback_name="Humidity offset",
128+
multiplier=0.01,
129+
mode="box",
130+
)
131+
.number(
132+
CustomUserInterfaceCluster.AttributeDefs.comfort_temperature_min.name,
133+
CustomUserInterfaceCluster.cluster_id,
134+
min_value=-327.67,
135+
max_value=327.67,
136+
step=0.01,
137+
unit=UnitOfTemperature.CELSIUS,
138+
translation_key="comfort_temperature_min",
139+
fallback_name="Comfort temperature min",
140+
multiplier=0.01,
141+
mode="box",
142+
)
143+
.number(
144+
CustomUserInterfaceCluster.AttributeDefs.comfort_temperature_max.name,
145+
CustomUserInterfaceCluster.cluster_id,
146+
min_value=-327.67,
147+
max_value=327.67,
148+
step=0.01,
149+
unit=UnitOfTemperature.CELSIUS,
150+
translation_key="comfort_temperature_max",
151+
fallback_name="Comfort temperature max",
152+
multiplier=0.01,
153+
mode="box",
154+
)
155+
.number(
156+
CustomUserInterfaceCluster.AttributeDefs.comfort_humidity_min.name,
157+
CustomUserInterfaceCluster.cluster_id,
158+
min_value=0,
159+
max_value=99,
160+
step=1,
161+
# unit=PERCENTAGE,
162+
translation_key="comfort_humidity_min",
163+
fallback_name="Comfort humidity min",
164+
multiplier=0.01,
165+
mode="box",
166+
)
167+
.number(
168+
CustomUserInterfaceCluster.AttributeDefs.comfort_humidity_max.name,
169+
CustomUserInterfaceCluster.cluster_id,
170+
min_value=0,
171+
max_value=99,
172+
step=1,
173+
# unit=PERCENTAGE,
174+
translation_key="comfort_humidity_max",
175+
fallback_name="Comfort humidity max",
176+
multiplier=0.01,
177+
mode="box",
178+
)
179+
.number(
180+
CustomUserInterfaceCluster.AttributeDefs.measurement_interval.name,
181+
CustomUserInterfaceCluster.cluster_id,
182+
min_value=3,
183+
max_value=255,
184+
unit=UnitOfTime.SECONDS,
185+
translation_key="measurement_interval",
186+
fallback_name="Measurement interval",
187+
mode="box",
188+
)
189+
.switch(
190+
CustomUserInterfaceCluster.AttributeDefs.display.name,
191+
CustomUserInterfaceCluster.cluster_id,
192+
off_value=1,
193+
on_value=0,
194+
translation_key="display_enabled",
195+
fallback_name="Display enabled",
196+
)
197+
.switch(
198+
CustomUserInterfaceCluster.AttributeDefs.schedule_programming_visibility.name,
199+
CustomUserInterfaceCluster.cluster_id,
200+
translation_key="show_smiley",
201+
fallback_name="Show smiley",
202+
)
203+
.add_to_registry()
204+
)

0 commit comments

Comments
 (0)