From 478df314a26ec53ff706a4292369d6a01eae56cd Mon Sep 17 00:00:00 2001 From: wzh <1090741189@qq.com> Date: Thu, 14 Aug 2025 15:37:03 +0800 Subject: [PATCH 1/4] Add temperature and humidity offset to Sonoff SNZB-02P --- zhaquirks/sonoff/snzb02p.py | 87 +++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 zhaquirks/sonoff/snzb02p.py diff --git a/zhaquirks/sonoff/snzb02p.py b/zhaquirks/sonoff/snzb02p.py new file mode 100644 index 0000000000..0af59c2f15 --- /dev/null +++ b/zhaquirks/sonoff/snzb02p.py @@ -0,0 +1,87 @@ +"""SONOFF SNZB02P - Zigbee Temperature And Humidity Sensor.""" + +from zigpy.quirks import CustomCluster +from zigpy.quirks.v2 import QuirkBuilder +from zigpy.quirks.v2.homeassistant import ( + UnitOfTemperature, + PERCENTAGE, +) +import zigpy.types as t +from enum import Enum +from zigpy import types +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef +from zigpy.quirks.v2.homeassistant.number import NumberDeviceClass +from zigpy.quirks.registry import DeviceRegistry +from zigpy.zcl import ClusterType +from zigpy.quirks.v2 import ( + BinarySensorMetadata, + CustomDeviceV2, + EntityMetadata, + EntityPlatform, + EntityType, + NumberMetadata, + SwitchMetadata, + WriteAttributeButtonMetadata, + ZCLCommandButtonMetadata, + ZCLSensorMetadata, + add_to_registry_v2, +) + +class CustomSonoffCluster(CustomCluster): + """Custom Sonoff cluster.""" + + cluster_id = 0xFC11 + + class AttributeDefs(BaseAttributeDefs): + """Attribute definitions.""" + + TemperatureCompensation = ZCLAttributeDef( + name="TemperatureCompensation", + id=0x2003, + type=t.int16s, + ) + + RelativeHumidityCompensation = ZCLAttributeDef( + name="RelativeHumidityCompensation", + id=0x2004, + type=t.int16s, + ) + + @property + def _is_manuf_specific(self): + return False + + +( + QuirkBuilder("eWeLink", "SNZB-02P") + .replaces(CustomSonoffCluster, 0xFC11, ClusterType.Server, 1) + .number( + "TemperatureCompensation", + 0xFC11, + ClusterType.Server, + 1, + -50.0, + 50.0, + 0.1, + unit = UnitOfTemperature.CELSIUS, + multiplier = 0.01, + translation_key = "TemperatureCompensation", + device_class = NumberDeviceClass.TEMPERATURE, + fallback_name = "TemperatureCompensation", + ) + .number( + "RelativeHumidityCompensation", + 0xFC11, + ClusterType.Server, + 1, + -50.0, + 50.0, + 0.1, + unit = PERCENTAGE, + multiplier = 0.01, + translation_key = "RelativeHumidityCompensation", + device_class = NumberDeviceClass.HUMIDITY, + fallback_name = "RelativeHumidityCompensation", + ) + .add_to_registry() +) \ No newline at end of file From 2955414dcb6872dbd64d06e913e3fd6023536017 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 07:41:04 +0000 Subject: [PATCH 2/4] Apply pre-commit auto fixes --- zhaquirks/sonoff/snzb02p.py | 52 ++++++++++++------------------------- 1 file changed, 17 insertions(+), 35 deletions(-) diff --git a/zhaquirks/sonoff/snzb02p.py b/zhaquirks/sonoff/snzb02p.py index 0af59c2f15..6b3def75db 100644 --- a/zhaquirks/sonoff/snzb02p.py +++ b/zhaquirks/sonoff/snzb02p.py @@ -2,30 +2,12 @@ from zigpy.quirks import CustomCluster from zigpy.quirks.v2 import QuirkBuilder -from zigpy.quirks.v2.homeassistant import ( - UnitOfTemperature, - PERCENTAGE, -) -import zigpy.types as t -from enum import Enum -from zigpy import types -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef +from zigpy.quirks.v2.homeassistant import PERCENTAGE, UnitOfTemperature from zigpy.quirks.v2.homeassistant.number import NumberDeviceClass -from zigpy.quirks.registry import DeviceRegistry +import zigpy.types as t from zigpy.zcl import ClusterType -from zigpy.quirks.v2 import ( - BinarySensorMetadata, - CustomDeviceV2, - EntityMetadata, - EntityPlatform, - EntityType, - NumberMetadata, - SwitchMetadata, - WriteAttributeButtonMetadata, - ZCLCommandButtonMetadata, - ZCLSensorMetadata, - add_to_registry_v2, -) +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef + class CustomSonoffCluster(CustomCluster): """Custom Sonoff cluster.""" @@ -41,7 +23,7 @@ class AttributeDefs(BaseAttributeDefs): type=t.int16s, ) - RelativeHumidityCompensation = ZCLAttributeDef( + RelativeHumidityCompensation = ZCLAttributeDef( name="RelativeHumidityCompensation", id=0x2004, type=t.int16s, @@ -51,7 +33,7 @@ class AttributeDefs(BaseAttributeDefs): def _is_manuf_specific(self): return False - + ( QuirkBuilder("eWeLink", "SNZB-02P") .replaces(CustomSonoffCluster, 0xFC11, ClusterType.Server, 1) @@ -63,11 +45,11 @@ def _is_manuf_specific(self): -50.0, 50.0, 0.1, - unit = UnitOfTemperature.CELSIUS, - multiplier = 0.01, - translation_key = "TemperatureCompensation", - device_class = NumberDeviceClass.TEMPERATURE, - fallback_name = "TemperatureCompensation", + unit=UnitOfTemperature.CELSIUS, + multiplier=0.01, + translation_key="TemperatureCompensation", + device_class=NumberDeviceClass.TEMPERATURE, + fallback_name="TemperatureCompensation", ) .number( "RelativeHumidityCompensation", @@ -77,11 +59,11 @@ def _is_manuf_specific(self): -50.0, 50.0, 0.1, - unit = PERCENTAGE, - multiplier = 0.01, - translation_key = "RelativeHumidityCompensation", - device_class = NumberDeviceClass.HUMIDITY, - fallback_name = "RelativeHumidityCompensation", + unit=PERCENTAGE, + multiplier=0.01, + translation_key="RelativeHumidityCompensation", + device_class=NumberDeviceClass.HUMIDITY, + fallback_name="RelativeHumidityCompensation", ) .add_to_registry() -) \ No newline at end of file +) From be9a3bf5518fbede8b5cde795d5cec7fea3e8dbd Mon Sep 17 00:00:00 2001 From: wzh <1090741189@qq.com> Date: Fri, 15 Aug 2025 13:40:40 +0800 Subject: [PATCH 3/4] Add temperature and humidity offset to Sonoff SNZB-02P --- zhaquirks/sonoff/snzb02p.py | 66 +++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/zhaquirks/sonoff/snzb02p.py b/zhaquirks/sonoff/snzb02p.py index 6b3def75db..80a3c7ea61 100644 --- a/zhaquirks/sonoff/snzb02p.py +++ b/zhaquirks/sonoff/snzb02p.py @@ -2,12 +2,30 @@ from zigpy.quirks import CustomCluster from zigpy.quirks.v2 import QuirkBuilder -from zigpy.quirks.v2.homeassistant import PERCENTAGE, UnitOfTemperature -from zigpy.quirks.v2.homeassistant.number import NumberDeviceClass +from zigpy.quirks.v2.homeassistant import ( + UnitOfTemperature, + PERCENTAGE, +) import zigpy.types as t -from zigpy.zcl import ClusterType +from enum import Enum +from zigpy import types from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef - +from zigpy.quirks.v2.homeassistant.number import NumberDeviceClass +from zigpy.quirks.registry import DeviceRegistry +from zigpy.zcl import ClusterType +from zigpy.quirks.v2 import ( + BinarySensorMetadata, + CustomDeviceV2, + EntityMetadata, + EntityPlatform, + EntityType, + NumberMetadata, + SwitchMetadata, + WriteAttributeButtonMetadata, + ZCLCommandButtonMetadata, + ZCLSensorMetadata, + add_to_registry_v2, +) class CustomSonoffCluster(CustomCluster): """Custom Sonoff cluster.""" @@ -17,14 +35,14 @@ class CustomSonoffCluster(CustomCluster): class AttributeDefs(BaseAttributeDefs): """Attribute definitions.""" - TemperatureCompensation = ZCLAttributeDef( - name="TemperatureCompensation", + Temperature_Compensation = ZCLAttributeDef( + name="Temperature_Compensation", id=0x2003, type=t.int16s, ) - RelativeHumidityCompensation = ZCLAttributeDef( - name="RelativeHumidityCompensation", + Relative_Humidity_Compensation = ZCLAttributeDef( + name="Relative_Humidity_Compensation", id=0x2004, type=t.int16s, ) @@ -33,37 +51,37 @@ class AttributeDefs(BaseAttributeDefs): def _is_manuf_specific(self): return False - + ( QuirkBuilder("eWeLink", "SNZB-02P") .replaces(CustomSonoffCluster, 0xFC11, ClusterType.Server, 1) .number( - "TemperatureCompensation", - 0xFC11, + CustomSonoffCluster.AttributeDefs.Temperature_Compensation.name, + CustomSonoffCluster.cluster_id, ClusterType.Server, 1, -50.0, 50.0, 0.1, - unit=UnitOfTemperature.CELSIUS, - multiplier=0.01, - translation_key="TemperatureCompensation", - device_class=NumberDeviceClass.TEMPERATURE, - fallback_name="TemperatureCompensation", + unit = UnitOfTemperature.CELSIUS, + multiplier = 0.01, + translation_key = "Temperature_Compensation", + device_class = NumberDeviceClass.TEMPERATURE, + fallback_name = "Temperature Compensation", ) .number( - "RelativeHumidityCompensation", - 0xFC11, + CustomSonoffCluster.AttributeDefs.Relative_Humidity_Compensation.name, + CustomSonoffCluster.cluster_id, ClusterType.Server, 1, -50.0, 50.0, 0.1, - unit=PERCENTAGE, - multiplier=0.01, - translation_key="RelativeHumidityCompensation", - device_class=NumberDeviceClass.HUMIDITY, - fallback_name="RelativeHumidityCompensation", + unit = PERCENTAGE, + multiplier = 0.01, + translation_key = "Relative_Humidity_Compensation", + device_class = NumberDeviceClass.HUMIDITY, + fallback_name = "Relative Humidity Compensation", ) .add_to_registry() -) +) \ No newline at end of file From d53f5faa90eb5ee9a96d9ac56cb7eca716c767cb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 15 Aug 2025 05:41:00 +0000 Subject: [PATCH 4/4] Apply pre-commit auto fixes --- zhaquirks/sonoff/snzb02p.py | 52 ++++++++++++------------------------- 1 file changed, 17 insertions(+), 35 deletions(-) diff --git a/zhaquirks/sonoff/snzb02p.py b/zhaquirks/sonoff/snzb02p.py index 80a3c7ea61..1ac154e723 100644 --- a/zhaquirks/sonoff/snzb02p.py +++ b/zhaquirks/sonoff/snzb02p.py @@ -2,30 +2,12 @@ from zigpy.quirks import CustomCluster from zigpy.quirks.v2 import QuirkBuilder -from zigpy.quirks.v2.homeassistant import ( - UnitOfTemperature, - PERCENTAGE, -) -import zigpy.types as t -from enum import Enum -from zigpy import types -from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef +from zigpy.quirks.v2.homeassistant import PERCENTAGE, UnitOfTemperature from zigpy.quirks.v2.homeassistant.number import NumberDeviceClass -from zigpy.quirks.registry import DeviceRegistry +import zigpy.types as t from zigpy.zcl import ClusterType -from zigpy.quirks.v2 import ( - BinarySensorMetadata, - CustomDeviceV2, - EntityMetadata, - EntityPlatform, - EntityType, - NumberMetadata, - SwitchMetadata, - WriteAttributeButtonMetadata, - ZCLCommandButtonMetadata, - ZCLSensorMetadata, - add_to_registry_v2, -) +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef + class CustomSonoffCluster(CustomCluster): """Custom Sonoff cluster.""" @@ -41,7 +23,7 @@ class AttributeDefs(BaseAttributeDefs): type=t.int16s, ) - Relative_Humidity_Compensation = ZCLAttributeDef( + Relative_Humidity_Compensation = ZCLAttributeDef( name="Relative_Humidity_Compensation", id=0x2004, type=t.int16s, @@ -51,7 +33,7 @@ class AttributeDefs(BaseAttributeDefs): def _is_manuf_specific(self): return False - + ( QuirkBuilder("eWeLink", "SNZB-02P") .replaces(CustomSonoffCluster, 0xFC11, ClusterType.Server, 1) @@ -63,11 +45,11 @@ def _is_manuf_specific(self): -50.0, 50.0, 0.1, - unit = UnitOfTemperature.CELSIUS, - multiplier = 0.01, - translation_key = "Temperature_Compensation", - device_class = NumberDeviceClass.TEMPERATURE, - fallback_name = "Temperature Compensation", + unit=UnitOfTemperature.CELSIUS, + multiplier=0.01, + translation_key="Temperature_Compensation", + device_class=NumberDeviceClass.TEMPERATURE, + fallback_name="Temperature Compensation", ) .number( CustomSonoffCluster.AttributeDefs.Relative_Humidity_Compensation.name, @@ -77,11 +59,11 @@ def _is_manuf_specific(self): -50.0, 50.0, 0.1, - unit = PERCENTAGE, - multiplier = 0.01, - translation_key = "Relative_Humidity_Compensation", - device_class = NumberDeviceClass.HUMIDITY, - fallback_name = "Relative Humidity Compensation", + unit=PERCENTAGE, + multiplier=0.01, + translation_key="Relative_Humidity_Compensation", + device_class=NumberDeviceClass.HUMIDITY, + fallback_name="Relative Humidity Compensation", ) .add_to_registry() -) \ No newline at end of file +)