Skip to content

Commit

Permalink
Initial GX02 Irrigation Valve (V2Quirk)
Browse files Browse the repository at this point in the history
  • Loading branch information
prairiesnpr committed Oct 7, 2024
1 parent a06e204 commit 693aa6d
Show file tree
Hide file tree
Showing 4 changed files with 286 additions and 97 deletions.
2 changes: 1 addition & 1 deletion requirements_test.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ pytest-sugar
pytest-timeout
pytest-asyncio
pytest>=7.1.3
zigpy>=0.66.0
zigpy>=0.67.0
ruff==0.0.261
57 changes: 56 additions & 1 deletion tests/test_tuya_valve.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
"""Tests for Tuya quirks."""

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

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

from tests.common import ClusterListener, wait_for_zigpy_tasks
import zhaquirks
import zhaquirks.tuya
import zhaquirks.tuya.ts0601_valve

zhaquirks.setup()

Expand Down Expand Up @@ -114,3 +119,53 @@ async def test_report_values_psbzs(zigpy_device_from_quirk, quirk):
assert tuya_listener.attribute_updates[2][1] == 0 # frost lock state is inverted
assert tuya_listener.attribute_updates[3][0] == 0xEF13
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_dt("--:--:--") 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_dt("20:12:01")
== datetime.fromisoformat("2024-10-02T12:10:23+04:00").timestamp()
+ zhaquirks.tuya.ts0601_valve.UNIX_EPOCH_TO_ZCL_EPOCH
)
2 changes: 1 addition & 1 deletion zhaquirks/tuya/mcu/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,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

0 comments on commit 693aa6d

Please sign in to comment.