Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Convert Giex GX02 quirk to V2 #3394

Draft
wants to merge 1 commit into
base: dev
Choose a base branch
from
Draft
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
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
Loading