"""Support for HomeMatic binary sensors.""" from __future__ import annotations from homeassistant.components.binary_sensor import ( BinarySensorDeviceClass, BinarySensorEntity, ) from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from .const import ATTR_DISCOVER_DEVICES, ATTR_DISCOVERY_TYPE, DISCOVER_BATTERY from .entity import HMDevice SENSOR_TYPES_CLASS = { "IPShutterContact": BinarySensorDeviceClass.OPENING, "IPShutterContactSabotage": BinarySensorDeviceClass.OPENING, "MaxShutterContact": BinarySensorDeviceClass.OPENING, "Motion": BinarySensorDeviceClass.MOTION, "MotionV2": BinarySensorDeviceClass.MOTION, "PresenceIP": BinarySensorDeviceClass.MOTION, "Remote": None, "RemoteMotion": None, "ShutterContact": BinarySensorDeviceClass.OPENING, "Smoke": BinarySensorDeviceClass.SMOKE, "SmokeV2": BinarySensorDeviceClass.SMOKE, "TiltSensor": None, "WeatherSensor": None, "IPContact": BinarySensorDeviceClass.OPENING, "MotionIP": BinarySensorDeviceClass.MOTION, "MotionIPV2": BinarySensorDeviceClass.MOTION, "MotionIPContactSabotage": BinarySensorDeviceClass.MOTION, "IPRemoteMotionV2": BinarySensorDeviceClass.MOTION, } def setup_platform( hass: HomeAssistant, config: ConfigType, add_entities: AddEntitiesCallback, discovery_info: DiscoveryInfoType | None = None, ) -> None: """Set up the HomeMatic binary sensor platform.""" if discovery_info is None: return devices: list[BinarySensorEntity] = [] for conf in discovery_info[ATTR_DISCOVER_DEVICES]: if discovery_info[ATTR_DISCOVERY_TYPE] == DISCOVER_BATTERY: devices.append(HMBatterySensor(conf)) else: devices.append(HMBinarySensor(conf)) add_entities(devices, True) class HMBinarySensor(HMDevice, BinarySensorEntity): """Representation of a binary HomeMatic device.""" @property def is_on(self): """Return true if switch is on.""" if not self.available: return False return bool(self._hm_get_state()) @property def device_class(self): """Return the class of this sensor from DEVICE_CLASSES.""" # If state is MOTION (Only RemoteMotion working) if self._state == "MOTION": return BinarySensorDeviceClass.MOTION return SENSOR_TYPES_CLASS.get(self._hmdevice.__class__.__name__) def _init_data_struct(self): """Generate the data dictionary (self._data) from metadata.""" # Add state to data struct if self._state: self._data.update({self._state: None}) class HMBatterySensor(HMDevice, BinarySensorEntity): """Representation of an HomeMatic low battery sensor.""" _attr_device_class = BinarySensorDeviceClass.BATTERY @property def is_on(self): """Return True if battery is low.""" return bool(self._hm_get_state()) def _init_data_struct(self): """Generate the data dictionary (self._data) from metadata.""" # Add state to data struct if self._state: self._data.update({self._state: None})