core/homeassistant/components/easyenergy/coordinator.py

85 lines
2.7 KiB
Python

"""The Coordinator for easyEnergy."""
from __future__ import annotations
from datetime import timedelta
from typing import NamedTuple
from easyenergy import (
EasyEnergy,
EasyEnergyConnectionError,
EasyEnergyNoDataError,
Electricity,
Gas,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from homeassistant.util import dt as dt_util
from .const import DOMAIN, LOGGER, SCAN_INTERVAL, THRESHOLD_HOUR
class EasyEnergyData(NamedTuple):
"""Class for defining data in dict."""
energy_today: Electricity
energy_tomorrow: Electricity | None
gas_today: Gas | None
class EasyEnergyDataUpdateCoordinator(DataUpdateCoordinator[EasyEnergyData]):
"""Class to manage fetching easyEnergy data from single endpoint."""
config_entry: ConfigEntry
def __init__(self, hass: HomeAssistant) -> None:
"""Initialize global easyEnergy data updater."""
super().__init__(
hass,
LOGGER,
name=DOMAIN,
update_interval=SCAN_INTERVAL,
)
self.easyenergy = EasyEnergy(session=async_get_clientsession(hass))
async def _async_update_data(self) -> EasyEnergyData:
"""Fetch data from easyEnergy."""
today = dt_util.now().date()
gas_today = None
energy_tomorrow = None
try:
energy_today = await self.easyenergy.energy_prices(
start_date=today, end_date=today
)
try:
gas_today = await self.easyenergy.gas_prices(
start_date=today, end_date=today
)
except EasyEnergyNoDataError:
LOGGER.debug("No data for gas prices for easyEnergy integration")
# Energy for tomorrow only after 14:00 UTC
if dt_util.utcnow().hour >= THRESHOLD_HOUR:
tomorrow = today + timedelta(days=1)
try:
energy_tomorrow = await self.easyenergy.energy_prices(
start_date=tomorrow, end_date=tomorrow
)
except EasyEnergyNoDataError:
LOGGER.debug(
"No electricity data for tomorrow for easyEnergy integration"
)
except EasyEnergyConnectionError as err:
raise UpdateFailed("Error communicating with easyEnergy API") from err
return EasyEnergyData(
energy_today=energy_today,
energy_tomorrow=energy_tomorrow,
gas_today=gas_today,
)