From f22b6239684e0a4a964eda2bdb9cae501ed347d9 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Wed, 25 Jun 2025 07:48:56 +0200 Subject: [PATCH] Move luftdaten coordinator to separate module (#147477) --- .../components/luftdaten/__init__.py | 33 +---------- .../components/luftdaten/coordinator.py | 56 +++++++++++++++++++ .../components/luftdaten/diagnostics.py | 6 +- homeassistant/components/luftdaten/sensor.py | 10 ++-- 4 files changed, 65 insertions(+), 40 deletions(-) create mode 100644 homeassistant/components/luftdaten/coordinator.py diff --git a/homeassistant/components/luftdaten/__init__.py b/homeassistant/components/luftdaten/__init__.py index 37f0f27d2d8..bba84471767 100644 --- a/homeassistant/components/luftdaten/__init__.py +++ b/homeassistant/components/luftdaten/__init__.py @@ -6,20 +6,14 @@ the integration name. from __future__ import annotations -import logging -from typing import Any - from luftdaten import Luftdaten -from luftdaten.exceptions import LuftdatenError from homeassistant.config_entries import ConfigEntry from homeassistant.const import Platform from homeassistant.core import HomeAssistant -from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed -from .const import CONF_SENSOR_ID, DEFAULT_SCAN_INTERVAL, DOMAIN - -_LOGGER = logging.getLogger(__name__) +from .const import CONF_SENSOR_ID, DOMAIN +from .coordinator import LuftdatenDataUpdateCoordinator PLATFORMS = [Platform.SENSOR] @@ -35,28 +29,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: sensor_community = Luftdaten(entry.data[CONF_SENSOR_ID]) - async def async_update() -> dict[str, float | int]: - """Update sensor/binary sensor data.""" - try: - await sensor_community.get_data() - except LuftdatenError as err: - raise UpdateFailed("Unable to retrieve data from Sensor.Community") from err - - if not sensor_community.values: - raise UpdateFailed("Did not receive sensor data from Sensor.Community") - - data: dict[str, float | int] = sensor_community.values - data.update(sensor_community.meta) - return data - - coordinator: DataUpdateCoordinator[dict[str, Any]] = DataUpdateCoordinator( - hass, - _LOGGER, - config_entry=entry, - name=f"{DOMAIN}_{sensor_community.sensor_id}", - update_interval=DEFAULT_SCAN_INTERVAL, - update_method=async_update, - ) + coordinator = LuftdatenDataUpdateCoordinator(hass, entry, sensor_community) await coordinator.async_config_entry_first_refresh() hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator diff --git a/homeassistant/components/luftdaten/coordinator.py b/homeassistant/components/luftdaten/coordinator.py new file mode 100644 index 00000000000..6c42d8b8866 --- /dev/null +++ b/homeassistant/components/luftdaten/coordinator.py @@ -0,0 +1,56 @@ +"""Support for Sensor.Community stations. + +Sensor.Community was previously called Luftdaten, hence the domain differs from +the integration name. +""" + +from __future__ import annotations + +import logging + +from luftdaten import Luftdaten +from luftdaten.exceptions import LuftdatenError + +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed + +from .const import DEFAULT_SCAN_INTERVAL, DOMAIN + +_LOGGER = logging.getLogger(__name__) + + +class LuftdatenDataUpdateCoordinator(DataUpdateCoordinator[dict[str, float | int]]): + """Data update coordinator for Sensor.Community.""" + + config_entry: ConfigEntry + + def __init__( + self, + hass: HomeAssistant, + config_entry: ConfigEntry, + sensor_community: Luftdaten, + ) -> None: + """Initialize the coordinator.""" + super().__init__( + hass, + _LOGGER, + config_entry=config_entry, + name=f"{DOMAIN}_{sensor_community.sensor_id}", + update_interval=DEFAULT_SCAN_INTERVAL, + ) + self._sensor_community = sensor_community + + async def _async_update_data(self) -> dict[str, float | int]: + """Update sensor/binary sensor data.""" + try: + await self._sensor_community.get_data() + except LuftdatenError as err: + raise UpdateFailed("Unable to retrieve data from Sensor.Community") from err + + if not self._sensor_community.values: + raise UpdateFailed("Did not receive sensor data from Sensor.Community") + + data: dict[str, float | int] = self._sensor_community.values + data.update(self._sensor_community.meta) + return data diff --git a/homeassistant/components/luftdaten/diagnostics.py b/homeassistant/components/luftdaten/diagnostics.py index a1bbcbcadd7..3be4239c2ef 100644 --- a/homeassistant/components/luftdaten/diagnostics.py +++ b/homeassistant/components/luftdaten/diagnostics.py @@ -8,9 +8,9 @@ from homeassistant.components.diagnostics import async_redact_data from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE from homeassistant.core import HomeAssistant -from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from .const import CONF_SENSOR_ID, DOMAIN +from .coordinator import LuftdatenDataUpdateCoordinator TO_REDACT = { CONF_LATITUDE, @@ -23,7 +23,5 @@ async def async_get_config_entry_diagnostics( hass: HomeAssistant, entry: ConfigEntry ) -> dict[str, Any]: """Return diagnostics for a config entry.""" - coordinator: DataUpdateCoordinator[dict[str, Any]] = hass.data[DOMAIN][ - entry.entry_id - ] + coordinator: LuftdatenDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] return async_redact_data(coordinator.data, TO_REDACT) diff --git a/homeassistant/components/luftdaten/sensor.py b/homeassistant/components/luftdaten/sensor.py index 2189386a4bb..9e66982a421 100644 --- a/homeassistant/components/luftdaten/sensor.py +++ b/homeassistant/components/luftdaten/sensor.py @@ -23,12 +23,10 @@ from homeassistant.const import ( from homeassistant.core import HomeAssistant from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback -from homeassistant.helpers.update_coordinator import ( - CoordinatorEntity, - DataUpdateCoordinator, -) +from homeassistant.helpers.update_coordinator import CoordinatorEntity from .const import ATTR_SENSOR_ID, CONF_SENSOR_ID, DOMAIN +from .coordinator import LuftdatenDataUpdateCoordinator SENSORS: tuple[SensorEntityDescription, ...] = ( SensorEntityDescription( @@ -77,7 +75,7 @@ async def async_setup_entry( async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up a Sensor.Community sensor based on a config entry.""" - coordinator = hass.data[DOMAIN][entry.entry_id] + coordinator: LuftdatenDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] async_add_entities( SensorCommunitySensor( @@ -101,7 +99,7 @@ class SensorCommunitySensor(CoordinatorEntity, SensorEntity): def __init__( self, *, - coordinator: DataUpdateCoordinator, + coordinator: LuftdatenDataUpdateCoordinator, description: SensorEntityDescription, sensor_id: int, show_on_map: bool,