diff --git a/zhaquirks/tuya/tuya_sensor.py b/zhaquirks/tuya/tuya_sensor.py index d37be72437..d447fad206 100644 --- a/zhaquirks/tuya/tuya_sensor.py +++ b/zhaquirks/tuya/tuya_sensor.py @@ -4,7 +4,7 @@ from zigpy.quirks.v2 import EntityPlatform, EntityType from zigpy.quirks.v2.homeassistant import PERCENTAGE, UnitOfTemperature, UnitOfTime -from zigpy.quirks.v2.homeassistant.sensor import SensorDeviceClass +from zigpy.quirks.v2.homeassistant.sensor import SensorDeviceClass, SensorStateClass import zigpy.types as t from zigpy.zcl import foundation @@ -32,6 +32,21 @@ class TuyaNousTempHumiAlarm(t.enum8): Canceled = 0x02 +class TuyaBatteryState(t.enum8): + """Tuya battery state enum.""" + + Low = 0x00 + Medium = 0x01 + Full = 0x02 + + +class TuyaTimeFormat(t.enum8): + """Tuya time format enum.""" + + Format24h = 0x00 + Format12h = 0x01 + + class NoManufTimeTuyaMCUCluster(TuyaMCUCluster): """Tuya Manufacturer Cluster with set_time mod.""" @@ -47,6 +62,13 @@ class ServerCommandDefs(TuyaMCUCluster.ServerCommandDefs): is_manufacturer_specific=False, ) + class ClientCommandDefs(TuyaMCUCluster.ClientCommandDefs): + """Client command definitions.""" + + set_time_request = foundation.ZCLCommandDef( + id=TUYA_SET_TIME, schema={"data": t.data16}, is_manufacturer_specific=False + ) + ( TuyaQuirkBuilder("_TZE200_bjawzodf", "TS0601") @@ -333,3 +355,34 @@ class ServerCommandDefs(TuyaMCUCluster.ServerCommandDefs): .skip_configuration() .add_to_registry() ) + +# Sensor with clock, internal/external temperature and humidity +( + TuyaQuirkBuilder("_TZE284_hodyryli", "TS0601") + # Internal temperature (DP 1, scale=10) + .tuya_temperature(dp_id=1, scale=10) + # Internal humidity (DP 2) + .tuya_humidity(dp_id=2) + # Battery from battery_state (DP 3: 0=10%, 1=50%, 2=100%) + .tuya_dp( + dp_id=3, + ep_attribute=TuyaPowerConfigurationCluster2AAA.ep_attribute, + attribute_name="battery_percentage_remaining", + converter=lambda x: {0: 10, 1: 50, 2: 100}[x], + ) + .adds(TuyaPowerConfigurationCluster2AAA) + # External temperature sensor (DP 38, value needs to be divided by 100 to get correct temperature) + .tuya_sensor( + dp_id=38, + attribute_name="temperature_external", + type=t.int32s, + converter=lambda x: x / 10, # Divide by 10 to get correct temperature + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + unit=UnitOfTemperature.CELSIUS, + translation_key="temperature_external", + fallback_name="Temperature Probe", + ) + .skip_configuration() + .add_to_registry(replacement_cluster=NoManufTimeTuyaMCUCluster) +)