Skip to content

Commit

Permalink
Convert Tuya door quirk to v2, add tuya_vibration (#3796)
Browse files Browse the repository at this point in the history
  • Loading branch information
prairiesnpr authored Jan 28, 2025
1 parent ab4e4f5 commit 4d83f9c
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 244 deletions.
40 changes: 6 additions & 34 deletions tests/test_tuya.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import zhaquirks.tuya.ts0501_fan_switch
import zhaquirks.tuya.ts0601_electric_heating
import zhaquirks.tuya.ts0601_trv
import zhaquirks.tuya.ts601_door
import zhaquirks.tuya.ts1201
import zhaquirks.tuya.tuya_motion
import zhaquirks.tuya.tuya_valve
Expand Down Expand Up @@ -1955,67 +1954,43 @@ async def test_ts1201_ir_blaster(zigpy_device_from_quirk):
)


def test_ts601_door_sensor_signature(assert_signature_matches_quirk):
"""Test TS601 Vibration Door Sensor signature against quirk."""
signature = {
"node_descriptor": "NodeDescriptor(logical_type=<LogicalType.EndDevice: 2>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress: 128>, manufacturer_code=4417, maximum_buffer_size=66, maximum_incoming_transfer_size=66, server_mask=10752, maximum_outgoing_transfer_size=66, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False)",
"endpoints": {
"1": {
"profile_id": 260,
"device_type": "0x0051",
"in_clusters": ["0x0000", "0x0004", "0x0005", "0xef00"],
"out_clusters": ["0x000a", "0x0019"],
}
},
"manufacturer": "_TZE200_kzm5w4iz",
"model": "TS0601",
"class": "zigpy.device.Device",
}
assert_signature_matches_quirk(zhaquirks.tuya.ts601_door.TS0601Door, signature)


@pytest.mark.parametrize(
("data", "endpoint_id", "ep_attr", "attribute", "expected_value"),
("data", "ep_attr", "attribute", "expected_value"),
[
(
b"\t\xfc\x02\x007\x01\x01\x00\x01\x01",
zhaquirks.tuya.ts601_door.DOOR_HANDLE_EP_ID,
IasZone.ep_attribute,
IasZone.AttributeDefs.zone_status.id,
ZoneStatus.Alarm_1,
),
(
b"\t\xfc\x02\x007\x01\x01\x00\x01\x00",
zhaquirks.tuya.ts601_door.DOOR_HANDLE_EP_ID,
IasZone.ep_attribute,
IasZone.AttributeDefs.zone_status.id,
0x0000,
),
(
b"\t\xfc\x02\x007\n\x04\x00\x01\x01",
zhaquirks.tuya.ts601_door.VIBRATION_EP_ID,
IasZone.ep_attribute,
IasZone.AttributeDefs.zone_status.id,
ZoneStatus.Alarm_1,
),
(
b"\t\xfc\x02\x007\n\x04\x00\x01\x00",
zhaquirks.tuya.ts601_door.VIBRATION_EP_ID,
IasZone.ep_attribute,
IasZone.AttributeDefs.zone_status.id,
0x0000,
),
(
b"\to\x02\x00P\x03\x02\x00\x04\x00\x00\x00T",
zhaquirks.tuya.ts601_door.DP_HANDLER_EP_ID,
PowerConfiguration.ep_attribute,
PowerConfiguration.AttributeDefs.battery_percentage_remaining.id,
84 * 2,
),
],
)
async def test_ts601_door_sensor(
zigpy_device_from_quirk, data, endpoint_id, ep_attr, attribute, expected_value
zigpy_device_from_v2_quirk, data, ep_attr, attribute, expected_value
):
"""Test TS601 Vibration Door Sensor quirk.
Expand All @@ -2024,25 +1999,22 @@ async def test_ts601_door_sensor(
- Vibration On/Off
- Remaining battery percentage
"""
device: Device = zigpy_device_from_quirk(zhaquirks.tuya.ts601_door.TS0601Door)
device: Device = zigpy_device_from_v2_quirk("_TZE200_kzm5w4iz", "TS0601")
device._packet_debouncer.filter = mock.MagicMock(return_value=False)

