2024-05-09 08:54:29 +00:00
|
|
|
"""Define an object to manage fetching AirGradient data."""
|
|
|
|
|
|
|
|
from datetime import timedelta
|
|
|
|
|
2024-05-29 18:12:51 +00:00
|
|
|
from airgradient import AirGradientClient, AirGradientError, Config, Measures
|
2024-05-09 08:54:29 +00:00
|
|
|
|
2024-05-29 18:12:51 +00:00
|
|
|
from homeassistant.config_entries import ConfigEntry
|
2024-05-09 08:54:29 +00:00
|
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
|
|
|
|
|
|
|
from .const import LOGGER
|
|
|
|
|
|
|
|
|
2024-05-29 18:12:51 +00:00
|
|
|
class AirGradientCoordinator[_DataT](DataUpdateCoordinator[_DataT]):
|
2024-05-09 08:54:29 +00:00
|
|
|
"""Class to manage fetching AirGradient data."""
|
|
|
|
|
2024-05-29 18:12:51 +00:00
|
|
|
_update_interval: timedelta
|
|
|
|
config_entry: ConfigEntry
|
|
|
|
|
|
|
|
def __init__(self, hass: HomeAssistant, client: AirGradientClient) -> None:
|
2024-05-09 08:54:29 +00:00
|
|
|
"""Initialize coordinator."""
|
|
|
|
super().__init__(
|
|
|
|
hass,
|
|
|
|
logger=LOGGER,
|
2024-05-29 18:12:51 +00:00
|
|
|
name=f"AirGradient {client.host}",
|
|
|
|
update_interval=self._update_interval,
|
2024-05-09 08:54:29 +00:00
|
|
|
)
|
2024-05-29 18:12:51 +00:00
|
|
|
self.client = client
|
|
|
|
assert self.config_entry.unique_id
|
|
|
|
self.serial_number = self.config_entry.unique_id
|
2024-05-09 08:54:29 +00:00
|
|
|
|
2024-05-29 18:12:51 +00:00
|
|
|
async def _async_update_data(self) -> _DataT:
|
2024-05-09 08:54:29 +00:00
|
|
|
try:
|
2024-05-29 18:12:51 +00:00
|
|
|
return await self._update_data()
|
2024-05-09 08:54:29 +00:00
|
|
|
except AirGradientError as error:
|
|
|
|
raise UpdateFailed(error) from error
|
2024-05-29 18:12:51 +00:00
|
|
|
|
|
|
|
async def _update_data(self) -> _DataT:
|
|
|
|
raise NotImplementedError
|
|
|
|
|
|
|
|
|
|
|
|
class AirGradientMeasurementCoordinator(AirGradientCoordinator[Measures]):
|
|
|
|
"""Class to manage fetching AirGradient data."""
|
|
|
|
|
|
|
|
_update_interval = timedelta(minutes=1)
|
|
|
|
|
|
|
|
async def _update_data(self) -> Measures:
|
|
|
|
return await self.client.get_current_measures()
|
|
|
|
|
|
|
|
|
|
|
|
class AirGradientConfigCoordinator(AirGradientCoordinator[Config]):
|
|
|
|
"""Class to manage fetching AirGradient data."""
|
|
|
|
|
|
|
|
_update_interval = timedelta(minutes=5)
|
|
|
|
|
|
|
|
async def _update_data(self) -> Config:
|
|
|
|
return await self.client.get_config()
|