Skip to content

Convert Tuya Sensors to TuyaQuirkBuilder format #3425

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

Merged
merged 7 commits into from
Oct 19, 2024
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
66 changes: 0 additions & 66 deletions tests/test_tuya.py
Original file line number Diff line number Diff line change
Expand Up @@ -1690,72 +1690,6 @@ def test_multiple_attributes_report():
assert data.data.datapoints[3].dp == 9


@pytest.mark.parametrize(
"quirk", (zhaquirks.tuya.ts0601_sensor.TuyaTempHumiditySensor,)
)
async def test_handle_get_data(zigpy_device_from_quirk, quirk):
"""Test handle_get_data for multiple attributes."""

ts0601_sensor = zigpy_device_from_quirk(quirk)
tuya_cluster = ts0601_sensor.endpoints[1].tuya_manufacturer

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\x64"
hdr, data = tuya_cluster.deserialize(message)

status = tuya_cluster.handle_get_data(data.data)
assert status == foundation.Status.SUCCESS

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"
hdr, data = tuya_cluster.deserialize(message)

status = tuya_cluster.handle_get_data(data.data)
assert status == foundation.Status.UNSUPPORTED_ATTRIBUTE


@pytest.mark.parametrize(
"quirk",
(zhaquirks.tuya.ts0601_sensor.TuyaTempHumiditySensor,),
)
@pytest.mark.parametrize(
"quirk_sq", (zhaquirks.tuya.ts0601_sensor.TuyaTempHumiditySensor_Square,)
)
async def test_rh_multiplier(zigpy_device_from_quirk, quirk, quirk_sq):
"""Test handle_get_data for multiple attributes."""

round_sensor = zigpy_device_from_quirk(quirk)
round_cluster = round_sensor.endpoints[1].tuya_manufacturer
round_humidity = round_sensor.endpoints[1].humidity

square_sensor = zigpy_device_from_quirk(quirk_sq)
square_cluster = square_sensor.endpoints[1].tuya_manufacturer
square_humidity = square_sensor.endpoints[1].humidity

message = b"\x19\x84\x01\x00\xa5\x02\x02\x00\x04\x00\x00\x02\x2c"

hdr, round_data = round_cluster.deserialize(message)
hdr, square_data = square_cluster.deserialize(message)

round_status = round_cluster.handle_get_data(round_data.data)
assert round_status == foundation.Status.SUCCESS

square_status = square_cluster.handle_get_data(square_data.data)
assert square_status == foundation.Status.SUCCESS

assert (
round_data.data.datapoints[0].data.payload
== square_data.data.datapoints[0].data.payload
)

assert (
round_humidity.get("measured_value")
== round_data.data.datapoints[0].data.payload * round_sensor.RH_MULTIPLIER
)
assert (
square_humidity.get("measured_value")
== square_data.data.datapoints[0].data.payload * 100
) # no square_sensor.RH_MULTIPLIER attribute


@mock.patch("zigpy.zcl.Cluster.bind", mock.AsyncMock())
@pytest.mark.parametrize(
"quirk",
Expand Down
117 changes: 117 additions & 0 deletions tests/test_tuya_sensor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
"""Tests for Tuya Sensor quirks."""

import pytest
from zigpy.zcl import foundation
from zigpy.zcl.clusters.general import Basic

import zhaquirks
import zhaquirks.tuya
from zhaquirks.tuya.mcu import TuyaMCUCluster

zhaquirks.setup()


@pytest.mark.parametrize(
"model,manuf,rh_scale,temp_scale",
[
("_TZE200_bjawzodf", "TS0601", 10, 10),
("_TZE200_zl1kmjqx", "TS0601", 10, 10),
("_TZE200_a8sdabtg", "TS0601", 100, 10), # Variant without screen, round
("_TZE200_qoy0ekbd", "TS0601", 100, 10),
("_TZE200_znbl8dj5", "TS0601", 100, 10),
("_TZE200_qyflbnbj", "TS0601", 100, 10),
("_TZE200_zppcgbdj", "TS0601", 100, 10),
],
)
async def test_handle_get_data(
zigpy_device_from_v2_quirk, model, manuf, rh_scale, temp_scale
):
"""Test handle_get_data for multiple attributes - normal battery."""

quirked = zigpy_device_from_v2_quirk(model, manuf)
ep = quirked.endpoints[1]

assert ep.basic is not None
assert isinstance(ep.basic, Basic)

assert ep.tuya_manufacturer is not None
assert isinstance(ep.tuya_manufacturer, TuyaMCUCluster)

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\x64"
hdr, data = ep.tuya_manufacturer.deserialize(message)

status = ep.tuya_manufacturer.handle_get_data(data.data)
assert status == foundation.Status.SUCCESS

assert (
ep.temperature.get("measured_value")
== data.data.datapoints[0].data.payload * temp_scale
)

assert (
ep.humidity.get("measured_value")
== data.data.datapoints[1].data.payload * rh_scale
)

assert (
ep.power.get("battery_percentage_remaining")
== data.data.datapoints[2].data.payload * 2
)

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"
hdr, data = ep.tuya_manufacturer.deserialize(message)

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


@pytest.mark.parametrize(
"model,manuf,rh_scale,temp_scale",
[
("_TZE200_yjjdcqsq", "TS0601", 100, 10),
("_TZE200_9yapgbuv", "TS0601", 100, 10),
("_TZE204_yjjdcqsq", "TS0601", 100, 10),
("_TZE200_utkemkbs", "TS0601", 100, 10),
("_TZE204_utkemkbs", "TS0601", 100, 10),
("_TZE204_yjjdcqsq", "TS0601", 100, 10),
("_TZE204_ksz749x8", "TS0601", 100, 10),
],
)
async def test_handle_get_data_enum_batt(
zigpy_device_from_v2_quirk, model, manuf, rh_scale, temp_scale
):
"""Test handle_get_data for multiple attributes - enum battery."""

quirked = zigpy_device_from_v2_quirk(model, manuf)
ep = quirked.endpoints[1]

assert ep.basic is not None
assert isinstance(ep.basic, Basic)

assert ep.tuya_manufacturer is not None
assert isinstance(ep.tuya_manufacturer, TuyaMCUCluster)

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"
hdr, data = ep.tuya_manufacturer.deserialize(message)

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

assert status == foundation.Status.SUCCESS

assert (
ep.temperature.get("measured_value")
== data.data.datapoints[0].data.payload * temp_scale
)

assert (
ep.humidity.get("measured_value")
== data.data.datapoints[1].data.payload * rh_scale
)

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

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"
hdr, data = ep.tuya_manufacturer.deserialize(message)

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