Move luftdaten coordinator to separate module (#147477)

This commit is contained in:
epenet 2025-06-25 07:48:56 +02:00 committed by GitHub
parent 2bcdc03661
commit f22b623968
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 65 additions and 40 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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,