"""Update coordinator for HomeWizard.""" from __future__ import annotations from homewizard_energy import HomeWizardEnergy from homewizard_energy.errors import DisabledError, RequestError, UnauthorizedError from homewizard_energy.models import CombinedModels as DeviceResponseEntry from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryAuthFailed from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from .const import DOMAIN, LOGGER, UPDATE_INTERVAL type HomeWizardConfigEntry = ConfigEntry[HWEnergyDeviceUpdateCoordinator] class HWEnergyDeviceUpdateCoordinator(DataUpdateCoordinator[DeviceResponseEntry]): """Gather data for the energy device.""" api: HomeWizardEnergy api_disabled: bool = False config_entry: HomeWizardConfigEntry def __init__( self, hass: HomeAssistant, config_entry: HomeWizardConfigEntry, api: HomeWizardEnergy, ) -> None: """Initialize update coordinator.""" super().__init__( hass, LOGGER, config_entry=config_entry, name=DOMAIN, update_interval=UPDATE_INTERVAL, ) self.api = api async def _async_update_data(self) -> DeviceResponseEntry: """Fetch all device and sensor data from api.""" try: data = await self.api.combined() except RequestError as ex: raise UpdateFailed( ex, translation_domain=DOMAIN, translation_key="communication_error" ) from ex except DisabledError as ex: if not self.api_disabled: self.api_disabled = True # Do not reload when performing first refresh if self.data is not None: # Reload config entry to let init flow handle retrying and trigger repair flow self.hass.config_entries.async_schedule_reload( self.config_entry.entry_id ) raise UpdateFailed( ex, translation_domain=DOMAIN, translation_key="api_disabled" ) from ex except UnauthorizedError as ex: raise ConfigEntryAuthFailed from ex self.api_disabled = False self.data = data return data