"""Quirk for Philips motion sensors.""" from typing import Final from zigpy.profiles import zha, zll from zigpy.quirks import CustomCluster, CustomDevice import zigpy.types as t from zigpy.zcl.clusters.general import ( Basic, Groups, Identify, LevelControl, OnOff, Ota, PowerConfiguration, Scenes, ) from zigpy.zcl.clusters.lighting import Color from zigpy.zcl.clusters.measurement import ( IlluminanceMeasurement, OccupancySensing, TemperatureMeasurement, ) from zigpy.zcl.foundation import ZCLAttributeDef from zhaquirks.const import ( DEVICE_TYPE, ENDPOINTS, INPUT_CLUSTERS, MODELS_INFO, OUTPUT_CLUSTERS, PROFILE_ID, ) from zhaquirks.philips import PHILIPS, SIGNIFY, PhilipsOccupancySensing class BasicCluster(CustomCluster, Basic): """Hue Motion Basic cluster.""" class AttributeDefs(Basic.AttributeDefs): """Attribute definitions.""" trigger_indicator: Final = ZCLAttributeDef( id=0x0033, type=t.Bool, is_manufacturer_specific=True ) class PhilipsMotion(CustomDevice): """Old Philips motion sensor devices.""" signature = { MODELS_INFO: [(PHILIPS, "SML001"), (PHILIPS, "SML002")], ENDPOINTS: { # 1: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zll.DeviceType.ON_OFF_SENSOR, INPUT_CLUSTERS: [Basic.cluster_id], OUTPUT_CLUSTERS: [ Basic.cluster_id, Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, ], }, # 2: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.OCCUPANCY_SENSOR, INPUT_CLUSTERS: [ Basic.cluster_id, PowerConfiguration.cluster_id, Identify.cluster_id, IlluminanceMeasurement.cluster_id, TemperatureMeasurement.cluster_id, OccupancySensing.cluster_id, ], OUTPUT_CLUSTERS: [Ota.cluster_id], }, }, } replacement = { ENDPOINTS: { 1: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zll.DeviceType.ON_OFF_SENSOR, INPUT_CLUSTERS: [Basic.cluster_id], OUTPUT_CLUSTERS: [ Basic.cluster_id, Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, ], }, 2: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.OCCUPANCY_SENSOR, INPUT_CLUSTERS: [ BasicCluster, PowerConfiguration.cluster_id, Identify.cluster_id, IlluminanceMeasurement.cluster_id, TemperatureMeasurement.cluster_id, PhilipsOccupancySensing, ], OUTPUT_CLUSTERS: [Ota.cluster_id], }, } } class SignifyMotion(CustomDevice): """New Philips motion sensor devices.""" signature = { MODELS_INFO: [(SIGNIFY, "SML003"), (SIGNIFY, "SML004")], ENDPOINTS: { 2: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.OCCUPANCY_SENSOR, INPUT_CLUSTERS: [ Basic.cluster_id, PowerConfiguration.cluster_id, Identify.cluster_id, IlluminanceMeasurement.cluster_id, TemperatureMeasurement.cluster_id, OccupancySensing.cluster_id, ], OUTPUT_CLUSTERS: [ Basic.cluster_id, Identify.cluster_id, OnOff.cluster_id, Ota.cluster_id, ], }, }, } replacement = { ENDPOINTS: { 2: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.OCCUPANCY_SENSOR, INPUT_CLUSTERS: [ BasicCluster, PowerConfiguration.cluster_id, Identify.cluster_id, IlluminanceMeasurement.cluster_id, TemperatureMeasurement.cluster_id, PhilipsOccupancySensing, ], OUTPUT_CLUSTERS: [ Basic.cluster_id, Identify.cluster_id, OnOff.cluster_id, Ota.cluster_id, ], }, } }