mirror of https://github.com/home-assistant/core
71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
"""Define an object to manage fetching AirGradient data."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from datetime import timedelta
|
|
from typing import TYPE_CHECKING
|
|
|
|
from airgradient import AirGradientClient, AirGradientError, Config, Measures
|
|
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import device_registry as dr
|
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
|
|
|
from .const import DOMAIN, LOGGER
|
|
|
|
if TYPE_CHECKING:
|
|
from . import AirGradientConfigEntry
|
|
|
|
|
|
@dataclass
|
|
class AirGradientData:
|
|
"""Class for AirGradient data."""
|
|
|
|
measures: Measures
|
|
config: Config
|
|
|
|
|
|
class AirGradientCoordinator(DataUpdateCoordinator[AirGradientData]):
|
|
"""Class to manage fetching AirGradient data."""
|
|
|
|
config_entry: AirGradientConfigEntry
|
|
_current_version: str
|
|
|
|
def __init__(self, hass: HomeAssistant, client: AirGradientClient) -> None:
|
|
"""Initialize coordinator."""
|
|
super().__init__(
|
|
hass,
|
|
logger=LOGGER,
|
|
name=f"AirGradient {client.host}",
|
|
update_interval=timedelta(minutes=1),
|
|
)
|
|
self.client = client
|
|
assert self.config_entry.unique_id
|
|
self.serial_number = self.config_entry.unique_id
|
|
|
|
async def _async_setup(self) -> None:
|
|
"""Set up the coordinator."""
|
|
self._current_version = (
|
|
await self.client.get_current_measures()
|
|
).firmware_version
|
|
|
|
async def _async_update_data(self) -> AirGradientData:
|
|
try:
|
|
measures = await self.client.get_current_measures()
|
|
config = await self.client.get_config()
|
|
except AirGradientError as error:
|
|
raise UpdateFailed(error) from error
|
|
if measures.firmware_version != self._current_version:
|
|
device_registry = dr.async_get(self.hass)
|
|
device_entry = device_registry.async_get_device(
|
|
identifiers={(DOMAIN, self.serial_number)}
|
|
)
|
|
assert device_entry
|
|
device_registry.async_update_device(
|
|
device_entry.id,
|
|
sw_version=measures.firmware_version,
|
|
)
|
|
self._current_version = measures.firmware_version
|
|
return AirGradientData(measures, config)
|