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 <allen@thebends.org>
This commit is contained in:
Brett Adams 2025-05-05 14:54:00 +10:00 committed by GitHub
parent e3b3c32751
commit 41ecb24135
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 21 additions and 7 deletions

View File

@ -7,6 +7,7 @@ from dataclasses import dataclass
from typing import Any from typing import Any
from tesla_fleet_api.const import Scope from tesla_fleet_api.const import Scope
from tesla_fleet_api.teslemetry import Vehicle
from homeassistant.components.button import ButtonEntity, ButtonEntityDescription from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -76,6 +77,7 @@ async def async_setup_entry(
class TeslemetryButtonEntity(TeslemetryVehiclePollingEntity, ButtonEntity): class TeslemetryButtonEntity(TeslemetryVehiclePollingEntity, ButtonEntity):
"""Base class for Teslemetry buttons.""" """Base class for Teslemetry buttons."""
api: Vehicle
entity_description: TeslemetryButtonEntityDescription entity_description: TeslemetryButtonEntityDescription
def __init__( def __init__(

View File

@ -91,7 +91,6 @@ class TeslemetryClimateEntity(TeslemetryRootEntity, ClimateEntity):
"""Vehicle Climate Control.""" """Vehicle Climate Control."""
api: Vehicle api: Vehicle
_attr_precision = PRECISION_HALVES _attr_precision = PRECISION_HALVES
_attr_temperature_unit = UnitOfTemperature.CELSIUS _attr_temperature_unit = UnitOfTemperature.CELSIUS
_attr_hvac_modes = [HVACMode.HEAT_COOL, HVACMode.OFF] _attr_hvac_modes = [HVACMode.HEAT_COOL, HVACMode.OFF]
@ -372,7 +371,6 @@ class TeslemetryCabinOverheatProtectionEntity(TeslemetryRootEntity, ClimateEntit
"""Vehicle Cabin Overheat Protection.""" """Vehicle Cabin Overheat Protection."""
api: Vehicle api: Vehicle
_attr_precision = PRECISION_WHOLE _attr_precision = PRECISION_WHOLE
_attr_target_temperature_step = 5 _attr_target_temperature_step = 5
_attr_min_temp = 30 _attr_min_temp = 30

View File

@ -6,6 +6,7 @@ from itertools import chain
from typing import Any from typing import Any
from tesla_fleet_api.const import Scope, SunRoofCommand, Trunk, WindowCommand 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 import Signal
from teslemetry_stream.const import WindowState from teslemetry_stream.const import WindowState
@ -103,6 +104,7 @@ class CoverRestoreEntity(RestoreEntity, CoverEntity):
class TeslemetryWindowEntity(TeslemetryRootEntity, CoverEntity): class TeslemetryWindowEntity(TeslemetryRootEntity, CoverEntity):
"""Base class for window cover entities.""" """Base class for window cover entities."""
api: Vehicle
_attr_device_class = CoverDeviceClass.WINDOW _attr_device_class = CoverDeviceClass.WINDOW
_attr_supported_features = CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE _attr_supported_features = CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE
@ -224,6 +226,7 @@ class TeslemetryChargePortEntity(
): ):
"""Base class for for charge port cover entities.""" """Base class for for charge port cover entities."""
api: Vehicle
_attr_device_class = CoverDeviceClass.DOOR _attr_device_class = CoverDeviceClass.DOOR
_attr_supported_features = CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE _attr_supported_features = CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE
@ -304,6 +307,7 @@ class TeslemetryStreamingChargePortEntity(
class TeslemetryFrontTrunkEntity(TeslemetryRootEntity, CoverEntity): class TeslemetryFrontTrunkEntity(TeslemetryRootEntity, CoverEntity):
"""Base class for the front trunk cover entities.""" """Base class for the front trunk cover entities."""
api: Vehicle
_attr_device_class = CoverDeviceClass.DOOR _attr_device_class = CoverDeviceClass.DOOR
_attr_supported_features = CoverEntityFeature.OPEN _attr_supported_features = CoverEntityFeature.OPEN
@ -365,6 +369,7 @@ class TeslemetryStreamingFrontTrunkEntity(
class TeslemetryRearTrunkEntity(TeslemetryRootEntity, CoverEntity): class TeslemetryRearTrunkEntity(TeslemetryRootEntity, CoverEntity):
"""Cover entity for the rear trunk.""" """Cover entity for the rear trunk."""
api: Vehicle
_attr_device_class = CoverDeviceClass.DOOR _attr_device_class = CoverDeviceClass.DOOR
_attr_supported_features = CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE _attr_supported_features = CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE
@ -433,6 +438,7 @@ class TeslemetryStreamingRearTrunkEntity(
class TeslemetrySunroofEntity(TeslemetryVehiclePollingEntity, CoverEntity): class TeslemetrySunroofEntity(TeslemetryVehiclePollingEntity, CoverEntity):
"""Cover entity for the sunroof.""" """Cover entity for the sunroof."""
api: Vehicle
_attr_device_class = CoverDeviceClass.WINDOW _attr_device_class = CoverDeviceClass.WINDOW
_attr_supported_features = ( _attr_supported_features = (
CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE | CoverEntityFeature.STOP CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE | CoverEntityFeature.STOP

View File

@ -26,7 +26,6 @@ class TeslemetryRootEntity(Entity):
_attr_has_entity_name = True _attr_has_entity_name = True
scoped: bool scoped: bool
api: Vehicle | EnergySite
def raise_for_scope(self, scope: Scope): def raise_for_scope(self, scope: Scope):
"""Raise an error if a scope is not available.""" """Raise an error if a scope is not available."""
@ -248,6 +247,8 @@ class TeslemetryWallConnectorEntity(TeslemetryPollingEntity):
class TeslemetryVehicleStreamEntity(TeslemetryRootEntity): class TeslemetryVehicleStreamEntity(TeslemetryRootEntity):
"""Parent class for Teslemetry Vehicle Stream entities.""" """Parent class for Teslemetry Vehicle Stream entities."""
api: Vehicle
def __init__(self, data: TeslemetryVehicleData, key: str) -> None: def __init__(self, data: TeslemetryVehicleData, key: str) -> None:
"""Initialize common aspects of a Teslemetry entity.""" """Initialize common aspects of a Teslemetry entity."""
self.vehicle = data self.vehicle = data

View File

@ -6,6 +6,7 @@ from itertools import chain
from typing import Any from typing import Any
from tesla_fleet_api.const import Scope from tesla_fleet_api.const import Scope
from tesla_fleet_api.teslemetry import Vehicle
from homeassistant.components.lock import LockEntity from homeassistant.components.lock import LockEntity
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -64,6 +65,8 @@ async def async_setup_entry(
class TeslemetryVehicleLockEntity(TeslemetryRootEntity, LockEntity): class TeslemetryVehicleLockEntity(TeslemetryRootEntity, LockEntity):
"""Base vehicle lock entity for Teslemetry.""" """Base vehicle lock entity for Teslemetry."""
api: Vehicle
async def async_lock(self, **kwargs: Any) -> None: async def async_lock(self, **kwargs: Any) -> None:
"""Lock the doors.""" """Lock the doors."""
self.raise_for_scope(Scope.VEHICLE_CMDS) self.raise_for_scope(Scope.VEHICLE_CMDS)
@ -135,6 +138,8 @@ class TeslemetryStreamingVehicleLockEntity(
class TeslemetryCableLockEntity(TeslemetryRootEntity, LockEntity): class TeslemetryCableLockEntity(TeslemetryRootEntity, LockEntity):
"""Base cable Lock entity for Teslemetry.""" """Base cable Lock entity for Teslemetry."""
api: Vehicle
async def async_lock(self, **kwargs: Any) -> None: async def async_lock(self, **kwargs: Any) -> None:
"""Charge cable Lock cannot be manually locked.""" """Charge cable Lock cannot be manually locked."""
raise ServiceValidationError( raise ServiceValidationError(

View File

@ -63,7 +63,6 @@ class TeslemetryMediaEntity(TeslemetryRootEntity, MediaPlayerEntity):
"""Base vehicle media player class.""" """Base vehicle media player class."""
api: Vehicle api: Vehicle
_attr_device_class = MediaPlayerDeviceClass.SPEAKER _attr_device_class = MediaPlayerDeviceClass.SPEAKER
_attr_volume_step = VOLUME_STEP _attr_volume_step = VOLUME_STEP

View File

@ -172,6 +172,7 @@ async def async_setup_entry(
class TeslemetryVehicleNumberEntity(TeslemetryRootEntity, NumberEntity): class TeslemetryVehicleNumberEntity(TeslemetryRootEntity, NumberEntity):
"""Vehicle number entity base class.""" """Vehicle number entity base class."""
api: Vehicle
entity_description: TeslemetryNumberVehicleEntityDescription entity_description: TeslemetryNumberVehicleEntityDescription
async def async_set_native_value(self, value: float) -> None: async def async_set_native_value(self, value: float) -> None:

View File

@ -208,6 +208,7 @@ async def async_setup_entry(
class TeslemetrySelectEntity(TeslemetryRootEntity, SelectEntity): class TeslemetrySelectEntity(TeslemetryRootEntity, SelectEntity):
"""Parent vehicle select entity class.""" """Parent vehicle select entity class."""
api: Vehicle
entity_description: TeslemetrySelectEntityDescription entity_description: TeslemetrySelectEntityDescription
_climate: bool = False _climate: bool = False

View File

@ -8,7 +8,7 @@ from itertools import chain
from typing import Any from typing import Any
from tesla_fleet_api.const import AutoSeat, Scope 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 teslemetry_stream import TeslemetryStreamVehicle
from homeassistant.components.switch import ( from homeassistant.components.switch import (
@ -38,8 +38,8 @@ PARALLEL_UPDATES = 0
class TeslemetrySwitchEntityDescription(SwitchEntityDescription): class TeslemetrySwitchEntityDescription(SwitchEntityDescription):
"""Describes Teslemetry Switch entity.""" """Describes Teslemetry Switch entity."""
on_func: Callable[[TeslemetryVehicle], Awaitable[dict[str, Any]]] on_func: Callable[[Vehicle], Awaitable[dict[str, Any]]]
off_func: Callable[[TeslemetryVehicle], Awaitable[dict[str, Any]]] off_func: Callable[[Vehicle], Awaitable[dict[str, Any]]]
scopes: list[Scope] scopes: list[Scope]
value_func: Callable[[StateType], bool] = bool value_func: Callable[[StateType], bool] = bool
streaming_listener: Callable[ streaming_listener: Callable[
@ -176,6 +176,7 @@ async def async_setup_entry(
class TeslemetryVehicleSwitchEntity(TeslemetryRootEntity, SwitchEntity): class TeslemetryVehicleSwitchEntity(TeslemetryRootEntity, SwitchEntity):
"""Base class for all Teslemetry switch entities.""" """Base class for all Teslemetry switch entities."""
api: Vehicle
_attr_device_class = SwitchDeviceClass.SWITCH _attr_device_class = SwitchDeviceClass.SWITCH
entity_description: TeslemetrySwitchEntityDescription entity_description: TeslemetrySwitchEntityDescription