Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 54 additions & 1 deletion tests/test_tuya_valve.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
"""Tests for Tuya quirks."""

from datetime import datetime, timezone
from unittest import mock
from unittest.mock import patch

import pytest
from zigpy.quirks.v2 import EntityMetadata
import zigpy.types as t
from zigpy.zcl import foundation
from zigpy.zcl import ClusterType, foundation

from tests.common import ClusterListener, wait_for_zigpy_tasks
import zhaquirks
Expand Down Expand Up @@ -131,6 +134,56 @@ async def test_report_values_psbzs(zigpy_device_from_quirk, quirk):
assert tuya_listener.attribute_updates[3][1] == 1 # frost lock state is inverted


@pytest.mark.parametrize(
"model,manuf,use_minutes",
[
("_TZE200_sh1btabb", "TS0601", True),
("_TZE200_a7sghmms", "TS0601", False),
("_TZE204_a7sghmms", "TS0601", False),
("_TZE200_7ytb3h8u", "TS0601", False),
("_TZE204_7ytb3h8u", "TS0601", False),
("_TZE284_7ytb3h8u", "TS0601", False),
],
)
async def test_giex_02_quirk(zigpy_device_from_v2_quirk, model, manuf, use_minutes):
"""Test Giex GX02 Valve Quirk."""

quirked_device = zigpy_device_from_v2_quirk(model, manuf)
metering_cluster = quirked_device.endpoints[1].smartenergy_metering
assert metering_cluster.unsupported_attributes == {0x0400, "instantaneous_demand"}
for entity in range(6, 8):
number_metadata: EntityMetadata = quirked_device.exposes_metadata[
(1, zhaquirks.tuya.TUYA_CLUSTER_ID, ClusterType.Server)
][entity]

if not use_minutes:
assert number_metadata.max == zhaquirks.tuya.ts0601_valve.GIEX_12HRS_AS_SEC
else:
assert number_metadata.max == zhaquirks.tuya.ts0601_valve.GIEX_24HRS_AS_MIN


async def test_giex_functions():
"""Test various Giex Valve functions."""
assert zhaquirks.tuya.ts0601_valve.giex_string_to_td("12:01:05,3") == 43265
assert zhaquirks.tuya.ts0601_valve.giex_string_to_ts("--:--:--") is None

class MockDatetime:
def now(self, tz: timezone):
"""Mock now."""
return datetime(2024, 10, 2, 12, 10, 23, tzinfo=tz)

def strptime(self, v: str, fmt: str):
"""Mock strptime."""
return datetime.strptime(v, fmt)

with patch("zhaquirks.tuya.ts0601_valve.datetime", MockDatetime()):
assert (
zhaquirks.tuya.ts0601_valve.giex_string_to_ts("20:12:01")
== datetime.fromisoformat("2024-10-02T12:10:23+04:00").timestamp()
+ zhaquirks.tuya.ts0601_valve.UNIX_EPOCH_TO_ZCL_EPOCH
)


@pytest.mark.parametrize(
"model,manuf",
[
Expand Down
5 changes: 4 additions & 1 deletion zhaquirks/tuya/builder/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,10 @@ class TuyaQuirkBuilder(QuirkBuilder):
"""Tuya QuirkBuilder."""

def __init__(
self, manufacturer: str, model: str, registry: DeviceRegistry = _DEVICE_REGISTRY
self,
manufacturer: str | None = None,
model: str | None = None,
registry: DeviceRegistry = _DEVICE_REGISTRY,
) -> None:
"""Init the TuyaQuirkBuilder."""
self.tuya_data_point_handlers: dict[int, str] = {}
Expand Down
2 changes: 1 addition & 1 deletion zhaquirks/tuya/mcu/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ class TuyaClusterData(t.Struct):
endpoint_id: int
cluster_name: str
cluster_attr: str
attr_value: int # Maybe also others types?
attr_value: int | str # Maybe also others types?
expect_reply: bool
manufacturer: int

Expand Down
Loading