From da11a678ad97709d7f197e6b2e464aab105d9910 Mon Sep 17 00:00:00 2001 From: Nikita Uvarov Date: Fri, 21 Feb 2025 11:52:45 +0100 Subject: [PATCH 1/2] Add Schneider Electric Smoke Alarms --- zhaquirks/schneiderelectric/smoke.py | 174 +++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 zhaquirks/schneiderelectric/smoke.py diff --git a/zhaquirks/schneiderelectric/smoke.py b/zhaquirks/schneiderelectric/smoke.py new file mode 100644 index 0000000000..b5bc655559 --- /dev/null +++ b/zhaquirks/schneiderelectric/smoke.py @@ -0,0 +1,174 @@ +"""Scneider Electric Smoke Alarm.""" + +from typing import Final + +from zigpy.quirks import CustomCluster +from zigpy.quirks.v2 import EntityType, QuirkBuilder, ReportingConfig +from zigpy.quirks.v2.homeassistant import UnitOfTime +from zigpy.quirks.v2.homeassistant.number import NumberDeviceClass +import zigpy.types as t +from zigpy.zcl.foundation import ZCLAttributeDef + +from zhaquirks.schneiderelectric import SE_MANUF_NAME, SEBasic + + +class SELEDBrightness(t.enum8): + """LED brightness.""" + + Min = 0x00 + Max = 0x01 + + +class SEAlarmSoundLevel(t.enum8): + """Alarm sound level.""" + + Min = 0x00 + Max = 0x01 + + +class SEAlarmSoundMode(t.enum8): + """Alarm sound mode.""" + + PressureLow = 0x00 + PressureMid = 0x01 + PressureHigh = 0x02 + + +class SEAlarmConfiguration(CustomCluster): + """Schneider Electric Alarm Configuration cluster.""" + + cluster_id = 0xFC04 + name = "SEAlarmConfiguration" + + class AttributeDefs(CustomCluster.AttributeDefs): + """Attribute definitions.""" + + se_led_brightness: Final = ZCLAttributeDef( + id=0x0000, + type=SELEDBrightness, + access="rw", + is_manufacturer_specific=True, + ) + se_alarm_sound_level: Final = ZCLAttributeDef( + id=0x0001, + type=SEAlarmSoundLevel, + access="rw", + is_manufacturer_specific=True, + ) + se_alarm_sound_mode: Final = ZCLAttributeDef( + id=0x0002, + type=SEAlarmSoundMode, + access="rw", + is_manufacturer_specific=True, + ) + se_lifetime: Final = ZCLAttributeDef( + id=0x0003, + type=t.uint8_t, + access="r", + is_manufacturer_specific=True, + ) + se_hush_duration: Final = ZCLAttributeDef( + id=0x0004, + type=t.uint8_t, + access="rw", + is_manufacturer_specific=True, + ) + se_test_mode: Final = ZCLAttributeDef( + id=0x0005, + type=t.Bool, + access="rw", + is_manufacturer_specific=True, + ) + se_silence_alarm: Final = ZCLAttributeDef( + id=0x0006, + type=t.Bool, + access="rw", + is_manufacturer_specific=True, + ) + se_cluster_revision: Final = ZCLAttributeDef( + id=0xFFFD, + type=t.uint16_t, + access="r", + is_manufacturer_specific=True, + ) + + +( + QuirkBuilder(SE_MANUF_NAME, "W599001") + .applies_to(SE_MANUF_NAME, "W599501") + .applies_to(SE_MANUF_NAME, "755WSA") + .replaces(SEBasic, endpoint_id=20) + .replaces(SEAlarmConfiguration, endpoint_id=20) + .enum( + cluster_id=SEAlarmConfiguration.cluster_id, + endpoint_id=20, + attribute_name=SEAlarmConfiguration.AttributeDefs.se_led_brightness.name, + translation_key="led_brightness", + fallback_name="LED brightness", + enum_class=SELEDBrightness, + ) + .enum( + cluster_id=SEAlarmConfiguration.cluster_id, + endpoint_id=20, + attribute_name=SEAlarmConfiguration.AttributeDefs.se_alarm_sound_level.name, + translation_key="alarm_sound_level", + fallback_name="Alarm sound level", + enum_class=SEAlarmSoundLevel, + ) + .enum( + cluster_id=SEAlarmConfiguration.cluster_id, + endpoint_id=20, + attribute_name=SEAlarmConfiguration.AttributeDefs.se_alarm_sound_mode.name, + translation_key="alarm_sound_mode", + fallback_name="Alarm sound mode", + enum_class=SEAlarmSoundMode, + ) + .sensor( + cluster_id=SEAlarmConfiguration.cluster_id, + endpoint_id=20, + attribute_name=SEAlarmConfiguration.AttributeDefs.se_lifetime.name, + translation_key="lifetime", + fallback_name="Lifetime", + device_class=NumberDeviceClass.DURATION, + unit=UnitOfTime.YEARS, + multiplier=0.5, + entity_type=EntityType.DIAGNOSTIC, + ) + .number( + cluster_id=SEAlarmConfiguration.cluster_id, + endpoint_id=20, + attribute_name=SEAlarmConfiguration.AttributeDefs.se_hush_duration.name, + translation_key="hush_duration", + fallback_name="Hush duration", + device_class=NumberDeviceClass.DURATION, + unit=UnitOfTime.MINUTES, + min_value=5, + max_value=15, + step=1, + ) + .switch( + cluster_id=SEAlarmConfiguration.cluster_id, + endpoint_id=20, + attribute_name=SEAlarmConfiguration.AttributeDefs.se_test_mode.name, + translation_key="test_mode", + fallback_name="Test mode", + reporting_config=ReportingConfig( + min_interval=0, + max_interval=0, + reportable_change=1, + ), + ) + .switch( + cluster_id=SEAlarmConfiguration.cluster_id, + endpoint_id=20, + attribute_name=SEAlarmConfiguration.AttributeDefs.se_silence_alarm.name, + translation_key="silence_alarm", + fallback_name="Silence alarm", + reporting_config=ReportingConfig( + min_interval=0, + max_interval=0, + reportable_change=1, + ), + ) + .add_to_registry() +) From 7ec26f1ab1a5b5c36ce67f8ab393e6c245cc69c4 Mon Sep 17 00:00:00 2001 From: TheJulianJES Date: Wed, 30 Apr 2025 02:36:08 +0200 Subject: [PATCH 2/2] Remove duration device class for Lifetime entity --- zhaquirks/schneiderelectric/smoke.py | 1 - 1 file changed, 1 deletion(-) diff --git a/zhaquirks/schneiderelectric/smoke.py b/zhaquirks/schneiderelectric/smoke.py index b5bc655559..bd1a0dafbc 100644 --- a/zhaquirks/schneiderelectric/smoke.py +++ b/zhaquirks/schneiderelectric/smoke.py @@ -129,7 +129,6 @@ class AttributeDefs(CustomCluster.AttributeDefs): attribute_name=SEAlarmConfiguration.AttributeDefs.se_lifetime.name, translation_key="lifetime", fallback_name="Lifetime", - device_class=NumberDeviceClass.DURATION, unit=UnitOfTime.YEARS, multiplier=0.5, entity_type=EntityType.DIAGNOSTIC,