core/homeassistant/components/geocaching/coordinator.py

49 lines
1.8 KiB
Python

"""Provides the Geocaching DataUpdateCoordinator."""
from __future__ import annotations
from geocachingapi.exceptions import GeocachingApiError
from geocachingapi.geocachingapi import GeocachingApi
from geocachingapi.models import GeocachingStatus
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.config_entry_oauth2_flow import OAuth2Session
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DOMAIN, ENVIRONMENT, LOGGER, UPDATE_INTERVAL
class GeocachingDataUpdateCoordinator(DataUpdateCoordinator[GeocachingStatus]):
"""Class to manage fetching Geocaching data from single endpoint."""
def __init__(
self, hass: HomeAssistant, *, entry: ConfigEntry, session: OAuth2Session
) -> None:
"""Initialize global Geocaching data updater."""
self.session = session
self.entry = entry
async def async_token_refresh() -> str:
await session.async_ensure_token_valid()
token = session.token["access_token"]
LOGGER.debug(str(token))
return str(token)
client_session = async_get_clientsession(hass)
self.geocaching = GeocachingApi(
environment=ENVIRONMENT,
token=session.token["access_token"],
session=client_session,
token_refresh_method=async_token_refresh,
)
super().__init__(hass, LOGGER, name=DOMAIN, update_interval=UPDATE_INTERVAL)
async def _async_update_data(self) -> GeocachingStatus:
try:
return await self.geocaching.update()
except GeocachingApiError as error:
raise UpdateFailed(f"Invalid response from API: {error}") from error