From 377b72664c90781f49f86dde041624adeffeae58 Mon Sep 17 00:00:00 2001 From: Jonas Meyer Date: Sat, 7 Oct 2023 04:42:49 +0200 Subject: [PATCH 1/4] Fix battery reporting for: _TZE200_yjjdcqsq, _TZE200_9yapgbuv I tested on both devices: _TZE200_yjjdcqsq and _TZE200_9yapgbuv. Both devices report battery status in three levels: low, middle, and high. Since there is no option for battery level in ZHA, this fix converts the levels into equal percentage numbers 25%, 50% and 100%. Issue: #2281 --- zhaquirks/tuya/ts0601_sensor.py | 75 ++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 2 deletions(-) diff --git a/zhaquirks/tuya/ts0601_sensor.py b/zhaquirks/tuya/ts0601_sensor.py index 41114b8d02..5df81ca8a1 100644 --- a/zhaquirks/tuya/ts0601_sensor.py +++ b/zhaquirks/tuya/ts0601_sensor.py @@ -74,6 +74,32 @@ class TemperatureHumidityManufCluster(TuyaMCUCluster): 4: "_dp_2_attr_update", } +class TemperatureHumidityBatteryStatesManufCluster(TuyaMCUCluster, TuyaManufClusterAttributes): + """Tuya Manufacturer Cluster with Temperature and Humidity data points. Battery states 25, 50 and 100%.""" + + dp_to_attribute: Dict[int, DPToAttributeMapping] = { + 1: DPToAttributeMapping( + TuyaTemperatureMeasurement.ep_attribute, + "measured_value", + converter=lambda x: x * 10, # decidegree to centidegree + ), + 2: DPToAttributeMapping( + TuyaRelativeHumidity.ep_attribute, + "measured_value", + # converter=lambda x: x * 10, --> move conversion to TuyaRelativeHumidity cluster + ), + 3: DPToAttributeMapping( + TuyaPowerConfigurationCluster2AAA.ep_attribute, + "battery_percentage_remaining", + converter=lambda x: {0: 25, 1: 50, 2: 100}[x], # double reported percentage + ), + } + + data_point_handlers = { + 1: "_dp_2_attr_update", + 2: "_dp_2_attr_update", + 3: "_dp_2_attr_update", + } class TuyaTempHumiditySensor(CustomDevice): """Custom device representing tuya temp and humidity sensor with e-ink screen.""" @@ -181,8 +207,6 @@ class TuyaTempHumiditySensorVar03(CustomDevice): # "in_clusters": ["0x0000","0x0004","0x0005","0xef00"], # "out_clusters": ["0x000a","0x0019"] MODELS_INFO: [ - ("_TZE200_yjjdcqsq", "TS0601"), - ("_TZE200_9yapgbuv", "TS0601"), ("_TZE200_qyflbnbj", "TS0601"), ("_TZE200_utkemkbs", "TS0601"), ], @@ -221,6 +245,53 @@ class TuyaTempHumiditySensorVar03(CustomDevice): } +class TuyaTempHumiditySensorVar04(CustomDevice): + """Tuya temp and humidity sensor (variation 04).""" + + signature = { + # "profile_id": 260, + # "device_type": "0x0051", + # "in_clusters": ["0x0000","0x0004","0x0005","0xef00"], + # "out_clusters": ["0x000a","0x0019"] + MODELS_INFO: [ + ("_TZE200_yjjdcqsq", "TS0601"), + ("_TZE200_9yapgbuv", "TS0601"), + ], + ENDPOINTS: { + 1: { + PROFILE_ID: zha.PROFILE_ID, + DEVICE_TYPE: zha.DeviceType.SMART_PLUG, + INPUT_CLUSTERS: [ + Basic.cluster_id, + Groups.cluster_id, + Scenes.cluster_id, + TemperatureHumidityManufCluster.cluster_id, + ], + OUTPUT_CLUSTERS: [Ota.cluster_id, Time.cluster_id], + } + }, + } + + replacement = { + SKIP_CONFIGURATION: True, + ENDPOINTS: { + 1: { + DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR, + INPUT_CLUSTERS: [ + Basic.cluster_id, + Groups.cluster_id, + Scenes.cluster_id, + TemperatureHumidityBatteryStatesManufCluster, + TuyaTemperatureMeasurement, + TuyaRelativeHumidity, + TuyaPowerConfigurationCluster2AAA, + ], + OUTPUT_CLUSTERS: [Ota.cluster_id, Time.cluster_id], + } + }, + } + + class SoilManufCluster(TuyaMCUCluster): """Tuya Manufacturer Cluster with Temperature and Humidity data points.""" From 4d1ff2cddc8ffd1a01091300914fcd7288380d94 Mon Sep 17 00:00:00 2001 From: Jonas Meyer Date: Sat, 7 Oct 2023 05:16:30 +0200 Subject: [PATCH 2/4] Remove Undefined name `TuyaManufClusterAttributes` Remove `TuyaManufClusterAttributes` to satisfy CI checks --- zhaquirks/tuya/ts0601_sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zhaquirks/tuya/ts0601_sensor.py b/zhaquirks/tuya/ts0601_sensor.py index 5df81ca8a1..11f678d6df 100644 --- a/zhaquirks/tuya/ts0601_sensor.py +++ b/zhaquirks/tuya/ts0601_sensor.py @@ -74,7 +74,7 @@ class TemperatureHumidityManufCluster(TuyaMCUCluster): 4: "_dp_2_attr_update", } -class TemperatureHumidityBatteryStatesManufCluster(TuyaMCUCluster, TuyaManufClusterAttributes): +class TemperatureHumidityBatteryStatesManufCluster(TuyaMCUCluster): """Tuya Manufacturer Cluster with Temperature and Humidity data points. Battery states 25, 50 and 100%.""" dp_to_attribute: Dict[int, DPToAttributeMapping] = { From b9b50682ae82535dbd5461bc50378fc05015a8e9 Mon Sep 17 00:00:00 2001 From: Jonas Meyer Date: Sat, 7 Oct 2023 05:22:34 +0200 Subject: [PATCH 3/4] Fix formatting --- zhaquirks/tuya/ts0601_sensor.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/zhaquirks/tuya/ts0601_sensor.py b/zhaquirks/tuya/ts0601_sensor.py index 11f678d6df..c0f50ece68 100644 --- a/zhaquirks/tuya/ts0601_sensor.py +++ b/zhaquirks/tuya/ts0601_sensor.py @@ -74,6 +74,7 @@ class TemperatureHumidityManufCluster(TuyaMCUCluster): 4: "_dp_2_attr_update", } + class TemperatureHumidityBatteryStatesManufCluster(TuyaMCUCluster): """Tuya Manufacturer Cluster with Temperature and Humidity data points. Battery states 25, 50 and 100%.""" @@ -101,6 +102,7 @@ class TemperatureHumidityBatteryStatesManufCluster(TuyaMCUCluster): 3: "_dp_2_attr_update", } + class TuyaTempHumiditySensor(CustomDevice): """Custom device representing tuya temp and humidity sensor with e-ink screen.""" From 4309e4df4da89e8bf7c7f40a5ca6e62f22f8b241 Mon Sep 17 00:00:00 2001 From: Jonas Meyer Date: Sun, 8 Oct 2023 07:57:51 +0200 Subject: [PATCH 4/4] Remove duplicate code. --- zhaquirks/tuya/ts0601_sensor.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/zhaquirks/tuya/ts0601_sensor.py b/zhaquirks/tuya/ts0601_sensor.py index c0f50ece68..aaed2ba083 100644 --- a/zhaquirks/tuya/ts0601_sensor.py +++ b/zhaquirks/tuya/ts0601_sensor.py @@ -79,16 +79,8 @@ class TemperatureHumidityBatteryStatesManufCluster(TuyaMCUCluster): """Tuya Manufacturer Cluster with Temperature and Humidity data points. Battery states 25, 50 and 100%.""" dp_to_attribute: Dict[int, DPToAttributeMapping] = { - 1: DPToAttributeMapping( - TuyaTemperatureMeasurement.ep_attribute, - "measured_value", - converter=lambda x: x * 10, # decidegree to centidegree - ), - 2: DPToAttributeMapping( - TuyaRelativeHumidity.ep_attribute, - "measured_value", - # converter=lambda x: x * 10, --> move conversion to TuyaRelativeHumidity cluster - ), + 1: TemperatureHumidityManufCluster.dp_to_attribute[1], + 2: TemperatureHumidityManufCluster.dp_to_attribute[2], 3: DPToAttributeMapping( TuyaPowerConfigurationCluster2AAA.ep_attribute, "battery_percentage_remaining",