Skip to content

Commit c99f86b

Browse files
authored
Add Nous (Tuya) SZ-T04 (#3683)
1 parent 6c5fc22 commit c99f86b

File tree

4 files changed

+384
-126
lines changed

4 files changed

+384
-126
lines changed

tests/test_tuya_builder.py

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""Tests for TuyaQuirkBuilder."""
22

3+
import datetime
34
from unittest import mock
45

56
import pytest
@@ -9,10 +10,11 @@
910
from zigpy.zcl import foundation
1011
from zigpy.zcl.clusters.general import Basic, BatterySize
1112

12-
from tests.common import ClusterListener, wait_for_zigpy_tasks
13+
from tests.common import ClusterListener, MockDatetime, wait_for_zigpy_tasks
1314
import zhaquirks
1415
from zhaquirks.tuya import (
1516
TUYA_QUERY_DATA,
17+
TUYA_SET_TIME,
1618
TuyaPowerConfigurationCluster,
1719
TuyaPowerConfigurationCluster2AAA,
1820
)
@@ -31,6 +33,9 @@
3133
TuyaValveWaterConsumed,
3234
)
3335
from zhaquirks.tuya.mcu import TuyaMCUCluster, TuyaOnOffNM
36+
from zhaquirks.tuya.tuya_sensor import NoManufTimeTuyaMCUCluster
37+
38+
ZCL_TUYA_SET_TIME = b"\x09\x12\x24\x0d\x00"
3439

3540
zhaquirks.setup()
3641

@@ -140,6 +145,9 @@ class TestEnum(t.enum8):
140145
A = 0x00
141146
B = 0x01
142147

148+
class ModTuyaMCUCluster(TuyaMCUCluster):
149+
"""Modified Cluster."""
150+
143151
entry = (
144152
TuyaQuirkBuilder(device_mock.manufacturer, device_mock.model, registry=registry)
145153
.tuya_battery(dp_id=1)
@@ -178,7 +186,7 @@ class TestEnum(t.enum8):
178186
fallback_name="Test enum",
179187
)
180188
.skip_configuration()
181-
.add_to_registry()
189+
.add_to_registry(replacement_cluster=ModTuyaMCUCluster)
182190
)
183191

184192
# coverage for overridden __eq__ method
@@ -195,6 +203,7 @@ class TestEnum(t.enum8):
195203
assert isinstance(ep.basic, Basic)
196204

197205
assert ep.tuya_manufacturer is not None
206+
assert isinstance(ep.tuya_manufacturer, ModTuyaMCUCluster)
198207
assert isinstance(ep.tuya_manufacturer, TuyaMCUCluster)
199208

200209
tuya_cluster = ep.tuya_manufacturer
@@ -303,3 +312,49 @@ async def test_tuya_spell(device_mock, read_attr_spell, data_query_spell):
303312
messages += 1
304313

305314
request_mock.reset_mock()
315+
316+
317+
async def test_tuya_mcu_set_time(device_mock):
318+
"""Test TuyaQuirkBuilder replacement cluster, set_time requests (0x24) messages for MCU devices."""
319+
320+
registry = DeviceRegistry()
321+
322+
(
323+
TuyaQuirkBuilder(device_mock.manufacturer, device_mock.model, registry=registry)
324+
.tuya_battery(dp_id=1)
325+
.skip_configuration()
326+
.add_to_registry(replacement_cluster=NoManufTimeTuyaMCUCluster)
327+
)
328+
329+
quirked = registry.get_device(device_mock)
330+
assert isinstance(quirked, CustomDeviceV2)
331+
assert quirked in registry
332+
333+
ep = quirked.endpoints[1]
334+
335+
assert not ep.tuya_manufacturer._is_manuf_specific
336+
assert not ep.tuya_manufacturer.server_commands[
337+
TUYA_SET_TIME
338+
].is_manufacturer_specific
339+
340+
# Mock datetime
341+
origdatetime = datetime.datetime
342+
datetime.datetime = MockDatetime
343+
344+
# simulate a SET_TIME message
345+
hdr, args = ep.tuya_manufacturer.deserialize(ZCL_TUYA_SET_TIME)
346+
assert hdr.command_id == TUYA_SET_TIME
347+
348+
with mock.patch.object(
349+
ep.tuya_manufacturer._endpoint,
350+
"request",
351+
return_value=foundation.Status.SUCCESS,
352+
) as m1:
353+
ep.tuya_manufacturer.handle_message(hdr, args)
354+
await wait_for_zigpy_tasks()
355+
356+
res_hdr = foundation.ZCLHeader.deserialize(m1.await_args[1]["data"])
357+
assert not res_hdr[0].manufacturer
358+
assert not res_hdr[0].frame_control.is_manufacturer_specific
359+
360+
datetime.datetime = origdatetime # restore datetime

tests/test_tuya_sensor.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@
2828
("_TZE200_bq5c8xfe", "TS0601", 100, 10, True),
2929
("_TZE200_vs0skpuc", "TS0601", 100, 10, True),
3030
("_TZE200_44af8vyi", "TS0601", 100, 10, True),
31+
("_TZE200_lve3dvpy", "TS0601", 100, 10, False), # TH01Z - Temp & humid w/ clock
32+
("_TZE200_c7emyjom", "TS0601", 100, 10, False),
33+
("_TZE200_locansqn", "TS0601", 100, 10, False),
34+
("_TZE200_qrztc3ev", "TS0601", 100, 10, False),
35+
("_TZE200_snloy4rw", "TS0601", 100, 10, False),
36+
("_TZE200_eanjj2pa", "TS0601", 100, 10, False),
37+
("_TZE200_ydrdfkim", "TS0601", 100, 10, False),
38+
("_TZE284_locansqn", "TS0601", 100, 10, False),
3139
],
3240
)
3341
async def test_handle_get_data(

zhaquirks/tuya/ts0601_sensor.py

Lines changed: 0 additions & 124 deletions
This file was deleted.

0 commit comments

Comments
 (0)