"""Teslemetry Data Coordinator.""" from datetime import timedelta from typing import Any from tesla_fleet_api import VehicleSpecific from tesla_fleet_api.exceptions import TeslaFleetError, VehicleOffline from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from .const import LOGGER, TeslemetryState SYNC_INTERVAL = 60 class TeslemetryVehicleDataCoordinator(DataUpdateCoordinator[dict[str, Any]]): """Class to manage fetching data from the Teslemetry API.""" def __init__(self, hass: HomeAssistant, api: VehicleSpecific) -> None: """Initialize Teslemetry Data Update Coordinator.""" super().__init__( hass, LOGGER, name="Teslemetry Vehicle", update_interval=timedelta(seconds=SYNC_INTERVAL), ) self.api = api async def async_config_entry_first_refresh(self) -> None: """Perform first refresh.""" try: response = await self.api.wake_up() if response["response"]["state"] != TeslemetryState.ONLINE: # The first refresh will fail, so retry later raise ConfigEntryNotReady("Vehicle is not online") except TeslaFleetError as e: # The first refresh will also fail, so retry later raise ConfigEntryNotReady from e await super().async_config_entry_first_refresh() async def _async_update_data(self) -> dict[str, Any]: """Update vehicle data using Teslemetry API.""" try: data = await self.api.vehicle_data() except VehicleOffline: self.data["state"] = TeslemetryState.OFFLINE return self.data except TeslaFleetError as e: raise UpdateFailed(e.message) from e return self._flatten(data["response"]) def _flatten( self, data: dict[str, Any], parent: str | None = None ) -> dict[str, Any]: """Flatten the data structure.""" result = {} for key, value in data.items(): if parent: key = f"{parent}_{key}" if isinstance(value, dict): result.update(self._flatten(value, key)) else: result[key] = value return result