Home Assistant Unofficial Reference 2024.12.1
climate.py
Go to the documentation of this file.
1 """Climate platform for Tessie integration."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from tessie_api import (
8  set_climate_keeper_mode,
9  set_temperature,
10  start_climate_preconditioning,
11  stop_climate,
12 )
13 
15  ATTR_HVAC_MODE,
16  ClimateEntity,
17  ClimateEntityFeature,
18  HVACMode,
19 )
20 from homeassistant.const import ATTR_TEMPERATURE, PRECISION_HALVES, UnitOfTemperature
21 from homeassistant.core import HomeAssistant
22 from homeassistant.helpers.entity_platform import AddEntitiesCallback
23 
24 from . import TessieConfigEntry
25 from .const import TessieClimateKeeper
26 from .entity import TessieEntity
27 from .models import TessieVehicleData
28 
29 PARALLEL_UPDATES = 0
30 
31 
33  hass: HomeAssistant,
34  entry: TessieConfigEntry,
35  async_add_entities: AddEntitiesCallback,
36 ) -> None:
37  """Set up the Tessie Climate platform from a config entry."""
38  data = entry.runtime_data
39 
40  async_add_entities(TessieClimateEntity(vehicle) for vehicle in data.vehicles)
41 
42 
44  """Vehicle Location Climate Class."""
45 
46  _attr_precision = PRECISION_HALVES
47  _attr_min_temp = 15
48  _attr_max_temp = 28
49  _attr_temperature_unit = UnitOfTemperature.CELSIUS
50  _attr_hvac_modes = [HVACMode.HEAT_COOL, HVACMode.OFF]
51  _attr_supported_features = (
52  ClimateEntityFeature.TURN_ON
53  | ClimateEntityFeature.TURN_OFF
54  | ClimateEntityFeature.TARGET_TEMPERATURE
55  | ClimateEntityFeature.PRESET_MODE
56  )
57  _attr_preset_modes: list = [
58  TessieClimateKeeper.OFF,
59  TessieClimateKeeper.ON,
60  TessieClimateKeeper.DOG,
61  TessieClimateKeeper.CAMP,
62  ]
63  _enable_turn_on_off_backwards_compatibility = False
64 
65  def __init__(
66  self,
67  vehicle: TessieVehicleData,
68  ) -> None:
69  """Initialize the Climate entity."""
70  super().__init__(vehicle, "primary")
71 
72  @property
73  def hvac_mode(self) -> HVACMode | None:
74  """Return hvac operation ie. heat, cool mode."""
75  if self.getget("climate_state_is_climate_on"):
76  return HVACMode.HEAT_COOL
77  return HVACMode.OFF
78 
79  @property
80  def current_temperature(self) -> float | None:
81  """Return the current temperature."""
82  return self.getget("climate_state_inside_temp")
83 
84  @property
85  def target_temperature(self) -> float | None:
86  """Return the temperature we try to reach."""
87  return self.getget("climate_state_driver_temp_setting")
88 
89  @property
90  def max_temp(self) -> float:
91  """Return the maximum temperature."""
92  return self.getget("climate_state_max_avail_temp", self._attr_max_temp_attr_max_temp)
93 
94  @property
95  def min_temp(self) -> float:
96  """Return the minimum temperature."""
97  return self.getget("climate_state_min_avail_temp", self._attr_min_temp_attr_min_temp)
98 
99  @property
100  def preset_mode(self) -> str | None:
101  """Return the current preset mode."""
102  return self.getget("climate_state_climate_keeper_mode")
103 
104  async def async_turn_on(self) -> None:
105  """Set the climate state to on."""
106  await self.runrun(start_climate_preconditioning)
107  self.setset(("climate_state_is_climate_on", True))
108 
109  async def async_turn_off(self) -> None:
110  """Set the climate state to off."""
111  await self.runrun(stop_climate)
112  self.setset(
113  ("climate_state_is_climate_on", False),
114  ("climate_state_climate_keeper_mode", "off"),
115  )
116 
117  async def async_set_temperature(self, **kwargs: Any) -> None:
118  """Set the climate temperature."""
119  if mode := kwargs.get(ATTR_HVAC_MODE):
120  await self.async_set_hvac_modeasync_set_hvac_modeasync_set_hvac_mode(mode)
121 
122  if temp := kwargs.get(ATTR_TEMPERATURE):
123  await self.runrun(set_temperature, temperature=temp)
124  self.setset(("climate_state_driver_temp_setting", temp))
125 
126  async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
127  """Set the climate mode and state."""
128  if hvac_mode == HVACMode.OFF:
129  await self.async_turn_offasync_turn_offasync_turn_off()
130  else:
131  await self.async_turn_onasync_turn_onasync_turn_on()
132 
133  async def async_set_preset_mode(self, preset_mode: str) -> None:
134  """Set the climate preset mode."""
135  await self.runrun(
136  set_climate_keeper_mode, mode=self._attr_preset_modes.index(preset_mode)
137  )
138  self.setset(
139  (
140  "climate_state_climate_keeper_mode",
141  preset_mode,
142  ),
143  (
144  "climate_state_is_climate_on",
145  preset_mode != self._attr_preset_modes[0],
146  ),
147  )
None async_set_hvac_mode(self, HVACMode hvac_mode)
Definition: __init__.py:813
None async_set_hvac_mode(self, HVACMode hvac_mode)
Definition: climate.py:126
None __init__(self, TessieVehicleData vehicle)
Definition: climate.py:68
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
None async_setup_entry(HomeAssistant hass, TessieConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: climate.py:36