"""Support for the Airzone Cloud sensors.""" from __future__ import annotations from typing import Any, Final from aioairzone_cloud.const import ( AZD_AIDOOS, AZD_AQ_INDEX, AZD_AQ_PM_1, AZD_AQ_PM_2P5, AZD_AQ_PM_10, AZD_HUMIDITY, AZD_TEMP, AZD_WEBSERVERS, AZD_WIFI_RSSI, AZD_ZONES, ) from homeassistant.components.sensor import ( SensorDeviceClass, SensorEntity, SensorEntityDescription, SensorStateClass, ) from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, PERCENTAGE, SIGNAL_STRENGTH_DECIBELS_MILLIWATT, EntityCategory, UnitOfTemperature, ) from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity_platform import AddEntitiesCallback from .const import DOMAIN from .coordinator import AirzoneUpdateCoordinator from .entity import ( AirzoneAidooEntity, AirzoneEntity, AirzoneWebServerEntity, AirzoneZoneEntity, ) AIDOO_SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = ( SensorEntityDescription( device_class=SensorDeviceClass.TEMPERATURE, key=AZD_TEMP, native_unit_of_measurement=UnitOfTemperature.CELSIUS, state_class=SensorStateClass.MEASUREMENT, ), ) WEBSERVER_SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = ( SensorEntityDescription( device_class=SensorDeviceClass.SIGNAL_STRENGTH, entity_category=EntityCategory.DIAGNOSTIC, entity_registry_enabled_default=False, key=AZD_WIFI_RSSI, native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT, state_class=SensorStateClass.MEASUREMENT, ), ) ZONE_SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = ( SensorEntityDescription( device_class=SensorDeviceClass.AQI, key=AZD_AQ_INDEX, state_class=SensorStateClass.MEASUREMENT, ), SensorEntityDescription( device_class=SensorDeviceClass.PM1, key=AZD_AQ_PM_1, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, state_class=SensorStateClass.MEASUREMENT, ), SensorEntityDescription( device_class=SensorDeviceClass.PM25, key=AZD_AQ_PM_2P5, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, state_class=SensorStateClass.MEASUREMENT, ), SensorEntityDescription( device_class=SensorDeviceClass.PM10, key=AZD_AQ_PM_10, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, state_class=SensorStateClass.MEASUREMENT, ), SensorEntityDescription( device_class=SensorDeviceClass.TEMPERATURE, key=AZD_TEMP, native_unit_of_measurement=UnitOfTemperature.CELSIUS, state_class=SensorStateClass.MEASUREMENT, ), SensorEntityDescription( device_class=SensorDeviceClass.HUMIDITY, key=AZD_HUMIDITY, native_unit_of_measurement=PERCENTAGE, state_class=SensorStateClass.MEASUREMENT, ), ) async def async_setup_entry( hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback ) -> None: """Add Airzone Cloud sensors from a config_entry.""" coordinator: AirzoneUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] # Aidoos sensors: list[AirzoneSensor] = [ AirzoneAidooSensor( coordinator, description, aidoo_id, aidoo_data, ) for aidoo_id, aidoo_data in coordinator.data.get(AZD_AIDOOS, {}).items() for description in AIDOO_SENSOR_TYPES if description.key in aidoo_data ] # WebServers sensors.extend( AirzoneWebServerSensor( coordinator, description, ws_id, ws_data, ) for ws_id, ws_data in coordinator.data.get(AZD_WEBSERVERS, {}).items() for description in WEBSERVER_SENSOR_TYPES if description.key in ws_data ) # Zones sensors.extend( AirzoneZoneSensor( coordinator, description, zone_id, zone_data, ) for zone_id, zone_data in coordinator.data.get(AZD_ZONES, {}).items() for description in ZONE_SENSOR_TYPES if description.key in zone_data ) async_add_entities(sensors) class AirzoneSensor(AirzoneEntity, SensorEntity): """Define an Airzone Cloud sensor.""" @callback def _handle_coordinator_update(self) -> None: """Update attributes when the coordinator updates.""" self._async_update_attrs() super()._handle_coordinator_update() @callback def _async_update_attrs(self) -> None: """Update sensor attributes.""" self._attr_native_value = self.get_airzone_value(self.entity_description.key) class AirzoneAidooSensor(AirzoneAidooEntity, AirzoneSensor): """Define an Airzone Cloud Aidoo sensor.""" def __init__( self, coordinator: AirzoneUpdateCoordinator, description: SensorEntityDescription, aidoo_id: str, aidoo_data: dict[str, Any], ) -> None: """Initialize.""" super().__init__(coordinator, aidoo_id, aidoo_data) self._attr_unique_id = f"{aidoo_id}_{description.key}" self.entity_description = description self._async_update_attrs() class AirzoneWebServerSensor(AirzoneWebServerEntity, AirzoneSensor): """Define an Airzone Cloud WebServer sensor.""" def __init__( self, coordinator: AirzoneUpdateCoordinator, description: SensorEntityDescription, ws_id: str, ws_data: dict[str, Any], ) -> None: """Initialize.""" super().__init__(coordinator, ws_id, ws_data) self._attr_unique_id = f"{ws_id}_{description.key}" self.entity_description = description self._async_update_attrs() class AirzoneZoneSensor(AirzoneZoneEntity, AirzoneSensor): """Define an Airzone Cloud Zone sensor.""" def __init__( self, coordinator: AirzoneUpdateCoordinator, description: SensorEntityDescription, zone_id: str, zone_data: dict[str, Any], ) -> None: """Initialize.""" super().__init__(coordinator, zone_id, zone_data) self._attr_unique_id = f"{zone_id}_{description.key}" self.entity_description = description self._async_update_attrs()