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 <goran.johansson@shiftit.se>
This commit is contained in:
Brett Adams 2024-05-27 20:37:33 +10:00 committed by GitHub
parent 2a8fc7f310
commit 46158f5c14
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
21 changed files with 203 additions and 119 deletions

View File

@ -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

View File

@ -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"]
}

View File

@ -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

View File

@ -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

View File

@ -4,7 +4,7 @@
"id": 1234,
"user_id": 1234,
"vehicle_id": 1234,
"vin": "VINVINVIN",
"vin": "LRWXF7EK4KC700000",
"color": null,
"access_type": "OWNER",
"display_name": "Test",

View File

@ -3,7 +3,7 @@
"id": 1234,
"user_id": 1234,
"vehicle_id": 1234,
"vin": "VINVINVIN",
"vin": "LRWXF7EK4KC700000",
"color": null,
"access_type": "OWNER",
"granular_access": {

View File

@ -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,

View File

@ -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': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'off',
'state': 'on',
})
# ---

View File

@ -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,
})
# ---

View File

@ -41,7 +41,7 @@
'previous_unique_id': None,
'supported_features': <ClimateEntityFeature: 401>,
'translation_key': <TeslemetryClimateSide.DRIVER: 'driver_temp'>,
'unique_id': 'VINVINVIN-driver_temp',
'unique_id': 'LRWXF7EK4KC700000-driver_temp',
'unit_of_measurement': None,
})
# ---
@ -116,7 +116,7 @@
'previous_unique_id': None,
'supported_features': <ClimateEntityFeature: 401>,
'translation_key': <TeslemetryClimateSide.DRIVER: 'driver_temp'>,
'unique_id': 'VINVINVIN-driver_temp',
'unique_id': 'LRWXF7EK4KC700000-driver_temp',
'unit_of_measurement': None,
})
# ---
@ -191,7 +191,7 @@
'previous_unique_id': None,
'supported_features': <ClimateEntityFeature: 401>,
'translation_key': <TeslemetryClimateSide.DRIVER: 'driver_temp'>,
'unique_id': 'VINVINVIN-driver_temp',
'unique_id': 'LRWXF7EK4KC700000-driver_temp',
'unit_of_measurement': None,
})
# ---

View File

@ -28,7 +28,7 @@
'previous_unique_id': None,
'supported_features': <CoverEntityFeature: 3>,
'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': <CoverEntityFeature: 1>,
'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': <CoverEntityFeature: 3>,
'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': <CoverEntityFeature: 3>,
'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': <CoverEntityFeature: 3>,
'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': <CoverEntityFeature: 1>,
'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': <CoverEntityFeature: 3>,
'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': <CoverEntityFeature: 3>,
'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,
})
# ---

View File

@ -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,
})
# ---

View File

@ -29,7 +29,7 @@
'via_device_id': None,
})
# ---
# name: test_devices[{('teslemetry', 'VINVINVIN')}]
# name: test_devices[{('teslemetry', 'LRWXF7EK4KC700000')}]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
@ -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,

View File

@ -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,
})
# ---

View File

@ -29,7 +29,7 @@
'previous_unique_id': None,
'supported_features': <MediaPlayerEntityFeature: 16437>,
'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,
})
# ---

View File

@ -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': <UnitOfElectricCurrent.AMPERE: 'A'>,
})
# ---
@ -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': '%',
})
# ---

View File

@ -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,
})
# ---

View File

@ -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': <UnitOfLength.KILOMETERS: 'km'>,
})
# ---
@ -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': <UnitOfEnergy.KILO_WATT_HOUR: 'kWh'>,
})
# ---
@ -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': <UnitOfSpeed.KILOMETERS_PER_HOUR: 'km/h'>,
})
# ---
@ -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': <UnitOfElectricCurrent.AMPERE: 'A'>,
})
# ---
@ -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': <UnitOfPower.KILO_WATT: 'kW'>,
})
# ---
@ -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': <UnitOfElectricPotential.VOLT: 'V'>,
})
# ---
@ -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': <UnitOfLength.KILOMETERS: 'km'>,
})
# ---
@ -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': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
@ -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': <UnitOfLength.KILOMETERS: 'km'>,
})
# ---
@ -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': <UnitOfLength.KILOMETERS: 'km'>,
})
# ---
@ -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': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
@ -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': <UnitOfLength.KILOMETERS: 'km'>,
})
# ---
@ -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': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
@ -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': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
@ -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': <UnitOfPower.KILO_WATT: 'kW'>,
})
# ---
@ -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': <UnitOfSpeed.KILOMETERS_PER_HOUR: 'km/h'>,
})
# ---
@ -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': <UnitOfPressure.PSI: 'psi'>,
})
# ---
@ -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': <UnitOfPressure.PSI: 'psi'>,
})
# ---
@ -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': <UnitOfPressure.PSI: 'psi'>,
})
# ---
@ -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': <UnitOfPressure.PSI: 'psi'>,
})
# ---
@ -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': <UnitOfTime.MINUTES: 'min'>,
})
# ---
@ -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': '%',
})
# ---

View File

@ -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,
})
# ---

View File

@ -28,7 +28,7 @@
'previous_unique_id': None,
'supported_features': <UpdateEntityFeature: 5>,
'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': <UpdateEntityFeature: 4>,
'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,
})
# ---

View File

@ -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(