Home Assistant Unofficial Reference 2024.12.1
select.py
Go to the documentation of this file.
1 """Select platform for Tessie integration."""
2 
3 from __future__ import annotations
4 
5 from itertools import chain
6 
7 from tesla_fleet_api.const import EnergyExportMode, EnergyOperationMode
8 from tessie_api import set_seat_cool, set_seat_heat
9 
10 from homeassistant.components.select import SelectEntity
11 from homeassistant.core import HomeAssistant
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 
14 from . import TessieConfigEntry
15 from .const import TessieSeatCoolerOptions, TessieSeatHeaterOptions
16 from .entity import TessieEnergyEntity, TessieEntity
17 from .helpers import handle_command
18 from .models import TessieEnergyData
19 
20 SEAT_HEATERS = {
21  "climate_state_seat_heater_left": "front_left",
22  "climate_state_seat_heater_right": "front_right",
23  "climate_state_seat_heater_rear_left": "rear_left",
24  "climate_state_seat_heater_rear_center": "rear_center",
25  "climate_state_seat_heater_rear_right": "rear_right",
26  "climate_state_seat_heater_third_row_left": "third_row_left",
27  "climate_state_seat_heater_third_row_right": "third_row_right",
28 }
29 
30 SEAT_COOLERS = {
31  "climate_state_seat_fan_front_left": "front_left",
32  "climate_state_seat_fan_front_right": "front_right",
33 }
34 
35 PARALLEL_UPDATES = 0
36 
37 
39  hass: HomeAssistant,
40  entry: TessieConfigEntry,
41  async_add_entities: AddEntitiesCallback,
42 ) -> None:
43  """Set up the Tessie select platform from a config entry."""
44 
46  chain(
47  (
48  TessieSeatHeaterSelectEntity(vehicle, key)
49  for vehicle in entry.runtime_data.vehicles
50  for key in SEAT_HEATERS
51  if key
52  in vehicle.data_coordinator.data # not all vehicles have rear center or third row
53  ),
54  (
55  TessieSeatCoolerSelectEntity(vehicle, key)
56  for vehicle in entry.runtime_data.vehicles
57  for key in SEAT_COOLERS
58  if key
59  in vehicle.data_coordinator.data # not all vehicles have ventilated seats
60  ),
61  (
62  TessieOperationSelectEntity(energysite)
63  for energysite in entry.runtime_data.energysites
64  if energysite.info_coordinator.data.get("components_battery")
65  ),
66  (
68  for energysite in entry.runtime_data.energysites
69  if energysite.info_coordinator.data.get("components_battery")
70  and energysite.info_coordinator.data.get("components_solar")
71  ),
72  )
73  )
74 
75 
77  """Select entity for current charge."""
78 
79  _attr_options = [
80  TessieSeatHeaterOptions.OFF,
81  TessieSeatHeaterOptions.LOW,
82  TessieSeatHeaterOptions.MEDIUM,
83  TessieSeatHeaterOptions.HIGH,
84  ]
85 
86  @property
87  def current_option(self) -> str | None:
88  """Return the current selected option."""
89  return self._attr_options_attr_options[self._value_value_value]
90 
91  async def async_select_option(self, option: str) -> None:
92  """Change the selected option."""
93  level = self._attr_options_attr_options.index(option)
94  await self.runrun(set_seat_heat, seat=SEAT_HEATERS[self.keykey], level=level)
95  self.setset((self.keykey, level))
96 
97 
99  """Select entity for cooled seat."""
100 
101  _attr_options = [
102  TessieSeatCoolerOptions.OFF,
103  TessieSeatCoolerOptions.LOW,
104  TessieSeatCoolerOptions.MEDIUM,
105  TessieSeatCoolerOptions.HIGH,
106  ]
107 
108  @property
109  def current_option(self) -> str | None:
110  """Return the current selected option."""
111  return self._attr_options_attr_options[self._value_value_value]
112 
113  async def async_select_option(self, option: str) -> None:
114  """Change the selected option."""
115  level = self._attr_options_attr_options.index(option)
116  await self.runrun(set_seat_cool, seat=SEAT_COOLERS[self.keykey], level=level)
117  self.setset((self.keykey, level))
118 
119 
121  """Select entity for operation mode select entities."""
122 
123  _attr_options: list[str] = [
124  EnergyOperationMode.AUTONOMOUS,
125  EnergyOperationMode.BACKUP,
126  EnergyOperationMode.SELF_CONSUMPTION,
127  ]
128 
129  def __init__(
130  self,
131  data: TessieEnergyData,
132  ) -> None:
133  """Initialize the operation mode select entity."""
134  super().__init__(data, data.info_coordinator, "default_real_mode")
135 
136  def _async_update_attrs(self) -> None:
137  """Update the attributes of the entity."""
138  self._attr_current_option_attr_current_option = self._value_value
139 
140  async def async_select_option(self, option: str) -> None:
141  """Change the selected option."""
142  await handle_command(self.apiapiapiapi.operation(option))
143  self._attr_current_option_attr_current_option = option
144  self.async_write_ha_stateasync_write_ha_state()
145 
146 
148  """Select entity for export rules select entities."""
149 
150  _attr_options: list[str] = [
151  EnergyExportMode.NEVER,
152  EnergyExportMode.BATTERY_OK,
153  EnergyExportMode.PV_ONLY,
154  ]
155 
156  def __init__(
157  self,
158  data: TessieEnergyData,
159  ) -> None:
160  """Initialize the export rules select entity."""
161  super().__init__(
162  data, data.info_coordinator, "components_customer_preferred_export_rule"
163  )
164 
165  def _async_update_attrs(self) -> None:
166  """Update the attributes of the entity."""
167  self._attr_current_option_attr_current_option = self.getget(self.keykey, EnergyExportMode.NEVER.value)
168 
169  async def async_select_option(self, option: str) -> None:
170  """Change the selected option."""
171  await handle_command(self.apiapiapiapi.grid_import_export(option))
172  self._attr_current_option_attr_current_option = option
173  self.async_write_ha_stateasync_write_ha_state()
Any get(self, str|None key=None, Any|None default=None)
Definition: entity.py:52
None run(self, Callable[..., Awaitable[dict[str, Any]]] func, **Any kargs)
Definition: entity.py:96
dict[str, Any] handle_command(Awaitable command)
Definition: helpers.py:36
None async_setup_entry(HomeAssistant hass, TessieConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: select.py:42