1 """Select platform for Tesla Fleet integration."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
7 from itertools
import chain
9 from tesla_fleet_api.const
import EnergyExportMode, EnergyOperationMode, Scope, Seat
15 from .
import TeslaFleetConfigEntry
16 from .entity
import TeslaFleetEnergyInfoEntity, TeslaFleetVehicleEntity
17 from .helpers
import handle_command, handle_vehicle_command
18 from .models
import TeslaFleetEnergyData, TeslaFleetVehicleData
28 @dataclass(frozen=True, kw_only=True)
30 """Seat Heater entity description."""
33 available_fn: Callable[[TeslaFleetSeatHeaterSelectEntity], bool] =
lambda _:
True
36 SEAT_HEATER_DESCRIPTIONS: tuple[SeatHeaterDescription, ...] = (
38 key=
"climate_state_seat_heater_left",
39 position=Seat.FRONT_LEFT,
42 key=
"climate_state_seat_heater_right",
43 position=Seat.FRONT_RIGHT,
46 key=
"climate_state_seat_heater_rear_left",
47 position=Seat.REAR_LEFT,
48 available_fn=
lambda self: self.get(
"vehicle_config_rear_seat_heaters") != 0,
49 entity_registry_enabled_default=
False,
52 key=
"climate_state_seat_heater_rear_center",
53 position=Seat.REAR_CENTER,
54 available_fn=
lambda self: self.get(
"vehicle_config_rear_seat_heaters") != 0,
55 entity_registry_enabled_default=
False,
58 key=
"climate_state_seat_heater_rear_right",
59 position=Seat.REAR_RIGHT,
60 available_fn=
lambda self: self.get(
"vehicle_config_rear_seat_heaters") != 0,
61 entity_registry_enabled_default=
False,
64 key=
"climate_state_seat_heater_third_row_left",
65 position=Seat.THIRD_LEFT,
66 available_fn=
lambda self: self.get(
"vehicle_config_third_row_seats") !=
"None",
67 entity_registry_enabled_default=
False,
70 key=
"climate_state_seat_heater_third_row_right",
71 position=Seat.THIRD_RIGHT,
72 available_fn=
lambda self: self.get(
"vehicle_config_third_row_seats") !=
"None",
73 entity_registry_enabled_default=
False,
80 entry: TeslaFleetConfigEntry,
81 async_add_entities: AddEntitiesCallback,
83 """Set up the TeslaFleet select platform from a config entry."""
89 vehicle, description, entry.runtime_data.scopes
91 for description
in SEAT_HEATER_DESCRIPTIONS
92 for vehicle
in entry.runtime_data.vehicles
96 for vehicle
in entry.runtime_data.vehicles
100 for energysite
in entry.runtime_data.energysites
101 if energysite.info_coordinator.data.get(
"components_battery")
105 for energysite
in entry.runtime_data.energysites
106 if energysite.info_coordinator.data.get(
"components_battery")
107 and energysite.info_coordinator.data.get(
"components_solar")
114 """Select entity for vehicle seat heater."""
116 entity_description: SeatHeaterDescription
127 data: TeslaFleetVehicleData,
128 description: SeatHeaterDescription,
131 """Initialize the vehicle seat select entity."""
133 self.
scopedscoped = Scope.VEHICLE_CMDS
in scopes
134 super().
__init__(data, description.key)
137 """Handle updated data from the coordinator."""
146 """Change the selected option."""
151 if level
and not self.
getget(
"climate_state_is_climate_on"):
161 """Select entity for vehicle steering wheel heater."""
171 data: TeslaFleetVehicleData,
174 """Initialize the vehicle steering wheel select entity."""
175 self.
scopedscoped = Scope.VEHICLE_CMDS
in scopes
178 "climate_state_steering_wheel_heat_level",
182 """Handle updated data from the coordinator."""
191 """Change the selected option."""
196 if level
and not self.
getget(
"climate_state_is_climate_on"):
199 self.
apiapiapiapiapi.remote_steering_wheel_heat_level_request(level)
206 """Select entity for operation mode select entities."""
208 _attr_options: list[str] = [
209 EnergyOperationMode.AUTONOMOUS,
210 EnergyOperationMode.BACKUP,
211 EnergyOperationMode.SELF_CONSUMPTION,
216 data: TeslaFleetEnergyData,
219 """Initialize the operation mode select entity."""
220 self.
scopedscoped = Scope.ENERGY_CMDS
in scopes
221 super().
__init__(data,
"default_real_mode")
224 """Update the attributes of the entity."""
228 """Change the selected option."""
236 """Select entity for export rules select entities."""
238 _attr_options: list[str] = [
239 EnergyExportMode.NEVER,
240 EnergyExportMode.BATTERY_OK,
241 EnergyExportMode.PV_ONLY,
246 data: TeslaFleetEnergyData,
249 """Initialize the export rules select entity."""
250 self.
scopedscoped = Scope.ENERGY_CMDS
in scopes
251 super().
__init__(data,
"components_customer_preferred_export_rule")
254 """Update the attributes of the entity."""
258 """Change the selected option."""
261 self.
apiapiapiapiapi.grid_import_export(customer_preferred_export_rule=option)
Any|None get(self, str key, Any|None default=None)
None raise_for_read_only(self, Scope scope)
None wake_up_if_asleep(self)
None __init__(self, TeslaFleetEnergyData data, list[Scope] scopes)
None _async_update_attrs(self)
None async_select_option(self, str option)
None _async_update_attrs(self)
None __init__(self, TeslaFleetEnergyData data, list[Scope] scopes)
None async_select_option(self, str option)
None async_select_option(self, str option)
None __init__(self, TeslaFleetVehicleData data, SeatHeaterDescription description, list[Scope] scopes)
None _async_update_attrs(self)
None __init__(self, TeslaFleetVehicleData data, list[Scope] scopes)
None async_select_option(self, str option)
None _async_update_attrs(self)
None async_write_ha_state(self)
bool handle_vehicle_command(Awaitable command)
dict[str, Any] handle_command(Awaitable command)
None async_setup_entry(HomeAssistant hass, TeslaFleetConfigEntry entry, AddEntitiesCallback async_add_entities)