From 46158f5c14eeccea830454297ee6ba22e3d9b7bd Mon Sep 17 00:00:00 2001 From: Brett Adams Date: Mon, 27 May 2024 20:37:33 +1000 Subject: [PATCH] Allow older vehicles to sleep in Teslemetry (#117229) * Allow older vehicles to sleep * Remove updated_once * move pre2021 to lib * bump * Bump again * Bump to 0.5.11 * Fix VIN so it matches the check * Fix snapshot * Snapshots * Fix self.updated_once * Remove old pre2021 attribute * fix snapshots --------- Co-authored-by: G Johansson --- .../components/teslemetry/coordinator.py | 37 +++++++++-- .../components/teslemetry/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- .../teslemetry/fixtures/products.json | 2 +- .../teslemetry/fixtures/vehicle_data.json | 2 +- .../teslemetry/fixtures/vehicle_data_alt.json | 4 +- .../snapshots/test_binary_sensors.ambr | 48 +++++++------- .../teslemetry/snapshots/test_button.ambr | 12 ++-- .../teslemetry/snapshots/test_climate.ambr | 6 +- .../teslemetry/snapshots/test_cover.ambr | 24 +++---- .../snapshots/test_device_tracker.ambr | 4 +- .../teslemetry/snapshots/test_init.ambr | 8 +-- .../teslemetry/snapshots/test_lock.ambr | 4 +- .../snapshots/test_media_player.ambr | 4 +- .../teslemetry/snapshots/test_number.ambr | 4 +- .../teslemetry/snapshots/test_select.ambr | 16 ++--- .../teslemetry/snapshots/test_sensor.ambr | 60 ++++++++--------- .../teslemetry/snapshots/test_switch.ambr | 12 ++-- .../teslemetry/snapshots/test_update.ambr | 4 +- tests/components/teslemetry/test_init.py | 65 ++++++++++++++++++- 21 files changed, 203 insertions(+), 119 deletions(-) diff --git a/homeassistant/components/teslemetry/coordinator.py b/homeassistant/components/teslemetry/coordinator.py index ea6025df52b..cc29bc8ad18 100644 --- a/homeassistant/components/teslemetry/coordinator.py +++ b/homeassistant/components/teslemetry/coordinator.py @@ -1,11 +1,12 @@ """Teslemetry Data Coordinator.""" -from datetime import timedelta +from datetime import datetime, timedelta from typing import Any from tesla_fleet_api import EnergySpecific, VehicleSpecific from tesla_fleet_api.const import VehicleDataEndpoint from tesla_fleet_api.exceptions import ( + Forbidden, InvalidToken, SubscriptionRequired, TeslaFleetError, @@ -19,6 +20,7 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, Upda from .const import LOGGER, TeslemetryState VEHICLE_INTERVAL = timedelta(seconds=30) +VEHICLE_WAIT = timedelta(minutes=15) ENERGY_LIVE_INTERVAL = timedelta(seconds=30) ENERGY_INFO_INTERVAL = timedelta(seconds=30) @@ -49,6 +51,8 @@ class TeslemetryVehicleDataCoordinator(DataUpdateCoordinator[dict[str, Any]]): """Class to manage fetching data from the Teslemetry API.""" updated_once: bool + pre2021: bool + last_active: datetime def __init__( self, hass: HomeAssistant, api: VehicleSpecific, product: dict @@ -63,9 +67,13 @@ class TeslemetryVehicleDataCoordinator(DataUpdateCoordinator[dict[str, Any]]): self.api = api self.data = flatten(product) self.updated_once = False + self.last_active = datetime.now() async def _async_update_data(self) -> dict[str, Any]: """Update vehicle data using Teslemetry API.""" + + self.update_interval = VEHICLE_INTERVAL + try: data = (await self.api.vehicle_data(endpoints=ENDPOINTS))["response"] except VehicleOffline: @@ -79,6 +87,25 @@ class TeslemetryVehicleDataCoordinator(DataUpdateCoordinator[dict[str, Any]]): raise UpdateFailed(e.message) from e self.updated_once = True + + if self.api.pre2021 and data["state"] == TeslemetryState.ONLINE: + # Handle pre-2021 vehicles which cannot sleep by themselves + if ( + data["charge_state"].get("charging_state") == "Charging" + or data["vehicle_state"].get("is_user_present") + or data["vehicle_state"].get("sentry_mode") + ): + # Vehicle is active, reset timer + self.last_active = datetime.now() + else: + elapsed = datetime.now() - self.last_active + if elapsed > timedelta(minutes=20): + # Vehicle didn't sleep, try again in 15 minutes + self.last_active = datetime.now() + elif elapsed > timedelta(minutes=15): + # Let vehicle go to sleep now + self.update_interval = VEHICLE_WAIT + return flatten(data) @@ -102,9 +129,7 @@ class TeslemetryEnergySiteLiveCoordinator(DataUpdateCoordinator[dict[str, Any]]) try: data = (await self.api.live_status())["response"] - except InvalidToken as e: - raise ConfigEntryAuthFailed from e - except SubscriptionRequired as e: + except (InvalidToken, Forbidden, SubscriptionRequired) as e: raise ConfigEntryAuthFailed from e except TeslaFleetError as e: raise UpdateFailed(e.message) from e @@ -138,9 +163,7 @@ class TeslemetryEnergySiteInfoCoordinator(DataUpdateCoordinator[dict[str, Any]]) try: data = (await self.api.site_info())["response"] - except InvalidToken as e: - raise ConfigEntryAuthFailed from e - except SubscriptionRequired as e: + except (InvalidToken, Forbidden, SubscriptionRequired) as e: raise ConfigEntryAuthFailed from e except TeslaFleetError as e: raise UpdateFailed(e.message) from e diff --git a/homeassistant/components/teslemetry/manifest.json b/homeassistant/components/teslemetry/manifest.json index 7f3f1704f2d..14ac4a315d4 100644 --- a/homeassistant/components/teslemetry/manifest.json +++ b/homeassistant/components/teslemetry/manifest.json @@ -6,5 +6,5 @@ "documentation": "https://www.home-assistant.io/integrations/teslemetry", "iot_class": "cloud_polling", "loggers": ["tesla-fleet-api"], - "requirements": ["tesla-fleet-api==0.4.9"] + "requirements": ["tesla-fleet-api==0.5.12"] } diff --git a/requirements_all.txt b/requirements_all.txt index 0060c4ec57c..13df2b16b60 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2704,7 +2704,7 @@ temperusb==1.6.1 # tensorflow==2.5.0 # homeassistant.components.teslemetry -tesla-fleet-api==0.4.9 +tesla-fleet-api==0.5.12 # homeassistant.components.powerwall tesla-powerwall==0.5.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 762d4d6222d..48fbe7913ee 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -2096,7 +2096,7 @@ temescal==0.5 temperusb==1.6.1 # homeassistant.components.teslemetry -tesla-fleet-api==0.4.9 +tesla-fleet-api==0.5.12 # homeassistant.components.powerwall tesla-powerwall==0.5.2 diff --git a/tests/components/teslemetry/fixtures/products.json b/tests/components/teslemetry/fixtures/products.json index aa59062e8d4..e1b76e4cefb 100644 --- a/tests/components/teslemetry/fixtures/products.json +++ b/tests/components/teslemetry/fixtures/products.json @@ -4,7 +4,7 @@ "id": 1234, "user_id": 1234, "vehicle_id": 1234, - "vin": "VINVINVIN", + "vin": "LRWXF7EK4KC700000", "color": null, "access_type": "OWNER", "display_name": "Test", diff --git a/tests/components/teslemetry/fixtures/vehicle_data.json b/tests/components/teslemetry/fixtures/vehicle_data.json index b5b78242496..50022d7f4e9 100644 --- a/tests/components/teslemetry/fixtures/vehicle_data.json +++ b/tests/components/teslemetry/fixtures/vehicle_data.json @@ -3,7 +3,7 @@ "id": 1234, "user_id": 1234, "vehicle_id": 1234, - "vin": "VINVINVIN", + "vin": "LRWXF7EK4KC700000", "color": null, "access_type": "OWNER", "granular_access": { diff --git a/tests/components/teslemetry/fixtures/vehicle_data_alt.json b/tests/components/teslemetry/fixtures/vehicle_data_alt.json index 68371d857cb..46f65e90760 100644 --- a/tests/components/teslemetry/fixtures/vehicle_data_alt.json +++ b/tests/components/teslemetry/fixtures/vehicle_data_alt.json @@ -3,7 +3,7 @@ "id": 1234, "user_id": 1234, "vehicle_id": 1234, - "vin": "VINVINVIN", + "vin": "LRWXF7EK4KC700000", "color": null, "access_type": "OWNER", "granular_access": { @@ -201,7 +201,7 @@ "feature_bitmask": "fbdffbff,187f", "fp_window": 1, "ft": 1, - "is_user_present": false, + "is_user_present": true, "locked": false, "media_info": { "audio_volume": 2.6667, diff --git a/tests/components/teslemetry/snapshots/test_binary_sensors.ambr b/tests/components/teslemetry/snapshots/test_binary_sensors.ambr index f7a7df862a0..6f35fe9da25 100644 --- a/tests/components/teslemetry/snapshots/test_binary_sensors.ambr +++ b/tests/components/teslemetry/snapshots/test_binary_sensors.ambr @@ -166,7 +166,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_battery_heater_on', - 'unique_id': 'VINVINVIN-charge_state_battery_heater_on', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_battery_heater_on', 'unit_of_measurement': None, }) # --- @@ -213,7 +213,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_cabin_overheat_protection_actively_cooling', - 'unique_id': 'VINVINVIN-climate_state_cabin_overheat_protection_actively_cooling', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_cabin_overheat_protection_actively_cooling', 'unit_of_measurement': None, }) # --- @@ -260,7 +260,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_conn_charge_cable', - 'unique_id': 'VINVINVIN-charge_state_conn_charge_cable', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_conn_charge_cable', 'unit_of_measurement': None, }) # --- @@ -307,7 +307,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_charger_phases', - 'unique_id': 'VINVINVIN-charge_state_charger_phases', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_charger_phases', 'unit_of_measurement': None, }) # --- @@ -353,7 +353,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_dashcam_state', - 'unique_id': 'VINVINVIN-vehicle_state_dashcam_state', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_dashcam_state', 'unit_of_measurement': None, }) # --- @@ -400,7 +400,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_df', - 'unique_id': 'VINVINVIN-vehicle_state_df', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_df', 'unit_of_measurement': None, }) # --- @@ -447,7 +447,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_fd_window', - 'unique_id': 'VINVINVIN-vehicle_state_fd_window', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_fd_window', 'unit_of_measurement': None, }) # --- @@ -494,7 +494,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_pf', - 'unique_id': 'VINVINVIN-vehicle_state_pf', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_pf', 'unit_of_measurement': None, }) # --- @@ -541,7 +541,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_fp_window', - 'unique_id': 'VINVINVIN-vehicle_state_fp_window', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_fp_window', 'unit_of_measurement': None, }) # --- @@ -588,7 +588,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_is_preconditioning', - 'unique_id': 'VINVINVIN-climate_state_is_preconditioning', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_is_preconditioning', 'unit_of_measurement': None, }) # --- @@ -634,7 +634,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_preconditioning_enabled', - 'unique_id': 'VINVINVIN-charge_state_preconditioning_enabled', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_preconditioning_enabled', 'unit_of_measurement': None, }) # --- @@ -680,7 +680,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_dr', - 'unique_id': 'VINVINVIN-vehicle_state_dr', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_dr', 'unit_of_measurement': None, }) # --- @@ -727,7 +727,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_rd_window', - 'unique_id': 'VINVINVIN-vehicle_state_rd_window', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_rd_window', 'unit_of_measurement': None, }) # --- @@ -774,7 +774,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_pr', - 'unique_id': 'VINVINVIN-vehicle_state_pr', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_pr', 'unit_of_measurement': None, }) # --- @@ -821,7 +821,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_rp_window', - 'unique_id': 'VINVINVIN-vehicle_state_rp_window', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_rp_window', 'unit_of_measurement': None, }) # --- @@ -868,7 +868,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_scheduled_charging_pending', - 'unique_id': 'VINVINVIN-charge_state_scheduled_charging_pending', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_scheduled_charging_pending', 'unit_of_measurement': None, }) # --- @@ -914,7 +914,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'state', - 'unique_id': 'VINVINVIN-state', + 'unique_id': 'LRWXF7EK4KC700000-state', 'unit_of_measurement': None, }) # --- @@ -961,7 +961,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_tpms_soft_warning_fl', - 'unique_id': 'VINVINVIN-vehicle_state_tpms_soft_warning_fl', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_tpms_soft_warning_fl', 'unit_of_measurement': None, }) # --- @@ -1008,7 +1008,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_tpms_soft_warning_fr', - 'unique_id': 'VINVINVIN-vehicle_state_tpms_soft_warning_fr', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_tpms_soft_warning_fr', 'unit_of_measurement': None, }) # --- @@ -1055,7 +1055,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_tpms_soft_warning_rl', - 'unique_id': 'VINVINVIN-vehicle_state_tpms_soft_warning_rl', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_tpms_soft_warning_rl', 'unit_of_measurement': None, }) # --- @@ -1102,7 +1102,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_tpms_soft_warning_rr', - 'unique_id': 'VINVINVIN-vehicle_state_tpms_soft_warning_rr', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_tpms_soft_warning_rr', 'unit_of_measurement': None, }) # --- @@ -1149,7 +1149,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_trip_charging', - 'unique_id': 'VINVINVIN-charge_state_trip_charging', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_trip_charging', 'unit_of_measurement': None, }) # --- @@ -1195,7 +1195,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_is_user_present', - 'unique_id': 'VINVINVIN-vehicle_state_is_user_present', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_is_user_present', 'unit_of_measurement': None, }) # --- @@ -1566,6 +1566,6 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': 'off', + 'state': 'on', }) # --- diff --git a/tests/components/teslemetry/snapshots/test_button.ambr b/tests/components/teslemetry/snapshots/test_button.ambr index a8db0d1cebc..84cf4c21078 100644 --- a/tests/components/teslemetry/snapshots/test_button.ambr +++ b/tests/components/teslemetry/snapshots/test_button.ambr @@ -28,7 +28,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'flash_lights', - 'unique_id': 'VINVINVIN-flash_lights', + 'unique_id': 'LRWXF7EK4KC700000-flash_lights', 'unit_of_measurement': None, }) # --- @@ -74,7 +74,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'homelink', - 'unique_id': 'VINVINVIN-homelink', + 'unique_id': 'LRWXF7EK4KC700000-homelink', 'unit_of_measurement': None, }) # --- @@ -120,7 +120,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'honk', - 'unique_id': 'VINVINVIN-honk', + 'unique_id': 'LRWXF7EK4KC700000-honk', 'unit_of_measurement': None, }) # --- @@ -166,7 +166,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'enable_keyless_driving', - 'unique_id': 'VINVINVIN-enable_keyless_driving', + 'unique_id': 'LRWXF7EK4KC700000-enable_keyless_driving', 'unit_of_measurement': None, }) # --- @@ -212,7 +212,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'boombox', - 'unique_id': 'VINVINVIN-boombox', + 'unique_id': 'LRWXF7EK4KC700000-boombox', 'unit_of_measurement': None, }) # --- @@ -258,7 +258,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'wake', - 'unique_id': 'VINVINVIN-wake', + 'unique_id': 'LRWXF7EK4KC700000-wake', 'unit_of_measurement': None, }) # --- diff --git a/tests/components/teslemetry/snapshots/test_climate.ambr b/tests/components/teslemetry/snapshots/test_climate.ambr index 8e2433ab610..b25baf239c9 100644 --- a/tests/components/teslemetry/snapshots/test_climate.ambr +++ b/tests/components/teslemetry/snapshots/test_climate.ambr @@ -41,7 +41,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': , - 'unique_id': 'VINVINVIN-driver_temp', + 'unique_id': 'LRWXF7EK4KC700000-driver_temp', 'unit_of_measurement': None, }) # --- @@ -116,7 +116,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': , - 'unique_id': 'VINVINVIN-driver_temp', + 'unique_id': 'LRWXF7EK4KC700000-driver_temp', 'unit_of_measurement': None, }) # --- @@ -191,7 +191,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': , - 'unique_id': 'VINVINVIN-driver_temp', + 'unique_id': 'LRWXF7EK4KC700000-driver_temp', 'unit_of_measurement': None, }) # --- diff --git a/tests/components/teslemetry/snapshots/test_cover.ambr b/tests/components/teslemetry/snapshots/test_cover.ambr index 4b467a1e868..7689a08a373 100644 --- a/tests/components/teslemetry/snapshots/test_cover.ambr +++ b/tests/components/teslemetry/snapshots/test_cover.ambr @@ -28,7 +28,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': 'charge_state_charge_port_door_open', - 'unique_id': 'VINVINVIN-charge_state_charge_port_door_open', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_charge_port_door_open', 'unit_of_measurement': None, }) # --- @@ -76,7 +76,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': 'vehicle_state_ft', - 'unique_id': 'VINVINVIN-vehicle_state_ft', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_ft', 'unit_of_measurement': None, }) # --- @@ -124,7 +124,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': 'vehicle_state_rt', - 'unique_id': 'VINVINVIN-vehicle_state_rt', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_rt', 'unit_of_measurement': None, }) # --- @@ -172,7 +172,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': 'windows', - 'unique_id': 'VINVINVIN-windows', + 'unique_id': 'LRWXF7EK4KC700000-windows', 'unit_of_measurement': None, }) # --- @@ -220,7 +220,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': 'charge_state_charge_port_door_open', - 'unique_id': 'VINVINVIN-charge_state_charge_port_door_open', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_charge_port_door_open', 'unit_of_measurement': None, }) # --- @@ -268,7 +268,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': 'vehicle_state_ft', - 'unique_id': 'VINVINVIN-vehicle_state_ft', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_ft', 'unit_of_measurement': None, }) # --- @@ -316,7 +316,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': 'vehicle_state_rt', - 'unique_id': 'VINVINVIN-vehicle_state_rt', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_rt', 'unit_of_measurement': None, }) # --- @@ -364,7 +364,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': 'windows', - 'unique_id': 'VINVINVIN-windows', + 'unique_id': 'LRWXF7EK4KC700000-windows', 'unit_of_measurement': None, }) # --- @@ -412,7 +412,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_charge_port_door_open', - 'unique_id': 'VINVINVIN-charge_state_charge_port_door_open', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_charge_port_door_open', 'unit_of_measurement': None, }) # --- @@ -460,7 +460,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_ft', - 'unique_id': 'VINVINVIN-vehicle_state_ft', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_ft', 'unit_of_measurement': None, }) # --- @@ -508,7 +508,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_rt', - 'unique_id': 'VINVINVIN-vehicle_state_rt', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_rt', 'unit_of_measurement': None, }) # --- @@ -556,7 +556,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'windows', - 'unique_id': 'VINVINVIN-windows', + 'unique_id': 'LRWXF7EK4KC700000-windows', 'unit_of_measurement': None, }) # --- diff --git a/tests/components/teslemetry/snapshots/test_device_tracker.ambr b/tests/components/teslemetry/snapshots/test_device_tracker.ambr index 369a3e3a2b9..9859d9db360 100644 --- a/tests/components/teslemetry/snapshots/test_device_tracker.ambr +++ b/tests/components/teslemetry/snapshots/test_device_tracker.ambr @@ -28,7 +28,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'location', - 'unique_id': 'VINVINVIN-location', + 'unique_id': 'LRWXF7EK4KC700000-location', 'unit_of_measurement': None, }) # --- @@ -78,7 +78,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'route', - 'unique_id': 'VINVINVIN-route', + 'unique_id': 'LRWXF7EK4KC700000-route', 'unit_of_measurement': None, }) # --- diff --git a/tests/components/teslemetry/snapshots/test_init.ambr b/tests/components/teslemetry/snapshots/test_init.ambr index cf1f9cd539c..74c3ac011a5 100644 --- a/tests/components/teslemetry/snapshots/test_init.ambr +++ b/tests/components/teslemetry/snapshots/test_init.ambr @@ -29,7 +29,7 @@ 'via_device_id': None, }) # --- -# name: test_devices[{('teslemetry', 'VINVINVIN')}] +# name: test_devices[{('teslemetry', 'LRWXF7EK4KC700000')}] DeviceRegistryEntrySnapshot({ 'area_id': None, 'config_entries': , @@ -43,17 +43,17 @@ 'identifiers': set({ tuple( 'teslemetry', - 'VINVINVIN', + 'LRWXF7EK4KC700000', ), }), 'is_new': False, 'labels': set({ }), 'manufacturer': 'Tesla', - 'model': None, + 'model': 'Model X', 'name': 'Test', 'name_by_user': None, - 'serial_number': 'VINVINVIN', + 'serial_number': 'LRWXF7EK4KC700000', 'suggested_area': None, 'sw_version': None, 'via_device_id': None, diff --git a/tests/components/teslemetry/snapshots/test_lock.ambr b/tests/components/teslemetry/snapshots/test_lock.ambr index e7116fa675a..deaabbae904 100644 --- a/tests/components/teslemetry/snapshots/test_lock.ambr +++ b/tests/components/teslemetry/snapshots/test_lock.ambr @@ -28,7 +28,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_charge_port_latch', - 'unique_id': 'VINVINVIN-charge_state_charge_port_latch', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_charge_port_latch', 'unit_of_measurement': None, }) # --- @@ -75,7 +75,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_locked', - 'unique_id': 'VINVINVIN-vehicle_state_locked', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_locked', 'unit_of_measurement': None, }) # --- diff --git a/tests/components/teslemetry/snapshots/test_media_player.ambr b/tests/components/teslemetry/snapshots/test_media_player.ambr index f0344ddef4c..06500437701 100644 --- a/tests/components/teslemetry/snapshots/test_media_player.ambr +++ b/tests/components/teslemetry/snapshots/test_media_player.ambr @@ -29,7 +29,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': 'media', - 'unique_id': 'VINVINVIN-media', + 'unique_id': 'LRWXF7EK4KC700000-media', 'unit_of_measurement': None, }) # --- @@ -107,7 +107,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'media', - 'unique_id': 'VINVINVIN-media', + 'unique_id': 'LRWXF7EK4KC700000-media', 'unit_of_measurement': None, }) # --- diff --git a/tests/components/teslemetry/snapshots/test_number.ambr b/tests/components/teslemetry/snapshots/test_number.ambr index 5cfa63b8d41..7ead67a1e95 100644 --- a/tests/components/teslemetry/snapshots/test_number.ambr +++ b/tests/components/teslemetry/snapshots/test_number.ambr @@ -149,7 +149,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_charge_current_request', - 'unique_id': 'VINVINVIN-charge_state_charge_current_request', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_charge_current_request', 'unit_of_measurement': , }) # --- @@ -206,7 +206,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_charge_limit_soc', - 'unique_id': 'VINVINVIN-charge_state_charge_limit_soc', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_charge_limit_soc', 'unit_of_measurement': '%', }) # --- diff --git a/tests/components/teslemetry/snapshots/test_select.ambr b/tests/components/teslemetry/snapshots/test_select.ambr index 5cba9da7ebe..4e6feda7e5d 100644 --- a/tests/components/teslemetry/snapshots/test_select.ambr +++ b/tests/components/teslemetry/snapshots/test_select.ambr @@ -149,7 +149,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_seat_heater_left', - 'unique_id': 'VINVINVIN-climate_state_seat_heater_left', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_seat_heater_left', 'unit_of_measurement': None, }) # --- @@ -208,7 +208,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_seat_heater_right', - 'unique_id': 'VINVINVIN-climate_state_seat_heater_right', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_seat_heater_right', 'unit_of_measurement': None, }) # --- @@ -267,7 +267,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_seat_heater_rear_center', - 'unique_id': 'VINVINVIN-climate_state_seat_heater_rear_center', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_seat_heater_rear_center', 'unit_of_measurement': None, }) # --- @@ -326,7 +326,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_seat_heater_rear_left', - 'unique_id': 'VINVINVIN-climate_state_seat_heater_rear_left', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_seat_heater_rear_left', 'unit_of_measurement': None, }) # --- @@ -385,7 +385,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_seat_heater_rear_right', - 'unique_id': 'VINVINVIN-climate_state_seat_heater_rear_right', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_seat_heater_rear_right', 'unit_of_measurement': None, }) # --- @@ -444,7 +444,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_seat_heater_third_row_left', - 'unique_id': 'VINVINVIN-climate_state_seat_heater_third_row_left', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_seat_heater_third_row_left', 'unit_of_measurement': None, }) # --- @@ -503,7 +503,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_seat_heater_third_row_right', - 'unique_id': 'VINVINVIN-climate_state_seat_heater_third_row_right', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_seat_heater_third_row_right', 'unit_of_measurement': None, }) # --- @@ -561,7 +561,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_steering_wheel_heat_level', - 'unique_id': 'VINVINVIN-climate_state_steering_wheel_heat_level', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_steering_wheel_heat_level', 'unit_of_measurement': None, }) # --- diff --git a/tests/components/teslemetry/snapshots/test_sensor.ambr b/tests/components/teslemetry/snapshots/test_sensor.ambr index 5dd42dc0b82..0b664e78626 100644 --- a/tests/components/teslemetry/snapshots/test_sensor.ambr +++ b/tests/components/teslemetry/snapshots/test_sensor.ambr @@ -867,7 +867,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_battery_level', - 'unique_id': 'VINVINVIN-charge_state_battery_level', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_battery_level', 'unit_of_measurement': '%', }) # --- @@ -940,7 +940,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_battery_range', - 'unique_id': 'VINVINVIN-charge_state_battery_range', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_battery_range', 'unit_of_measurement': , }) # --- @@ -1005,7 +1005,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_conn_charge_cable', - 'unique_id': 'VINVINVIN-charge_state_conn_charge_cable', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_conn_charge_cable', 'unit_of_measurement': None, }) # --- @@ -1069,7 +1069,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_charge_energy_added', - 'unique_id': 'VINVINVIN-charge_state_charge_energy_added', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_charge_energy_added', 'unit_of_measurement': , }) # --- @@ -1139,7 +1139,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_charge_rate', - 'unique_id': 'VINVINVIN-charge_state_charge_rate', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_charge_rate', 'unit_of_measurement': , }) # --- @@ -1206,7 +1206,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_charger_actual_current', - 'unique_id': 'VINVINVIN-charge_state_charger_actual_current', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_charger_actual_current', 'unit_of_measurement': , }) # --- @@ -1273,7 +1273,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_charger_power', - 'unique_id': 'VINVINVIN-charge_state_charger_power', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_charger_power', 'unit_of_measurement': , }) # --- @@ -1340,7 +1340,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_charger_voltage', - 'unique_id': 'VINVINVIN-charge_state_charger_voltage', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_charger_voltage', 'unit_of_measurement': , }) # --- @@ -1414,7 +1414,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_charging_state', - 'unique_id': 'VINVINVIN-charge_state_charging_state', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_charging_state', 'unit_of_measurement': None, }) # --- @@ -1496,7 +1496,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'drive_state_active_route_miles_to_arrival', - 'unique_id': 'VINVINVIN-drive_state_active_route_miles_to_arrival', + 'unique_id': 'LRWXF7EK4KC700000-drive_state_active_route_miles_to_arrival', 'unit_of_measurement': , }) # --- @@ -1566,7 +1566,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_driver_temp_setting', - 'unique_id': 'VINVINVIN-climate_state_driver_temp_setting', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_driver_temp_setting', 'unit_of_measurement': , }) # --- @@ -1639,7 +1639,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_est_battery_range', - 'unique_id': 'VINVINVIN-charge_state_est_battery_range', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_est_battery_range', 'unit_of_measurement': , }) # --- @@ -1704,7 +1704,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_fast_charger_type', - 'unique_id': 'VINVINVIN-charge_state_fast_charger_type', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_fast_charger_type', 'unit_of_measurement': None, }) # --- @@ -1771,7 +1771,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_ideal_battery_range', - 'unique_id': 'VINVINVIN-charge_state_ideal_battery_range', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_ideal_battery_range', 'unit_of_measurement': , }) # --- @@ -1841,7 +1841,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_inside_temp', - 'unique_id': 'VINVINVIN-climate_state_inside_temp', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_inside_temp', 'unit_of_measurement': , }) # --- @@ -1914,7 +1914,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_odometer', - 'unique_id': 'VINVINVIN-vehicle_state_odometer', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_odometer', 'unit_of_measurement': , }) # --- @@ -1984,7 +1984,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_outside_temp', - 'unique_id': 'VINVINVIN-climate_state_outside_temp', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_outside_temp', 'unit_of_measurement': , }) # --- @@ -2054,7 +2054,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_passenger_temp_setting', - 'unique_id': 'VINVINVIN-climate_state_passenger_temp_setting', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_passenger_temp_setting', 'unit_of_measurement': , }) # --- @@ -2121,7 +2121,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'drive_state_power', - 'unique_id': 'VINVINVIN-drive_state_power', + 'unique_id': 'LRWXF7EK4KC700000-drive_state_power', 'unit_of_measurement': , }) # --- @@ -2193,7 +2193,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'drive_state_shift_state', - 'unique_id': 'VINVINVIN-drive_state_shift_state', + 'unique_id': 'LRWXF7EK4KC700000-drive_state_shift_state', 'unit_of_measurement': None, }) # --- @@ -2271,7 +2271,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'drive_state_speed', - 'unique_id': 'VINVINVIN-drive_state_speed', + 'unique_id': 'LRWXF7EK4KC700000-drive_state_speed', 'unit_of_measurement': , }) # --- @@ -2338,7 +2338,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'drive_state_active_route_energy_at_arrival', - 'unique_id': 'VINVINVIN-drive_state_active_route_energy_at_arrival', + 'unique_id': 'LRWXF7EK4KC700000-drive_state_active_route_energy_at_arrival', 'unit_of_measurement': '%', }) # --- @@ -2403,7 +2403,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'drive_state_active_route_minutes_to_arrival', - 'unique_id': 'VINVINVIN-drive_state_active_route_minutes_to_arrival', + 'unique_id': 'LRWXF7EK4KC700000-drive_state_active_route_minutes_to_arrival', 'unit_of_measurement': None, }) # --- @@ -2464,7 +2464,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_minutes_to_full_charge', - 'unique_id': 'VINVINVIN-charge_state_minutes_to_full_charge', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_minutes_to_full_charge', 'unit_of_measurement': None, }) # --- @@ -2533,7 +2533,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_tpms_pressure_fl', - 'unique_id': 'VINVINVIN-vehicle_state_tpms_pressure_fl', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_tpms_pressure_fl', 'unit_of_measurement': , }) # --- @@ -2606,7 +2606,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_tpms_pressure_fr', - 'unique_id': 'VINVINVIN-vehicle_state_tpms_pressure_fr', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_tpms_pressure_fr', 'unit_of_measurement': , }) # --- @@ -2679,7 +2679,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_tpms_pressure_rl', - 'unique_id': 'VINVINVIN-vehicle_state_tpms_pressure_rl', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_tpms_pressure_rl', 'unit_of_measurement': , }) # --- @@ -2752,7 +2752,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_tpms_pressure_rr', - 'unique_id': 'VINVINVIN-vehicle_state_tpms_pressure_rr', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_tpms_pressure_rr', 'unit_of_measurement': , }) # --- @@ -2819,7 +2819,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'drive_state_active_route_traffic_minutes_delay', - 'unique_id': 'VINVINVIN-drive_state_active_route_traffic_minutes_delay', + 'unique_id': 'LRWXF7EK4KC700000-drive_state_active_route_traffic_minutes_delay', 'unit_of_measurement': , }) # --- @@ -2886,7 +2886,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_usable_battery_level', - 'unique_id': 'VINVINVIN-charge_state_usable_battery_level', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_usable_battery_level', 'unit_of_measurement': '%', }) # --- diff --git a/tests/components/teslemetry/snapshots/test_switch.ambr b/tests/components/teslemetry/snapshots/test_switch.ambr index 5c2ba394ef1..f55cbae6a54 100644 --- a/tests/components/teslemetry/snapshots/test_switch.ambr +++ b/tests/components/teslemetry/snapshots/test_switch.ambr @@ -122,7 +122,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_auto_seat_climate_left', - 'unique_id': 'VINVINVIN-climate_state_auto_seat_climate_left', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_auto_seat_climate_left', 'unit_of_measurement': None, }) # --- @@ -169,7 +169,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_auto_seat_climate_right', - 'unique_id': 'VINVINVIN-climate_state_auto_seat_climate_right', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_auto_seat_climate_right', 'unit_of_measurement': None, }) # --- @@ -216,7 +216,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_auto_steering_wheel_heat', - 'unique_id': 'VINVINVIN-climate_state_auto_steering_wheel_heat', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_auto_steering_wheel_heat', 'unit_of_measurement': None, }) # --- @@ -263,7 +263,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'charge_state_user_charge_enable_request', - 'unique_id': 'VINVINVIN-charge_state_user_charge_enable_request', + 'unique_id': 'LRWXF7EK4KC700000-charge_state_user_charge_enable_request', 'unit_of_measurement': None, }) # --- @@ -310,7 +310,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'climate_state_defrost_mode', - 'unique_id': 'VINVINVIN-climate_state_defrost_mode', + 'unique_id': 'LRWXF7EK4KC700000-climate_state_defrost_mode', 'unit_of_measurement': None, }) # --- @@ -357,7 +357,7 @@ 'previous_unique_id': None, 'supported_features': 0, 'translation_key': 'vehicle_state_sentry_mode', - 'unique_id': 'VINVINVIN-vehicle_state_sentry_mode', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_sentry_mode', 'unit_of_measurement': None, }) # --- diff --git a/tests/components/teslemetry/snapshots/test_update.ambr b/tests/components/teslemetry/snapshots/test_update.ambr index ad9c7fea087..19dac161516 100644 --- a/tests/components/teslemetry/snapshots/test_update.ambr +++ b/tests/components/teslemetry/snapshots/test_update.ambr @@ -28,7 +28,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': 'vehicle_state_software_update_status', - 'unique_id': 'VINVINVIN-vehicle_state_software_update_status', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_software_update_status', 'unit_of_measurement': None, }) # --- @@ -84,7 +84,7 @@ 'previous_unique_id': None, 'supported_features': , 'translation_key': 'vehicle_state_software_update_status', - 'unique_id': 'VINVINVIN-vehicle_state_software_update_status', + 'unique_id': 'LRWXF7EK4KC700000-vehicle_state_software_update_status', 'unit_of_measurement': None, }) # --- diff --git a/tests/components/teslemetry/test_init.py b/tests/components/teslemetry/test_init.py index 10670c952d7..31b4202b521 100644 --- a/tests/components/teslemetry/test_init.py +++ b/tests/components/teslemetry/test_init.py @@ -1,4 +1,4 @@ -"""Test the Tessie init.""" +"""Test the Teslemetry init.""" from freezegun.api import FrozenDateTimeFactory import pytest @@ -10,7 +10,10 @@ from tesla_fleet_api.exceptions import ( VehicleOffline, ) -from homeassistant.components.teslemetry.coordinator import VEHICLE_INTERVAL +from homeassistant.components.teslemetry.coordinator import ( + VEHICLE_INTERVAL, + VEHICLE_WAIT, +) from homeassistant.components.teslemetry.models import TeslemetryData from homeassistant.config_entries import ConfigEntryState from homeassistant.const import Platform @@ -18,6 +21,7 @@ from homeassistant.core import HomeAssistant from homeassistant.helpers import device_registry as dr from . import setup_platform +from .const import VEHICLE_DATA_ALT from tests.common import async_fire_time_changed @@ -90,6 +94,63 @@ async def test_vehicle_refresh_error( assert entry.state is state +async def test_vehicle_sleep( + hass: HomeAssistant, mock_vehicle_data, freezer: FrozenDateTimeFactory +) -> None: + """Test coordinator refresh with an error.""" + await setup_platform(hass, [Platform.CLIMATE]) + assert mock_vehicle_data.call_count == 1 + + freezer.tick(VEHICLE_WAIT + VEHICLE_INTERVAL) + async_fire_time_changed(hass) + # Let vehicle sleep, no updates for 15 minutes + await hass.async_block_till_done() + assert mock_vehicle_data.call_count == 2 + + freezer.tick(VEHICLE_INTERVAL) + async_fire_time_changed(hass) + # No polling, call_count should not increase + await hass.async_block_till_done() + assert mock_vehicle_data.call_count == 2 + + freezer.tick(VEHICLE_INTERVAL) + async_fire_time_changed(hass) + # No polling, call_count should not increase + await hass.async_block_till_done() + assert mock_vehicle_data.call_count == 2 + + freezer.tick(VEHICLE_WAIT) + async_fire_time_changed(hass) + # Vehicle didn't sleep, go back to normal + await hass.async_block_till_done() + assert mock_vehicle_data.call_count == 3 + + freezer.tick(VEHICLE_INTERVAL) + async_fire_time_changed(hass) + # Regular polling + await hass.async_block_till_done() + assert mock_vehicle_data.call_count == 4 + + mock_vehicle_data.return_value = VEHICLE_DATA_ALT + freezer.tick(VEHICLE_INTERVAL) + async_fire_time_changed(hass) + # Vehicle active + await hass.async_block_till_done() + assert mock_vehicle_data.call_count == 5 + + freezer.tick(VEHICLE_WAIT) + async_fire_time_changed(hass) + # Dont let sleep when active + await hass.async_block_till_done() + assert mock_vehicle_data.call_count == 6 + + freezer.tick(VEHICLE_WAIT) + async_fire_time_changed(hass) + # Dont let sleep when active + await hass.async_block_till_done() + assert mock_vehicle_data.call_count == 7 + + # Test Energy Live Coordinator @pytest.mark.parametrize(("side_effect", "state"), ERRORS) async def test_energy_live_refresh_error(