Home Assistant Unofficial Reference 2024.12.1
entity.py
Go to the documentation of this file.
1 """Tesla Fleet parent entity class."""
2 
3 from abc import abstractmethod
4 from typing import Any
5 
6 from tesla_fleet_api import EnergySpecific, VehicleSpecific
7 from tesla_fleet_api.const import Scope
8 
9 from homeassistant.exceptions import ServiceValidationError
10 from homeassistant.helpers.device_registry import DeviceInfo
11 from homeassistant.helpers.update_coordinator import CoordinatorEntity
12 
13 from .const import DOMAIN
14 from .coordinator import (
15  TeslaFleetEnergySiteInfoCoordinator,
16  TeslaFleetEnergySiteLiveCoordinator,
17  TeslaFleetVehicleDataCoordinator,
18 )
19 from .helpers import wake_up_vehicle
20 from .models import TeslaFleetEnergyData, TeslaFleetVehicleData
21 
22 
24  CoordinatorEntity[
25  TeslaFleetVehicleDataCoordinator
26  | TeslaFleetEnergySiteLiveCoordinator
27  | TeslaFleetEnergySiteInfoCoordinator
28  ]
29 ):
30  """Parent class for all TeslaFleet entities."""
31 
32  _attr_has_entity_name = True
33  read_only: bool
34  scoped: bool
35 
36  def __init__(
37  self,
38  coordinator: TeslaFleetVehicleDataCoordinator
39  | TeslaFleetEnergySiteLiveCoordinator
40  | TeslaFleetEnergySiteInfoCoordinator,
41  api: VehicleSpecific | EnergySpecific,
42  key: str,
43  ) -> None:
44  """Initialize common aspects of a TeslaFleet entity."""
45  super().__init__(coordinator)
46  self.apiapiapiapiapi = api
47  self.keykey = key
48  self._attr_translation_key_attr_translation_key = self.keykey
49  self._async_update_attrs_async_update_attrs()
50 
51  @property
52  def available(self) -> bool:
53  """Return if sensor is available."""
54  return self.coordinator.last_update_success and self._attr_available
55 
56  @property
57  def _value(self) -> Any | None:
58  """Return a specific value from coordinator data."""
59  return self.coordinator.data.get(self.keykey)
60 
61  def get(self, key: str, default: Any | None = None) -> Any | None:
62  """Return a specific value from coordinator data."""
63  return self.coordinator.data.get(key, default)
64 
65  def get_number(self, key: str, default: float) -> float:
66  """Return a specific number from coordinator data."""
67  if isinstance(value := self.coordinator.data.get(key), (int, float)):
68  return value
69  return default
70 
71  @property
72  def is_none(self) -> bool:
73  """Return if the value is a literal None."""
74  return self.getget(self.keykey, False) is None
75 
76  @property
77  def has(self) -> bool:
78  """Return True if a specific value is in coordinator data."""
79  return self.keykey in self.coordinator.data
80 
81  def _handle_coordinator_update(self) -> None:
82  """Handle updated data from the coordinator."""
83  self._async_update_attrs_async_update_attrs()
84  self.async_write_ha_state()
85 
86  @abstractmethod
87  def _async_update_attrs(self) -> None:
88  """Update the attributes of the entity."""
89 
90  def raise_for_read_only(self, scope: Scope) -> None:
91  """Raise an error if a scope is not available."""
92  if not self.scoped:
93  raise ServiceValidationError(
94  translation_domain=DOMAIN,
95  translation_key=f"missing_scope_{scope.name.lower()}",
96  )
97 
98 
100  """Parent class for TeslaFleet Vehicle entities."""
101 
102  _last_update: int = 0
103 
104  def __init__(
105  self,
106  data: TeslaFleetVehicleData,
107  key: str,
108  ) -> None:
109  """Initialize common aspects of a Tesla Fleet entity."""
110 
111  self._attr_unique_id_attr_unique_id = f"{data.vin}-{key}"
112  self.vehiclevehicle = data
113 
114  self._attr_device_info_attr_device_info = data.device
115  super().__init__(data.coordinator, data.api, key)
116 
117  @property
118  def _value(self) -> Any | None:
119  """Return a specific value from coordinator data."""
120  return self.coordinator.data.get(self.keykey)
121 
122  async def wake_up_if_asleep(self) -> None:
123  """Wake up the vehicle if its asleep."""
124  await wake_up_vehicle(self.vehiclevehicle)
125 
126 
128  """Parent class for TeslaFleet Energy Site Live entities."""
129 
130  def __init__(
131  self,
132  data: TeslaFleetEnergyData,
133  key: str,
134  ) -> None:
135  """Initialize common aspects of a Tesla Fleet Energy Site Live entity."""
136  self._attr_unique_id_attr_unique_id = f"{data.id}-{key}"
137  self._attr_device_info_attr_device_info = data.device
138 
139  super().__init__(data.live_coordinator, data.api, key)
140 
141 
143  """Parent class for TeslaFleet Energy Site Info entities."""
144 
145  def __init__(
146  self,
147  data: TeslaFleetEnergyData,
148  key: str,
149  ) -> None:
150  """Initialize common aspects of a Tesla Fleet Energy Site Info entity."""
151  self._attr_unique_id_attr_unique_id = f"{data.id}-{key}"
152  self._attr_device_info_attr_device_info = data.device
153 
154  super().__init__(data.info_coordinator, data.api, key)
155 
156 
158  TeslaFleetEntity, CoordinatorEntity[TeslaFleetEnergySiteLiveCoordinator]
159 ):
160  """Parent class for Tesla Fleet Wall Connector entities."""
161 
162  _attr_has_entity_name = True
163 
164  def __init__(
165  self,
166  data: TeslaFleetEnergyData,
167  din: str,
168  key: str,
169  ) -> None:
170  """Initialize common aspects of a Tesla Fleet entity."""
171  self.dindin = din
172  self._attr_unique_id_attr_unique_id = f"{data.id}-{din}-{key}"
173 
174  # Find the model from the info coordinator
175  model: str | None = None
176  for wc in data.info_coordinator.data.get("components_wall_connectors", []):
177  if wc["din"] == din:
178  model = wc.get("part_name")
179  break
180 
181  self._attr_device_info_attr_device_info = DeviceInfo(
182  identifiers={(DOMAIN, din)},
183  manufacturer="Tesla",
184  name="Wall Connector",
185  via_device=(DOMAIN, str(data.id)),
186  serial_number=din.split("-")[-1],
187  model=model,
188  )
189 
190  super().__init__(data.live_coordinator, data.api, key)
191 
192  @property
193  def _value(self) -> int:
194  """Return a specific wall connector value from coordinator data."""
195  return (
196  self.coordinator.data.get("wall_connectors", {})
197  .get(self.dindin, {})
198  .get(self.keykey)
199  )
None __init__(self, TeslaFleetEnergyData data, str key)
Definition: entity.py:149
None __init__(self, TeslaFleetEnergyData data, str key)
Definition: entity.py:134
None __init__(self, TeslaFleetVehicleDataCoordinator|TeslaFleetEnergySiteLiveCoordinator|TeslaFleetEnergySiteInfoCoordinator coordinator, VehicleSpecific|EnergySpecific api, str key)
Definition: entity.py:43
Any|None get(self, str key, Any|None default=None)
Definition: entity.py:61
float get_number(self, str key, float default)
Definition: entity.py:65
None __init__(self, TeslaFleetVehicleData data, str key)
Definition: entity.py:108
None __init__(self, TeslaFleetEnergyData data, str din, str key)
Definition: entity.py:169
None wake_up_vehicle(TeslaFleetVehicleData vehicle)
Definition: helpers.py:15