From 41ecb24135193935235510f09fa731fbe852d173 Mon Sep 17 00:00:00 2001 From: Brett Adams Date: Mon, 5 May 2025 14:54:00 +1000 Subject: [PATCH] Set api type more specifically in Teslemetry (#144178) * Set api type more specifically * remove extra spacing * Fix class after rebase --------- Co-authored-by: Allen Porter --- homeassistant/components/teslemetry/button.py | 2 ++ homeassistant/components/teslemetry/climate.py | 2 -- homeassistant/components/teslemetry/cover.py | 6 ++++++ homeassistant/components/teslemetry/entity.py | 3 ++- homeassistant/components/teslemetry/lock.py | 5 +++++ homeassistant/components/teslemetry/media_player.py | 1 - homeassistant/components/teslemetry/number.py | 1 + homeassistant/components/teslemetry/select.py | 1 + homeassistant/components/teslemetry/switch.py | 7 ++++--- 9 files changed, 21 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/teslemetry/button.py b/homeassistant/components/teslemetry/button.py index 6cb9d996b95..2de2868551b 100644 --- a/homeassistant/components/teslemetry/button.py +++ b/homeassistant/components/teslemetry/button.py @@ -7,6 +7,7 @@ from dataclasses import dataclass from typing import Any from tesla_fleet_api.const import Scope +from tesla_fleet_api.teslemetry import Vehicle from homeassistant.components.button import ButtonEntity, ButtonEntityDescription from homeassistant.core import HomeAssistant @@ -76,6 +77,7 @@ async def async_setup_entry( class TeslemetryButtonEntity(TeslemetryVehiclePollingEntity, ButtonEntity): """Base class for Teslemetry buttons.""" + api: Vehicle entity_description: TeslemetryButtonEntityDescription def __init__( diff --git a/homeassistant/components/teslemetry/climate.py b/homeassistant/components/teslemetry/climate.py index 0a1c23adcb0..1bc52b23026 100644 --- a/homeassistant/components/teslemetry/climate.py +++ b/homeassistant/components/teslemetry/climate.py @@ -91,7 +91,6 @@ class TeslemetryClimateEntity(TeslemetryRootEntity, ClimateEntity): """Vehicle Climate Control.""" api: Vehicle - _attr_precision = PRECISION_HALVES _attr_temperature_unit = UnitOfTemperature.CELSIUS _attr_hvac_modes = [HVACMode.HEAT_COOL, HVACMode.OFF] @@ -372,7 +371,6 @@ class TeslemetryCabinOverheatProtectionEntity(TeslemetryRootEntity, ClimateEntit """Vehicle Cabin Overheat Protection.""" api: Vehicle - _attr_precision = PRECISION_WHOLE _attr_target_temperature_step = 5 _attr_min_temp = 30 diff --git a/homeassistant/components/teslemetry/cover.py b/homeassistant/components/teslemetry/cover.py index de036edc32a..be85a877c86 100644 --- a/homeassistant/components/teslemetry/cover.py +++ b/homeassistant/components/teslemetry/cover.py @@ -6,6 +6,7 @@ from itertools import chain from typing import Any from tesla_fleet_api.const import Scope, SunRoofCommand, Trunk, WindowCommand +from tesla_fleet_api.teslemetry import Vehicle from teslemetry_stream import Signal from teslemetry_stream.const import WindowState @@ -103,6 +104,7 @@ class CoverRestoreEntity(RestoreEntity, CoverEntity): class TeslemetryWindowEntity(TeslemetryRootEntity, CoverEntity): """Base class for window cover entities.""" + api: Vehicle _attr_device_class = CoverDeviceClass.WINDOW _attr_supported_features = CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE @@ -224,6 +226,7 @@ class TeslemetryChargePortEntity( ): """Base class for for charge port cover entities.""" + api: Vehicle _attr_device_class = CoverDeviceClass.DOOR _attr_supported_features = CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE @@ -304,6 +307,7 @@ class TeslemetryStreamingChargePortEntity( class TeslemetryFrontTrunkEntity(TeslemetryRootEntity, CoverEntity): """Base class for the front trunk cover entities.""" + api: Vehicle _attr_device_class = CoverDeviceClass.DOOR _attr_supported_features = CoverEntityFeature.OPEN @@ -365,6 +369,7 @@ class TeslemetryStreamingFrontTrunkEntity( class TeslemetryRearTrunkEntity(TeslemetryRootEntity, CoverEntity): """Cover entity for the rear trunk.""" + api: Vehicle _attr_device_class = CoverDeviceClass.DOOR _attr_supported_features = CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE @@ -433,6 +438,7 @@ class TeslemetryStreamingRearTrunkEntity( class TeslemetrySunroofEntity(TeslemetryVehiclePollingEntity, CoverEntity): """Cover entity for the sunroof.""" + api: Vehicle _attr_device_class = CoverDeviceClass.WINDOW _attr_supported_features = ( CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE | CoverEntityFeature.STOP diff --git a/homeassistant/components/teslemetry/entity.py b/homeassistant/components/teslemetry/entity.py index 4930129642f..170d4e3a3ae 100644 --- a/homeassistant/components/teslemetry/entity.py +++ b/homeassistant/components/teslemetry/entity.py @@ -26,7 +26,6 @@ class TeslemetryRootEntity(Entity): _attr_has_entity_name = True scoped: bool - api: Vehicle | EnergySite def raise_for_scope(self, scope: Scope): """Raise an error if a scope is not available.""" @@ -248,6 +247,8 @@ class TeslemetryWallConnectorEntity(TeslemetryPollingEntity): class TeslemetryVehicleStreamEntity(TeslemetryRootEntity): """Parent class for Teslemetry Vehicle Stream entities.""" + api: Vehicle + def __init__(self, data: TeslemetryVehicleData, key: str) -> None: """Initialize common aspects of a Teslemetry entity.""" self.vehicle = data diff --git a/homeassistant/components/teslemetry/lock.py b/homeassistant/components/teslemetry/lock.py index 75cf72c9c88..fda52357f5c 100644 --- a/homeassistant/components/teslemetry/lock.py +++ b/homeassistant/components/teslemetry/lock.py @@ -6,6 +6,7 @@ from itertools import chain from typing import Any from tesla_fleet_api.const import Scope +from tesla_fleet_api.teslemetry import Vehicle from homeassistant.components.lock import LockEntity from homeassistant.core import HomeAssistant @@ -64,6 +65,8 @@ async def async_setup_entry( class TeslemetryVehicleLockEntity(TeslemetryRootEntity, LockEntity): """Base vehicle lock entity for Teslemetry.""" + api: Vehicle + async def async_lock(self, **kwargs: Any) -> None: """Lock the doors.""" self.raise_for_scope(Scope.VEHICLE_CMDS) @@ -135,6 +138,8 @@ class TeslemetryStreamingVehicleLockEntity( class TeslemetryCableLockEntity(TeslemetryRootEntity, LockEntity): """Base cable Lock entity for Teslemetry.""" + api: Vehicle + async def async_lock(self, **kwargs: Any) -> None: """Charge cable Lock cannot be manually locked.""" raise ServiceValidationError( diff --git a/homeassistant/components/teslemetry/media_player.py b/homeassistant/components/teslemetry/media_player.py index 11615d94614..bf1fffed583 100644 --- a/homeassistant/components/teslemetry/media_player.py +++ b/homeassistant/components/teslemetry/media_player.py @@ -63,7 +63,6 @@ class TeslemetryMediaEntity(TeslemetryRootEntity, MediaPlayerEntity): """Base vehicle media player class.""" api: Vehicle - _attr_device_class = MediaPlayerDeviceClass.SPEAKER _attr_volume_step = VOLUME_STEP diff --git a/homeassistant/components/teslemetry/number.py b/homeassistant/components/teslemetry/number.py index 466fc9f5ee6..bb9f5b588a0 100644 --- a/homeassistant/components/teslemetry/number.py +++ b/homeassistant/components/teslemetry/number.py @@ -172,6 +172,7 @@ async def async_setup_entry( class TeslemetryVehicleNumberEntity(TeslemetryRootEntity, NumberEntity): """Vehicle number entity base class.""" + api: Vehicle entity_description: TeslemetryNumberVehicleEntityDescription async def async_set_native_value(self, value: float) -> None: diff --git a/homeassistant/components/teslemetry/select.py b/homeassistant/components/teslemetry/select.py index be90636497e..c24c47feb2e 100644 --- a/homeassistant/components/teslemetry/select.py +++ b/homeassistant/components/teslemetry/select.py @@ -208,6 +208,7 @@ async def async_setup_entry( class TeslemetrySelectEntity(TeslemetryRootEntity, SelectEntity): """Parent vehicle select entity class.""" + api: Vehicle entity_description: TeslemetrySelectEntityDescription _climate: bool = False diff --git a/homeassistant/components/teslemetry/switch.py b/homeassistant/components/teslemetry/switch.py index f1082122e5c..f607429be46 100644 --- a/homeassistant/components/teslemetry/switch.py +++ b/homeassistant/components/teslemetry/switch.py @@ -8,7 +8,7 @@ from itertools import chain from typing import Any from tesla_fleet_api.const import AutoSeat, Scope -from tesla_fleet_api.teslemetry.vehicles import TeslemetryVehicle +from tesla_fleet_api.teslemetry import Vehicle from teslemetry_stream import TeslemetryStreamVehicle from homeassistant.components.switch import ( @@ -38,8 +38,8 @@ PARALLEL_UPDATES = 0 class TeslemetrySwitchEntityDescription(SwitchEntityDescription): """Describes Teslemetry Switch entity.""" - on_func: Callable[[TeslemetryVehicle], Awaitable[dict[str, Any]]] - off_func: Callable[[TeslemetryVehicle], Awaitable[dict[str, Any]]] + on_func: Callable[[Vehicle], Awaitable[dict[str, Any]]] + off_func: Callable[[Vehicle], Awaitable[dict[str, Any]]] scopes: list[Scope] value_func: Callable[[StateType], bool] = bool streaming_listener: Callable[ @@ -176,6 +176,7 @@ async def async_setup_entry( class TeslemetryVehicleSwitchEntity(TeslemetryRootEntity, SwitchEntity): """Base class for all Teslemetry switch entities.""" + api: Vehicle _attr_device_class = SwitchDeviceClass.SWITCH entity_description: TeslemetrySwitchEntityDescription