dp_processor_ep = zhaquirks.tuya.ts601_door.DP_HANDLER_EP_ID
cluster = device.endpoints[dp_processor_ep].in_clusters[
TuyaNewManufCluster.cluster_id
]
cluster = device.endpoints[1].in_clusters[TuyaNewManufCluster.cluster_id]

with mock.patch.object(cluster, "send_default_rsp"):
device.packet_received(
t.ZigbeePacket(
profile_id=zha.PROFILE_ID,
src_ep=dp_processor_ep,
src_ep=1,
cluster_id=TuyaNewManufCluster.cluster_id,
data=t.SerializableBytes(data),
)
)

cluster = getattr(device.endpoints[endpoint_id], ep_attr)
cluster = getattr(device.endpoints[1], ep_attr)
attrs = await cluster.read_attributes(attributes=[attribute])

assert attrs[0].get(attribute) == expected_value
2 changes: 2 additions & 0 deletions tests/test_tuya_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
TuyaIasContact,
TuyaIasFire,
TuyaIasGas,
TuyaIasVibration,
TuyaIlluminance,
TuyaPM25Concentration,
TuyaQuirkBuilder,
Expand Down Expand Up @@ -56,6 +57,7 @@
("tuya_co2", "carbon_dioxide_concentration", TuyaCO2Concentration),
("tuya_pm25", "pm25", TuyaPM25Concentration),
("tuya_voc", "voc_level", TuyaAirQualityVOC),
("tuya_vibration", "ias_zone", TuyaIasVibration),
(
"tuya_formaldehyde",
"formaldehyde_concentration",
Expand Down
17 changes: 17 additions & 0 deletions zhaquirks/tuya/builder/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,14 @@ class TuyaIasFire(IasZone, TuyaLocalCluster):
}


class TuyaIasVibration(IasZone, TuyaLocalCluster):
"""Tuya local IAS vibration cluster."""

_CONSTANT_ATTRIBUTES = {
IasZone.AttributeDefs.zone_type.id: IasZone.ZoneType.Vibration_Movement_Sensor
}


class TuyaPM25Concentration(PM25, TuyaLocalCluster):
"""Tuya PM25 concentration measurement."""

Expand Down Expand Up @@ -435,6 +443,15 @@ def tuya_temperature(
self.adds(temp_cfg)
return self

def tuya_vibration(self, dp_id: int):
"""Add a Tuya IAS vibration sensor."""
self.tuya_ias(
dp_id=dp_id,
ias_cfg=TuyaIasVibration,
converter=lambda x: IasZone.ZoneStatus.Alarm_1 if x != 0 else 0,
)
return self

def tuya_voc(
self,
dp_id: int,
Expand Down
198 changes: 0 additions & 198 deletions zhaquirks/tuya/ts601_door.py

This file was deleted.

24 changes: 24 additions & 0 deletions zhaquirks/tuya/tuay_contact.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
"""Tuya contact sensors."""

from zhaquirks.const import BatterySize
from zhaquirks.tuya.builder import TuyaQuirkBuilder

(
TuyaQuirkBuilder("_TZE200_pay2byax", "TS0601") # Cusam ZG-102ZL
.applies_to("_TZE200_n8dljorx", "TS0601")
.tuya_illuminance(dp_id=101)
.tuya_contact(dp_id=1)
.tuya_battery(dp_id=2, battery_type=BatterySize.CR2032, battery_qty=1)
.skip_configuration()
.add_to_registry()
)


(
TuyaQuirkBuilder("_TZE200_kzm5w4iz", "TS0601")
.tuya_contact(dp_id=1)
.tuya_battery(dp_id=3, battery_type=BatterySize.AAA, battery_qty=2)
.tuya_vibration(dp_id=10)
.skip_configuration()
.add_to_registry()
)
Loading

0 comments on commit 4d83f9c

Please sign in to comment.