Home Assistant Unofficial Reference 2024.12.1
cover.py
Go to the documentation of this file.
1 """Cover platform for Teslemetry integration."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from tesla_fleet_api.const import Scope, SunRoofCommand, Trunk, WindowCommand
8 
10  CoverDeviceClass,
11  CoverEntity,
12  CoverEntityFeature,
13 )
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 
17 from . import TeslemetryConfigEntry
18 from .entity import TeslemetryVehicleEntity
19 from .helpers import handle_vehicle_command
20 from .models import TeslemetryVehicleData
21 
22 OPEN = 1
23 CLOSED = 0
24 
25 PARALLEL_UPDATES = 0
26 
27 
29  hass: HomeAssistant,
30  entry: TeslemetryConfigEntry,
31  async_add_entities: AddEntitiesCallback,
32 ) -> None:
33  """Set up the Teslemetry cover platform from a config entry."""
34 
36  klass(vehicle, entry.runtime_data.scopes)
37  for (klass) in (
38  TeslemetryWindowEntity,
39  TeslemetryChargePortEntity,
40  TeslemetryFrontTrunkEntity,
41  TeslemetryRearTrunkEntity,
42  TeslemetrySunroofEntity,
43  )
44  for vehicle in entry.runtime_data.vehicles
45  )
46 
47 
49  """Cover entity for the windows."""
50 
51  _attr_device_class = CoverDeviceClass.WINDOW
52 
53  def __init__(self, data: TeslemetryVehicleData, scopes: list[Scope]) -> None:
54  """Initialize the cover."""
55  super().__init__(data, "windows")
56  self.scopedscoped = Scope.VEHICLE_CMDS in scopes
57  self._attr_supported_features_attr_supported_features = (
58  CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE
59  )
60  if not self.scopedscoped:
61  self._attr_supported_features_attr_supported_features = CoverEntityFeature(0)
62 
63  def _async_update_attrs(self) -> None:
64  """Update the entity attributes."""
65  fd = self.getget("vehicle_state_fd_window")
66  fp = self.getget("vehicle_state_fp_window")
67  rd = self.getget("vehicle_state_rd_window")
68  rp = self.getget("vehicle_state_rp_window")
69 
70  # Any open set to open
71  if OPEN in (fd, fp, rd, rp):
72  self._attr_is_closed_attr_is_closed = False
73  # All closed set to closed
74  elif CLOSED == fd == fp == rd == rp:
75  self._attr_is_closed_attr_is_closed = True
76  # Otherwise, set to unknown
77  else:
78  self._attr_is_closed_attr_is_closed = None
79 
80  async def async_open_cover(self, **kwargs: Any) -> None:
81  """Vent windows."""
82  self.raise_for_scoperaise_for_scope(Scope.VEHICLE_CMDS)
83  await self.wake_up_if_asleepwake_up_if_asleep()
85  self.apiapiapiapiapiapi.window_control(command=WindowCommand.VENT)
86  )
87  self._attr_is_closed_attr_is_closed = False
88  self.async_write_ha_stateasync_write_ha_state()
89 
90  async def async_close_cover(self, **kwargs: Any) -> None:
91  """Close windows."""
92  self.raise_for_scoperaise_for_scope(Scope.VEHICLE_CMDS)
93  await self.wake_up_if_asleepwake_up_if_asleep()
95  self.apiapiapiapiapiapi.window_control(command=WindowCommand.CLOSE)
96  )
97  self._attr_is_closed_attr_is_closed = True
98  self.async_write_ha_stateasync_write_ha_state()
99 
100 
102  """Cover entity for the charge port."""
103 
104  _attr_device_class = CoverDeviceClass.DOOR
105 
106  def __init__(self, vehicle: TeslemetryVehicleData, scopes: list[Scope]) -> None:
107  """Initialize the cover."""
108  super().__init__(vehicle, "charge_state_charge_port_door_open")
109  self.scopedscoped = any(
110  scope in scopes
111  for scope in (Scope.VEHICLE_CMDS, Scope.VEHICLE_CHARGING_CMDS)
112  )
113  self._attr_supported_features_attr_supported_features = (
114  CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE
115  )
116  if not self.scopedscoped:
117  self._attr_supported_features_attr_supported_features = CoverEntityFeature(0)
118 
119  def _async_update_attrs(self) -> None:
120  """Update the entity attributes."""
121  self._attr_is_closed_attr_is_closed = not self._value_value_value
122 
123  async def async_open_cover(self, **kwargs: Any) -> None:
124  """Open charge port."""
125  self.raise_for_scoperaise_for_scope(Scope.VEHICLE_CHARGING_CMDS)
126  await self.wake_up_if_asleepwake_up_if_asleep()
127  await handle_vehicle_command(self.apiapiapiapiapiapi.charge_port_door_open())
128  self._attr_is_closed_attr_is_closed = False
129  self.async_write_ha_stateasync_write_ha_state()
130 
131  async def async_close_cover(self, **kwargs: Any) -> None:
132  """Close charge port."""
133  self.raise_for_scoperaise_for_scope(Scope.VEHICLE_CHARGING_CMDS)
134  await self.wake_up_if_asleepwake_up_if_asleep()
135  await handle_vehicle_command(self.apiapiapiapiapiapi.charge_port_door_close())
136  self._attr_is_closed_attr_is_closed = True
137  self.async_write_ha_stateasync_write_ha_state()
138 
139 
141  """Cover entity for the front trunk."""
142 
143  _attr_device_class = CoverDeviceClass.DOOR
144 
145  def __init__(self, vehicle: TeslemetryVehicleData, scopes: list[Scope]) -> None:
146  """Initialize the cover."""
147  super().__init__(vehicle, "vehicle_state_ft")
148 
149  self.scopedscoped = Scope.VEHICLE_CMDS in scopes
150  self._attr_supported_features_attr_supported_features = CoverEntityFeature.OPEN
151  if not self.scopedscoped:
152  self._attr_supported_features_attr_supported_features = CoverEntityFeature(0)
153 
154  def _async_update_attrs(self) -> None:
155  """Update the entity attributes."""
156  self._attr_is_closed_attr_is_closed = self._value_value_value_value == CLOSED
157 
158  async def async_open_cover(self, **kwargs: Any) -> None:
159  """Open front trunk."""
160  self.raise_for_scoperaise_for_scope(Scope.VEHICLE_CMDS)
161  await self.wake_up_if_asleepwake_up_if_asleep()
162  await handle_vehicle_command(self.apiapiapiapiapiapi.actuate_trunk(Trunk.FRONT))
163  self._attr_is_closed_attr_is_closed = False
164  self.async_write_ha_stateasync_write_ha_state()
165 
166 
168  """Cover entity for the rear trunk."""
169 
170  _attr_device_class = CoverDeviceClass.DOOR
171 
172  def __init__(self, vehicle: TeslemetryVehicleData, scopes: list[Scope]) -> None:
173  """Initialize the cover."""
174  super().__init__(vehicle, "vehicle_state_rt")
175 
176  self.scopedscoped = Scope.VEHICLE_CMDS in scopes
177  self._attr_supported_features_attr_supported_features = (
178  CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE
179  )
180  if not self.scopedscoped:
181  self._attr_supported_features_attr_supported_features = CoverEntityFeature(0)
182 
183  def _async_update_attrs(self) -> None:
184  """Update the entity attributes."""
185  self._attr_is_closed_attr_is_closed = self._value_value_value_value == CLOSED
186 
187  async def async_open_cover(self, **kwargs: Any) -> None:
188  """Open rear trunk."""
189  if self.is_closedis_closed is not False:
190  self.raise_for_scoperaise_for_scope(Scope.VEHICLE_CMDS)
191  await self.wake_up_if_asleepwake_up_if_asleep()
192  await handle_vehicle_command(self.apiapiapiapiapiapi.actuate_trunk(Trunk.REAR))
193  self._attr_is_closed_attr_is_closed = False
194  self.async_write_ha_stateasync_write_ha_state()
195 
196  async def async_close_cover(self, **kwargs: Any) -> None:
197  """Close rear trunk."""
198  if self.is_closedis_closed is not True:
199  self.raise_for_scoperaise_for_scope(Scope.VEHICLE_CMDS)
200  await self.wake_up_if_asleepwake_up_if_asleep()
201  await handle_vehicle_command(self.apiapiapiapiapiapi.actuate_trunk(Trunk.REAR))
202  self._attr_is_closed_attr_is_closed = True
203  self.async_write_ha_stateasync_write_ha_state()
204 
205 
207  """Cover entity for the sunroof."""
208 
209  _attr_device_class = CoverDeviceClass.WINDOW
210  _attr_supported_features = (
211  CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE | CoverEntityFeature.STOP
212  )
213  _attr_entity_registry_enabled_default = False
214 
215  def __init__(self, vehicle: TeslemetryVehicleData, scopes: list[Scope]) -> None:
216  """Initialize the sensor."""
217  super().__init__(vehicle, "vehicle_state_sun_roof_state")
218 
219  self.scopedscoped = Scope.VEHICLE_CMDS in scopes
220  if not self.scopedscoped:
222 
223  def _async_update_attrs(self) -> None:
224  """Update the entity attributes."""
225  value = self._value_value_value
226  if value in (None, "unknown"):
227  self._attr_is_closed_attr_is_closed = None
228  else:
229  self._attr_is_closed_attr_is_closed = value == "closed"
230 
231  self._attr_current_cover_position_attr_current_cover_position = self.getget(
232  "vehicle_state_sun_roof_percent_open"
233  )
234 
235  async def async_open_cover(self, **kwargs: Any) -> None:
236  """Open sunroof."""
237  self.raise_for_scoperaise_for_scope(Scope.VEHICLE_CMDS)
238  await self.wake_up_if_asleepwake_up_if_asleep()
239  await handle_vehicle_command(self.apiapiapiapiapiapi.sun_roof_control(SunRoofCommand.VENT))
240  self._attr_is_closed_attr_is_closed = False
241  self.async_write_ha_stateasync_write_ha_state()
242 
243  async def async_close_cover(self, **kwargs: Any) -> None:
244  """Close sunroof."""
245  self.raise_for_scoperaise_for_scope(Scope.VEHICLE_CMDS)
246  await self.wake_up_if_asleepwake_up_if_asleep()
247  await handle_vehicle_command(self.apiapiapiapiapiapi.sun_roof_control(SunRoofCommand.CLOSE))
248  self._attr_is_closed_attr_is_closed = True
249  self.async_write_ha_stateasync_write_ha_state()
250 
251  async def async_stop_cover(self, **kwargs: Any) -> None:
252  """Close sunroof."""
253  self.raise_for_scoperaise_for_scope(Scope.VEHICLE_CMDS)
254  await self.wake_up_if_asleepwake_up_if_asleep()
255  await handle_vehicle_command(self.apiapiapiapiapiapi.sun_roof_control(SunRoofCommand.STOP))
256  self._attr_is_closed_attr_is_closed = False
257  self.async_write_ha_stateasync_write_ha_state()
None __init__(self, TeslemetryVehicleData vehicle, list[Scope] scopes)
Definition: cover.py:106
None __init__(self, TeslemetryVehicleData vehicle, list[Scope] scopes)
Definition: cover.py:145
None __init__(self, TeslemetryVehicleData vehicle, list[Scope] scopes)
Definition: cover.py:172
None __init__(self, TeslemetryVehicleData vehicle, list[Scope] scopes)
Definition: cover.py:215
None __init__(self, TeslemetryVehicleData data, list[Scope] scopes)
Definition: cover.py:53
Any|None get(self, str key, Any|None default=None)
Definition: entity.py:61
bool handle_vehicle_command(Awaitable command)
Definition: helpers.py:50
None async_setup_entry(HomeAssistant hass, TeslemetryConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: cover.py:32