Skip to content

Commit 895bb89

Browse files
authored
Add Tuya outdoor temp humidity sensor _TZE204_upagmta9 (#3709)
1 parent 068cf83 commit 895bb89

File tree

2 files changed

+59
-35
lines changed

2 files changed

+59
-35
lines changed

tests/test_tuya_sensor.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@
99
from zhaquirks.tuya import TuyaLocalCluster
1010
from zhaquirks.tuya.mcu import TuyaMCUCluster
1111

12+
# Temp DP 1, Humidity DP 2, Battery DP 3
13+
TUYA_TEMP01_HUM02_BAT03 = b"\x09\xe0\x02\x0b\x33\x01\x02\x00\x04\x00\x00\x00\xfd\x02\x02\x00\x04\x00\x00\x00\x47\x03\x02\x00\x04\x00\x00\x00\x01"
14+
# Temp DP 1, Humidity DP 2, Battery DP 4
15+
TUYA_TEMP01_HUM02_BAT04 = b"\x09\xe0\x02\x0b\x33\x01\x02\x00\x04\x00\x00\x00\xfd\x02\x02\x00\x04\x00\x00\x00\x47\x04\x02\x00\x04\x00\x00\x00\x01"
16+
TUYA_USP = b"\x09\xe0\x02\x0b\x33\x01\x02\x00\x04\x00\x00\x00\xfd\x02\x02\x00\x04\x00\x00\x00\x47\xff\x02\x00\x04\x00\x00\x00\x64"
17+
18+
ZCL_TUYA_VERSION_RSP = b"\x09\x06\x11\x01\x6d\x82"
19+
1220
zhaquirks.setup()
1321

1422

@@ -74,8 +82,7 @@ async def test_handle_get_data(
7482
== data.data.datapoints[2].data.payload * 2
7583
)
7684

77-
message = b"\x09\xe0\x02\x0b\x33\x01\x02\x00\x04\x00\x00\x00\xfd\x02\x02\x00\x04\x00\x00\x00\x47\xff\x02\x00\x04\x00\x00\x00\x64"
78-
hdr, data = ep.tuya_manufacturer.deserialize(message)
85+
hdr, data = ep.tuya_manufacturer.deserialize(TUYA_USP)
7986

8087
status = ep.tuya_manufacturer.handle_get_data(data.data)
8188
assert status == foundation.Status.UNSUPPORTED_ATTRIBUTE
@@ -91,19 +98,21 @@ async def test_handle_get_data(
9198

9299

93100
@pytest.mark.parametrize(
94-
"model,manuf,rh_scale,temp_scale",
101+
"model,manuf,rh_scale,temp_scale,state_rpt",
95102
[
96-
("_TZE200_yjjdcqsq", "TS0601", 100, 10),
97-
("_TZE200_9yapgbuv", "TS0601", 100, 10),
98-
("_TZE204_yjjdcqsq", "TS0601", 100, 10),
99-
("_TZE200_utkemkbs", "TS0601", 100, 10),
100-
("_TZE204_utkemkbs", "TS0601", 100, 10),
101-
("_TZE204_yjjdcqsq", "TS0601", 100, 10),
102-
("_TZE204_ksz749x8", "TS0601", 100, 10),
103+
("_TZE200_yjjdcqsq", "TS0601", 100, 10, TUYA_TEMP01_HUM02_BAT04),
104+
("_TZE200_9yapgbuv", "TS0601", 100, 10, TUYA_TEMP01_HUM02_BAT04),
105+
("_TZE204_yjjdcqsq", "TS0601", 100, 10, TUYA_TEMP01_HUM02_BAT04),
106+
("_TZE200_utkemkbs", "TS0601", 100, 10, TUYA_TEMP01_HUM02_BAT04),
107+
("_TZE204_utkemkbs", "TS0601", 100, 10, TUYA_TEMP01_HUM02_BAT04),
108+
("_TZE204_yjjdcqsq", "TS0601", 100, 10, TUYA_TEMP01_HUM02_BAT04),
109+
("_TZE204_ksz749x8", "TS0601", 100, 10, TUYA_TEMP01_HUM02_BAT04),
110+
("_TZE204_upagmta9", "TS0601", 100, 10, TUYA_TEMP01_HUM02_BAT03),
111+
("_TZE204_upagmta9", "TS0601", 100, 10, TUYA_TEMP01_HUM02_BAT03),
103112
],
104113
)
105114
async def test_handle_get_data_enum_batt(
106-
zigpy_device_from_v2_quirk, model, manuf, rh_scale, temp_scale
115+
zigpy_device_from_v2_quirk, model, manuf, rh_scale, temp_scale, state_rpt
107116
):
108117
"""Test handle_get_data for multiple attributes - enum battery."""
109118

@@ -116,8 +125,7 @@ async def test_handle_get_data_enum_batt(
116125
assert ep.tuya_manufacturer is not None
117126
assert isinstance(ep.tuya_manufacturer, TuyaMCUCluster)
118127

119-
message = b"\x09\xe0\x02\x0b\x33\x01\x02\x00\x04\x00\x00\x00\xfd\x02\x02\x00\x04\x00\x00\x00\x47\x04\x02\x00\x04\x00\x00\x00\x01"
120-
hdr, data = ep.tuya_manufacturer.deserialize(message)
128+
hdr, data = ep.tuya_manufacturer.deserialize(state_rpt)
121129

122130
status = ep.tuya_manufacturer.handle_get_data(data.data)
123131

@@ -135,8 +143,7 @@ async def test_handle_get_data_enum_batt(
135143

136144
assert ep.power.get("battery_percentage_remaining") == 100
137145

138-
message = b"\x09\xe0\x02\x0b\x33\x01\x02\x00\x04\x00\x00\x00\xfd\x02\x02\x00\x04\x00\x00\x00\x47\xff\x02\x00\x04\x00\x00\x00\x64"
139-
hdr, data = ep.tuya_manufacturer.deserialize(message)
146+
hdr, data = ep.tuya_manufacturer.deserialize(TUYA_USP)
140147

141148
status = ep.tuya_manufacturer.handle_get_data(data.data)
142149
assert status == foundation.Status.UNSUPPORTED_ATTRIBUTE

zhaquirks/tuya/tuya_sensor.py

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,26 @@ class TuyaNousTempHumiAlarm(t.enum8):
3333
Canceled = 0x02
3434

3535

36+
class NoManufTimeTuyaMCUCluster(TuyaMCUCluster):
37+
"""Tuya Manufacturer Cluster with set_time mod."""
38+
39+
set_time_offset = 1970
40+
set_time_local_offset = 1970
41+
42+
# Deepcopy required to override 'set_time', without, it will revert
43+
server_commands = copy.deepcopy(TuyaMCUCluster.server_commands)
44+
server_commands.update(
45+
{
46+
TUYA_SET_TIME: foundation.ZCLCommandDef(
47+
"set_time",
48+
{"time": TuyaTimePayload},
49+
False,
50+
is_manufacturer_specific=False,
51+
),
52+
}
53+
)
54+
55+
3656
(
3757
TuyaQuirkBuilder("_TZE200_bjawzodf", "TS0601")
3858
.applies_to("_TZE200_zl1kmjqx", "TS0601")
@@ -89,26 +109,6 @@ class TuyaNousTempHumiAlarm(t.enum8):
89109
)
90110

91111

92-
class NoManufTimeTuyaMCUCluster(TuyaMCUCluster):
93-
"""Tuya Manufacturer Cluster with set_time mod."""
94-
95-
set_time_offset = 1970
96-
set_time_local_offset = 1970
97-
98-
# Deepcopy required to override 'set_time', without, it will revert
99-
server_commands = copy.deepcopy(TuyaMCUCluster.server_commands)
100-
server_commands.update(
101-
{
102-
TUYA_SET_TIME: foundation.ZCLCommandDef(
103-
"set_time",
104-
{"time": TuyaTimePayload},
105-
False,
106-
is_manufacturer_specific=False,
107-
),
108-
}
109-
)
110-
111-
112112
# TH01Z - Temperature and humidity sensor with clock
113113
(
114114
TuyaQuirkBuilder("_TZE200_lve3dvpy", "TS0601")
@@ -311,3 +311,20 @@ class NoManufTimeTuyaMCUCluster(TuyaMCUCluster):
311311
.skip_configuration()
312312
.add_to_registry()
313313
)
314+
315+
316+
(
317+
TuyaQuirkBuilder("_TZE204_upagmta9", "TS0601")
318+
.tuya_temperature(dp_id=1, scale=10)
319+
.tuya_humidity(dp_id=2)
320+
.tuya_dp(
321+
dp_id=3,
322+
ep_attribute=TuyaPowerConfigurationCluster2AAA.ep_attribute,
323+
attribute_name="battery_percentage_remaining",
324+
converter=lambda x: {0: 50, 1: 100, 2: 200}[x],
325+
)
326+
.adds(TuyaPowerConfigurationCluster2AAA)
327+
.tuya_enchantment(data_query_spell=True)
328+
.skip_configuration()
329+
.add_to_registry()
330+
)

0 commit comments

Comments
 (0)