diff --git a/.strict-typing b/.strict-typing index be6f540e633..2929550ffa8 100644 --- a/.strict-typing +++ b/.strict-typing @@ -386,6 +386,7 @@ homeassistant.components.pandora.* homeassistant.components.panel_custom.* homeassistant.components.peblar.* homeassistant.components.peco.* +homeassistant.components.pegel_online.* homeassistant.components.persistent_notification.* homeassistant.components.person.* homeassistant.components.pi_hole.* diff --git a/homeassistant/components/pegel_online/sensor.py b/homeassistant/components/pegel_online/sensor.py index fd90683a9b2..981ee4ff469 100644 --- a/homeassistant/components/pegel_online/sensor.py +++ b/homeassistant/components/pegel_online/sensor.py @@ -2,9 +2,10 @@ from __future__ import annotations +from collections.abc import Callable from dataclasses import dataclass -from aiopegelonline.models import CurrentMeasurement +from aiopegelonline.models import CurrentMeasurement, StationMeasurements from homeassistant.components.sensor import ( SensorDeviceClass, @@ -24,67 +25,67 @@ from .entity import PegelOnlineEntity class PegelOnlineSensorEntityDescription(SensorEntityDescription): """PEGELONLINE sensor entity description.""" - measurement_key: str + measurement_fn: Callable[[StationMeasurements], CurrentMeasurement | None] SENSORS: tuple[PegelOnlineSensorEntityDescription, ...] = ( PegelOnlineSensorEntityDescription( key="air_temperature", translation_key="air_temperature", - measurement_key="air_temperature", state_class=SensorStateClass.MEASUREMENT, device_class=SensorDeviceClass.TEMPERATURE, entity_registry_enabled_default=False, + measurement_fn=lambda data: data.air_temperature, ), PegelOnlineSensorEntityDescription( key="clearance_height", translation_key="clearance_height", - measurement_key="clearance_height", state_class=SensorStateClass.MEASUREMENT, device_class=SensorDeviceClass.DISTANCE, + measurement_fn=lambda data: data.clearance_height, ), PegelOnlineSensorEntityDescription( key="oxygen_level", translation_key="oxygen_level", - measurement_key="oxygen_level", state_class=SensorStateClass.MEASUREMENT, entity_registry_enabled_default=False, + measurement_fn=lambda data: data.oxygen_level, ), PegelOnlineSensorEntityDescription( key="ph_value", - measurement_key="ph_value", state_class=SensorStateClass.MEASUREMENT, device_class=SensorDeviceClass.PH, entity_registry_enabled_default=False, + measurement_fn=lambda data: data.ph_value, ), PegelOnlineSensorEntityDescription( key="water_speed", translation_key="water_speed", - measurement_key="water_speed", state_class=SensorStateClass.MEASUREMENT, device_class=SensorDeviceClass.SPEED, entity_registry_enabled_default=False, + measurement_fn=lambda data: data.water_speed, ), PegelOnlineSensorEntityDescription( key="water_flow", translation_key="water_flow", - measurement_key="water_flow", state_class=SensorStateClass.MEASUREMENT, entity_registry_enabled_default=False, + measurement_fn=lambda data: data.water_flow, ), PegelOnlineSensorEntityDescription( key="water_level", translation_key="water_level", - measurement_key="water_level", state_class=SensorStateClass.MEASUREMENT, + measurement_fn=lambda data: data.water_level, ), PegelOnlineSensorEntityDescription( key="water_temperature", translation_key="water_temperature", - measurement_key="water_temperature", state_class=SensorStateClass.MEASUREMENT, device_class=SensorDeviceClass.TEMPERATURE, entity_registry_enabled_default=False, + measurement_fn=lambda data: data.water_temperature, ), ) @@ -101,7 +102,7 @@ async def async_setup_entry( [ PegelOnlineSensor(coordinator, description) for description in SENSORS - if getattr(coordinator.data, description.measurement_key) is not None + if description.measurement_fn(coordinator.data) is not None ] ) @@ -135,7 +136,9 @@ class PegelOnlineSensor(PegelOnlineEntity, SensorEntity): @property def measurement(self) -> CurrentMeasurement: """Return the measurement data of the entity.""" - return getattr(self.coordinator.data, self.entity_description.measurement_key) + measurement = self.entity_description.measurement_fn(self.coordinator.data) + assert measurement is not None # we ensure existence in async_setup_entry + return measurement @property def native_value(self) -> float: diff --git a/mypy.ini b/mypy.ini index 5c6db87590f..eb5af1fd76c 100644 --- a/mypy.ini +++ b/mypy.ini @@ -3616,6 +3616,16 @@ disallow_untyped_defs = true warn_return_any = true warn_unreachable = true +[mypy-homeassistant.components.pegel_online.*] +check_untyped_defs = true +disallow_incomplete_defs = true +disallow_subclassing_any = true +disallow_untyped_calls = true +disallow_untyped_decorators = true +disallow_untyped_defs = true +warn_return_any = true +warn_unreachable = true + [mypy-homeassistant.components.persistent_notification.*] check_untyped_defs = true disallow_incomplete_defs = true