"""Support for SLZB-06 sensors.""" from __future__ import annotations from collections.abc import Callable from dataclasses import dataclass from pysmlight import Sensors from homeassistant.components.sensor import ( SensorDeviceClass, SensorEntity, SensorEntityDescription, SensorStateClass, ) from homeassistant.const import EntityCategory, UnitOfInformation, UnitOfTemperature from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from . import SmConfigEntry from .coordinator import SmDataUpdateCoordinator from .entity import SmEntity @dataclass(frozen=True, kw_only=True) class SmSensorEntityDescription(SensorEntityDescription): """Class describing SMLIGHT sensor entities.""" entity_category = EntityCategory.DIAGNOSTIC value_fn: Callable[[Sensors], float | None] SENSORS = [ SmSensorEntityDescription( key="core_temperature", translation_key="core_temperature", device_class=SensorDeviceClass.TEMPERATURE, native_unit_of_measurement=UnitOfTemperature.CELSIUS, state_class=SensorStateClass.MEASUREMENT, suggested_display_precision=1, value_fn=lambda x: x.esp32_temp, ), SmSensorEntityDescription( key="zigbee_temperature", translation_key="zigbee_temperature", device_class=SensorDeviceClass.TEMPERATURE, native_unit_of_measurement=UnitOfTemperature.CELSIUS, state_class=SensorStateClass.MEASUREMENT, suggested_display_precision=1, value_fn=lambda x: x.zb_temp, ), SmSensorEntityDescription( key="ram_usage", translation_key="ram_usage", device_class=SensorDeviceClass.DATA_SIZE, native_unit_of_measurement=UnitOfInformation.KILOBYTES, entity_registry_enabled_default=False, value_fn=lambda x: x.ram_usage, ), SmSensorEntityDescription( key="fs_usage", translation_key="fs_usage", device_class=SensorDeviceClass.DATA_SIZE, native_unit_of_measurement=UnitOfInformation.KILOBYTES, entity_registry_enabled_default=False, value_fn=lambda x: x.fs_used, ), ] async def async_setup_entry( hass: HomeAssistant, entry: SmConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Set up SMLIGHT sensor based on a config entry.""" coordinator = entry.runtime_data async_add_entities( SmSensorEntity(coordinator, description) for description in SENSORS ) class SmSensorEntity(SmEntity, SensorEntity): """Representation of a slzb sensor.""" entity_description: SmSensorEntityDescription def __init__( self, coordinator: SmDataUpdateCoordinator, description: SmSensorEntityDescription, ) -> None: """Initiate slzb sensor.""" super().__init__(coordinator) self.entity_description = description self._attr_unique_id = f"{coordinator.unique_id}_{description.key}" @property def native_value(self) -> float | None: """Return the sensor value.""" return self.entity_description.value_fn(self.coordinator.data.sensors)