1 """Tesla Fleet Data Coordinator."""
3 from datetime
import datetime, timedelta
6 from tesla_fleet_api
import EnergySpecific, VehicleSpecific
7 from tesla_fleet_api.const
import VehicleDataEndpoint
8 from tesla_fleet_api.exceptions
import (
16 from tesla_fleet_api.ratecalculator
import RateCalculator
22 from .const
import LOGGER, TeslaFleetState
24 VEHICLE_INTERVAL_SECONDS = 90
25 VEHICLE_INTERVAL =
timedelta(seconds=VEHICLE_INTERVAL_SECONDS)
28 ENERGY_INTERVAL_SECONDS = 60
29 ENERGY_INTERVAL =
timedelta(seconds=ENERGY_INTERVAL_SECONDS)
32 VehicleDataEndpoint.CHARGE_STATE,
33 VehicleDataEndpoint.CLIMATE_STATE,
34 VehicleDataEndpoint.DRIVE_STATE,
35 VehicleDataEndpoint.LOCATION_DATA,
36 VehicleDataEndpoint.VEHICLE_STATE,
37 VehicleDataEndpoint.VEHICLE_CONFIG,
41 def flatten(data: dict[str, Any], parent: str |
None =
None) -> dict[str, Any]:
42 """Flatten the data structure."""
44 for key, value
in data.items():
46 key = f
"{parent}_{key}"
47 if isinstance(value, dict):
48 result.update(
flatten(value, key))
55 """Class to manage fetching data from the TeslaFleet API."""
63 self, hass: HomeAssistant, api: VehicleSpecific, product: dict
65 """Initialize TeslaFleet Vehicle Update Coordinator."""
69 name=
"Tesla Fleet Vehicle",
70 update_interval=VEHICLE_INTERVAL,
76 self.
raterate = RateCalculator(200, 86400, VEHICLE_INTERVAL_SECONDS, 3600, 5)
79 """Update vehicle data using TeslaFleet API."""
83 if self.
datadatadata[
"state"] != TeslaFleetState.ONLINE:
84 response = await self.
apiapi.vehicle()
85 self.
datadatadata[
"state"] = response[
"response"][
"state"]
87 if self.
datadatadata[
"state"] != TeslaFleetState.ONLINE:
91 self.
raterate.consume()
92 response = await self.
apiapi.vehicle_data(endpoints=ENDPOINTS)
93 data = response[
"response"]
95 except VehicleOffline:
96 self.
datadatadata[
"state"] = TeslaFleetState.ASLEEP
98 except RateLimited
as e:
100 "%s rate limited, will retry in %s seconds",
104 if "after" in e.data:
107 except (InvalidToken, OAuthExpired, LoginRequired)
as e:
108 raise ConfigEntryAuthFailed
from e
109 except TeslaFleetError
as e:
117 if self.
apiapi.pre2021
and data[
"state"] == TeslaFleetState.ONLINE:
120 data[
"charge_state"].
get(
"charging_state") ==
"Charging"
121 or data[
"vehicle_state"].
get(
"is_user_present")
122 or data[
"vehicle_state"].
get(
"sentry_mode")
127 elapsed = datetime.now() - self.
last_activelast_active
139 """Class to manage fetching energy site live status from the TeslaFleet API."""
143 def __init__(self, hass: HomeAssistant, api: EnergySpecific) ->
None:
144 """Initialize TeslaFleet Energy Site Live coordinator."""
148 name=
"Tesla Fleet Energy Site Live",
156 """Update energy site data using TeslaFleet API."""
161 data = (await self.
apiapi.live_status())[
"response"]
162 except RateLimited
as e:
164 "%s rate limited, will retry in %s seconds",
168 if "after" in e.data:
171 except (InvalidToken, OAuthExpired, LoginRequired)
as e:
172 raise ConfigEntryAuthFailed
from e
173 except TeslaFleetError
as e:
177 data[
"wall_connectors"] = {
178 wc[
"din"]: wc
for wc
in (data.get(
"wall_connectors")
or [])
186 """Class to manage fetching energy site info from the TeslaFleet API."""
190 def __init__(self, hass: HomeAssistant, api: EnergySpecific, product: dict) ->
None:
191 """Initialize TeslaFleet Energy Info coordinator."""
195 name=
"Tesla Fleet Energy Site Info",
203 """Update energy site data using TeslaFleet API."""
208 data = (await self.
apiapi.site_info())[
"response"]
209 except RateLimited
as e:
211 "%s rate limited, will retry in %s seconds",
215 if "after" in e.data:
218 except (InvalidToken, OAuthExpired, LoginRequired)
as e:
219 raise ConfigEntryAuthFailed
from e
220 except TeslaFleetError
as e:
None __init__(self, HomeAssistant hass, EnergySpecific api, dict product)
dict[str, Any] _async_update_data(self)
None __init__(self, HomeAssistant hass, EnergySpecific api)
dict[str, Any] _async_update_data(self)
None __init__(self, HomeAssistant hass, VehicleSpecific api, dict product)
dict[str, Any] _async_update_data(self)
None update_interval(self, timedelta|None value)
timedelta|None update_interval(self)
web.Response get(self, web.Request request, str config_key)
dict[str, Any] flatten(dict[str, Any] data, str|None parent=None)