From 0ce8446df6ccf3a6490b9c00512263ed09d0383e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20M=C3=B6sner?= Date: Tue, 25 Mar 2025 12:03:48 +0100 Subject: [PATCH] Add Sonoff SNZB-03P motion sensor (#3188) --- zhaquirks/sonoff/snzb03p.py | 64 +++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 zhaquirks/sonoff/snzb03p.py diff --git a/zhaquirks/sonoff/snzb03p.py b/zhaquirks/sonoff/snzb03p.py new file mode 100644 index 0000000000..89095ba74f --- /dev/null +++ b/zhaquirks/sonoff/snzb03p.py @@ -0,0 +1,64 @@ +"""Sonoff SNZB-03P - Zigbee motion sensor.""" + +from zigpy.quirks import CustomCluster +from zigpy.quirks.v2 import EntityPlatform, EntityType, NumberDeviceClass, QuirkBuilder +from zigpy.quirks.v2.homeassistant import UnitOfTime +import zigpy.types as t +from zigpy.zcl.clusters.measurement import OccupancySensing +from zigpy.zcl.clusters.security import IasZone +from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef + + +class LastIlluminationState(t.enum8): + """Last measureed state of illumination enum.""" + + Dark = 0x00 + Light = 0x01 + + +class SonoffIlluminationCluster(CustomCluster): + """Custom Sonoff illumination cluster.""" + + cluster_id = 0xFC11 + + class AttributeDefs(BaseAttributeDefs): + """Attribute definitions.""" + + last_illumination_state = ZCLAttributeDef( + id=0x2001, + type=LastIlluminationState, + access="rp", + is_manufacturer_specific=True, + ) + + @property + def _is_manuf_specific(self): + return False + + +( + QuirkBuilder("eWeLink", "SNZB-03P") + .replaces(SonoffIlluminationCluster) + .removes(IasZone.cluster_id) # IasZone cluster 0x0500: remove motion detection + .number( + OccupancySensing.AttributeDefs.ultrasonic_o_to_u_delay.name, + OccupancySensing.cluster_id, + min_value=5, + max_value=60, + step=1, + unit=UnitOfTime.SECONDS, + device_class=NumberDeviceClass.DURATION, + translation_key="motion_timeout", + fallback_name="Presence detection timeout", + ) + .enum( + SonoffIlluminationCluster.AttributeDefs.last_illumination_state.name, + LastIlluminationState, + SonoffIlluminationCluster.cluster_id, + entity_platform=EntityPlatform.SENSOR, + entity_type=EntityType.STANDARD, + translation_key="last_illumination_state", + fallback_name="Last illumination state", + ) + .add_to_registry() +)