2020-07-05 22:09:40 +00:00
|
|
|
"""Define Guardian-specific utilities."""
|
|
|
|
import asyncio
|
|
|
|
from datetime import timedelta
|
|
|
|
from typing import Awaitable, Callable
|
|
|
|
|
|
|
|
from aioguardian import Client
|
|
|
|
from aioguardian.errors import GuardianError
|
|
|
|
|
|
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
|
|
|
|
|
|
|
from .const import LOGGER
|
|
|
|
|
|
|
|
DEFAULT_UPDATE_INTERVAL = timedelta(seconds=30)
|
|
|
|
|
|
|
|
|
2020-07-30 15:04:00 +00:00
|
|
|
class GuardianDataUpdateCoordinator(DataUpdateCoordinator[dict]):
|
2020-07-05 22:09:40 +00:00
|
|
|
"""Define an extended DataUpdateCoordinator with some Guardian goodies."""
|
|
|
|
|
|
|
|
def __init__(
|
|
|
|
self,
|
|
|
|
hass: HomeAssistant,
|
|
|
|
*,
|
|
|
|
client: Client,
|
|
|
|
api_name: str,
|
|
|
|
api_coro: Callable[..., Awaitable],
|
|
|
|
api_lock: asyncio.Lock,
|
|
|
|
valve_controller_uid: str,
|
|
|
|
):
|
|
|
|
"""Initialize."""
|
|
|
|
super().__init__(
|
|
|
|
hass,
|
|
|
|
LOGGER,
|
|
|
|
name=f"{valve_controller_uid}_{api_name}",
|
|
|
|
update_interval=DEFAULT_UPDATE_INTERVAL,
|
|
|
|
)
|
|
|
|
|
|
|
|
self._api_coro = api_coro
|
|
|
|
self._api_lock = api_lock
|
|
|
|
self._client = client
|
|
|
|
|
|
|
|
async def _async_update_data(self) -> dict:
|
|
|
|
"""Execute a "locked" API request against the valve controller."""
|
|
|
|
async with self._api_lock, self._client:
|
|
|
|
try:
|
|
|
|
resp = await self._api_coro()
|
|
|
|
except GuardianError as err:
|
2020-08-28 11:50:32 +00:00
|
|
|
raise UpdateFailed(err) from err
|
2020-07-05 22:09:40 +00:00
|
|
|
return resp["data"]
|