Home Assistant Unofficial Reference 2024.12.1
climate.py
Go to the documentation of this file.
1 """Demo platform that offers a fake climate device."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
8  ATTR_HVAC_MODE,
9  ATTR_TARGET_TEMP_HIGH,
10  ATTR_TARGET_TEMP_LOW,
11  ClimateEntity,
12  ClimateEntityFeature,
13  HVACAction,
14  HVACMode,
15 )
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature
18 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers.device_registry import DeviceInfo
20 from homeassistant.helpers.entity_platform import AddEntitiesCallback
21 
22 from . import DOMAIN
23 
24 SUPPORT_FLAGS = ClimateEntityFeature(0)
25 
26 
28  hass: HomeAssistant,
29  config_entry: ConfigEntry,
30  async_add_entities: AddEntitiesCallback,
31 ) -> None:
32  """Set up the demo climate platform."""
34  [
36  unique_id="climate_1",
37  device_name="HeatPump",
38  target_temperature=68,
39  unit_of_measurement=UnitOfTemperature.FAHRENHEIT,
40  preset=None,
41  current_temperature=77,
42  fan_mode=None,
43  target_humidity=None,
44  current_humidity=None,
45  swing_mode=None,
46  swing_horizontal_mode=None,
47  hvac_mode=HVACMode.HEAT,
48  hvac_action=HVACAction.HEATING,
49  target_temp_high=None,
50  target_temp_low=None,
51  hvac_modes=[HVACMode.HEAT, HVACMode.OFF],
52  ),
54  unique_id="climate_2",
55  device_name="Hvac",
56  target_temperature=21,
57  unit_of_measurement=UnitOfTemperature.CELSIUS,
58  preset=None,
59  current_temperature=22,
60  fan_mode="on_high",
61  target_humidity=67.4,
62  current_humidity=54.2,
63  swing_mode="off",
64  swing_horizontal_mode="auto",
65  hvac_mode=HVACMode.COOL,
66  hvac_action=HVACAction.COOLING,
67  target_temp_high=None,
68  target_temp_low=None,
69  hvac_modes=[cls for cls in HVACMode if cls != HVACMode.HEAT_COOL],
70  ),
72  unique_id="climate_3",
73  device_name="Ecobee",
74  target_temperature=None,
75  unit_of_measurement=UnitOfTemperature.CELSIUS,
76  preset="home",
77  preset_modes=["home", "eco", "away"],
78  current_temperature=23,
79  fan_mode="auto_low",
80  target_humidity=None,
81  current_humidity=None,
82  swing_mode="auto",
83  swing_horizontal_mode=None,
84  hvac_mode=HVACMode.HEAT_COOL,
85  hvac_action=None,
86  target_temp_high=24,
87  target_temp_low=21,
88  hvac_modes=[cls for cls in HVACMode if cls != HVACMode.HEAT],
89  ),
90  ]
91  )
92 
93 
95  """Representation of a demo climate device."""
96 
97  _attr_has_entity_name = True
98  _attr_name = None
99  _attr_should_poll = False
100  _attr_translation_key = "ubercool"
101  _enable_turn_on_off_backwards_compatibility = False
102 
103  def __init__(
104  self,
105  unique_id: str,
106  device_name: str,
107  target_temperature: float | None,
108  unit_of_measurement: str,
109  preset: str | None,
110  current_temperature: float,
111  fan_mode: str | None,
112  target_humidity: float | None,
113  current_humidity: float | None,
114  swing_mode: str | None,
115  swing_horizontal_mode: str | None,
116  hvac_mode: HVACMode,
117  hvac_action: HVACAction | None,
118  target_temp_high: float | None,
119  target_temp_low: float | None,
120  hvac_modes: list[HVACMode],
121  preset_modes: list[str] | None = None,
122  ) -> None:
123  """Initialize the climate device."""
124  self._unique_id_unique_id = unique_id
125  self._attr_supported_features_attr_supported_features = SUPPORT_FLAGS
126  if target_temperature is not None:
127  self._attr_supported_features_attr_supported_features |= ClimateEntityFeature.TARGET_TEMPERATURE
128  if preset is not None:
129  self._attr_supported_features_attr_supported_features |= ClimateEntityFeature.PRESET_MODE
130  if fan_mode is not None:
131  self._attr_supported_features_attr_supported_features |= ClimateEntityFeature.FAN_MODE
132  if target_humidity is not None:
133  self._attr_supported_features_attr_supported_features |= ClimateEntityFeature.TARGET_HUMIDITY
134  if swing_mode is not None:
135  self._attr_supported_features_attr_supported_features |= ClimateEntityFeature.SWING_MODE
136  if swing_horizontal_mode is not None:
137  self._attr_supported_features_attr_supported_features |= ClimateEntityFeature.SWING_HORIZONTAL_MODE
138  if HVACMode.HEAT_COOL in hvac_modes or HVACMode.AUTO in hvac_modes:
139  self._attr_supported_features_attr_supported_features |= (
140  ClimateEntityFeature.TARGET_TEMPERATURE_RANGE
141  )
142  self._attr_supported_features_attr_supported_features |= (
143  ClimateEntityFeature.TURN_OFF | ClimateEntityFeature.TURN_ON
144  )
145  self._target_temperature_target_temperature = target_temperature
146  self._target_humidity_target_humidity = target_humidity
147  self._unit_of_measurement_unit_of_measurement = unit_of_measurement
148  self._preset_preset = preset
149  self._preset_modes_preset_modes = preset_modes
150  self._current_temperature_current_temperature = current_temperature
151  self._current_humidity_current_humidity = current_humidity
152  self._current_fan_mode_current_fan_mode = fan_mode
153  self._hvac_action_hvac_action = hvac_action
154  self._hvac_mode_hvac_mode = hvac_mode
155  self._current_swing_mode_current_swing_mode = swing_mode
156  self._current_swing_horizontal_mode_current_swing_horizontal_mode = swing_horizontal_mode
157  self._fan_modes_fan_modes = ["on_low", "on_high", "auto_low", "auto_high", "off"]
158  self._hvac_modes_hvac_modes = hvac_modes
159  self._swing_modes_swing_modes = ["auto", "1", "2", "3", "off"]
160  self._swing_horizontal_modes_swing_horizontal_modes = ["auto", "rangefull", "off"]
161  self._target_temperature_high_target_temperature_high = target_temp_high
162  self._target_temperature_low_target_temperature_low = target_temp_low
163  self._attr_device_info_attr_device_info = DeviceInfo(
164  identifiers={(DOMAIN, unique_id)},
165  name=device_name,
166  )
167 
168  @property
169  def unique_id(self) -> str:
170  """Return the unique id."""
171  return self._unique_id_unique_id
172 
173  @property
174  def temperature_unit(self) -> str:
175  """Return the unit of measurement."""
176  return self._unit_of_measurement_unit_of_measurement
177 
178  @property
179  def current_temperature(self) -> float:
180  """Return the current temperature."""
181  return self._current_temperature_current_temperature
182 
183  @property
184  def target_temperature(self) -> float | None:
185  """Return the temperature we try to reach."""
186  return self._target_temperature_target_temperature
187 
188  @property
189  def target_temperature_high(self) -> float | None:
190  """Return the highbound target temperature we try to reach."""
191  return self._target_temperature_high_target_temperature_high
192 
193  @property
194  def target_temperature_low(self) -> float | None:
195  """Return the lowbound target temperature we try to reach."""
196  return self._target_temperature_low_target_temperature_low
197 
198  @property
199  def current_humidity(self) -> float | None:
200  """Return the current humidity."""
201  return self._current_humidity_current_humidity
202 
203  @property
204  def target_humidity(self) -> float | None:
205  """Return the humidity we try to reach."""
206  return self._target_humidity_target_humidity
207 
208  @property
209  def hvac_action(self) -> HVACAction | None:
210  """Return current operation ie. heat, cool, idle."""
211  return self._hvac_action_hvac_action
212 
213  @property
214  def hvac_mode(self) -> HVACMode:
215  """Return hvac target hvac state."""
216  return self._hvac_mode_hvac_mode
217 
218  @property
219  def hvac_modes(self) -> list[HVACMode]:
220  """Return the list of available operation modes."""
221  return self._hvac_modes_hvac_modes
222 
223  @property
224  def preset_mode(self) -> str | None:
225  """Return preset mode."""
226  return self._preset_preset
227 
228  @property
229  def preset_modes(self) -> list[str] | None:
230  """Return preset modes."""
231  return self._preset_modes_preset_modes
232 
233  @property
234  def fan_mode(self) -> str | None:
235  """Return the fan setting."""
236  return self._current_fan_mode_current_fan_mode
237 
238  @property
239  def fan_modes(self) -> list[str]:
240  """Return the list of available fan modes."""
241  return self._fan_modes_fan_modes
242 
243  @property
244  def swing_mode(self) -> str | None:
245  """Return the swing setting."""
246  return self._current_swing_mode_current_swing_mode
247 
248  @property
249  def swing_modes(self) -> list[str]:
250  """List of available swing modes."""
251  return self._swing_modes_swing_modes
252 
253  @property
254  def swing_horizontal_mode(self) -> str | None:
255  """Return the swing setting."""
256  return self._current_swing_horizontal_mode_current_swing_horizontal_mode
257 
258  @property
259  def swing_horizontal_modes(self) -> list[str]:
260  """List of available swing modes."""
261  return self._swing_horizontal_modes_swing_horizontal_modes
262 
263  async def async_set_temperature(self, **kwargs: Any) -> None:
264  """Set new target temperatures."""
265  if kwargs.get(ATTR_TEMPERATURE) is not None:
266  self._target_temperature_target_temperature = kwargs.get(ATTR_TEMPERATURE)
267  if (
268  kwargs.get(ATTR_TARGET_TEMP_HIGH) is not None
269  and kwargs.get(ATTR_TARGET_TEMP_LOW) is not None
270  ):
271  self._target_temperature_high_target_temperature_high = kwargs.get(ATTR_TARGET_TEMP_HIGH)
272  self._target_temperature_low_target_temperature_low = kwargs.get(ATTR_TARGET_TEMP_LOW)
273  if (hvac_mode := kwargs.get(ATTR_HVAC_MODE)) is not None:
274  self._hvac_mode_hvac_mode = hvac_mode
275  self.async_write_ha_stateasync_write_ha_state()
276 
277  async def async_set_humidity(self, humidity: int) -> None:
278  """Set new humidity level."""
279  self._target_humidity_target_humidity = humidity
280  self.async_write_ha_stateasync_write_ha_state()
281 
282  async def async_set_swing_mode(self, swing_mode: str) -> None:
283  """Set new swing mode."""
284  self._current_swing_mode_current_swing_mode = swing_mode
285  self.async_write_ha_stateasync_write_ha_state()
286 
287  async def async_set_swing_horizontal_mode(self, swing_horizontal_mode: str) -> None:
288  """Set new swing mode."""
289  self._current_swing_horizontal_mode_current_swing_horizontal_mode = swing_horizontal_mode
290  self.async_write_ha_stateasync_write_ha_state()
291 
292  async def async_set_fan_mode(self, fan_mode: str) -> None:
293  """Set new fan mode."""
294  self._current_fan_mode_current_fan_mode = fan_mode
295  self.async_write_ha_stateasync_write_ha_state()
296 
297  async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
298  """Set new operation mode."""
299  self._hvac_mode_hvac_mode = hvac_mode
300  self.async_write_ha_stateasync_write_ha_state()
301 
302  async def async_set_preset_mode(self, preset_mode: str) -> None:
303  """Update preset_mode on."""
304  self._preset_preset = preset_mode
305  self.async_write_ha_stateasync_write_ha_state()
None __init__(self, str unique_id, str device_name, float|None target_temperature, str unit_of_measurement, str|None preset, float current_temperature, str|None fan_mode, float|None target_humidity, float|None current_humidity, str|None swing_mode, str|None swing_horizontal_mode, HVACMode hvac_mode, HVACAction|None hvac_action, float|None target_temp_high, float|None target_temp_low, list[HVACMode] hvac_modes, list[str]|None preset_modes=None)
Definition: climate.py:122
None async_set_humidity(self, int humidity)
Definition: climate.py:277
None async_set_temperature(self, **Any kwargs)
Definition: climate.py:263
None async_set_swing_horizontal_mode(self, str swing_horizontal_mode)
Definition: climate.py:287
None async_set_hvac_mode(self, HVACMode hvac_mode)
Definition: climate.py:297
None async_set_fan_mode(self, str fan_mode)
Definition: climate.py:292
None async_set_swing_mode(self, str swing_mode)
Definition: climate.py:282
None async_set_preset_mode(self, str preset_mode)
Definition: climate.py:302
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: climate.py:31