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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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