Home Assistant Unofficial Reference 2024.12.1
climate.py
Go to the documentation of this file.
1 """TOLO Sauna climate controls (main sauna control)."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from tololib import (
8  TARGET_HUMIDITY_MAX,
9  TARGET_HUMIDITY_MIN,
10  TARGET_TEMPERATURE_MAX,
11  TARGET_TEMPERATURE_MIN,
12  Calefaction,
13 )
14 
16  FAN_OFF,
17  FAN_ON,
18  ClimateEntity,
19  ClimateEntityFeature,
20  HVACAction,
21  HVACMode,
22 )
23 from homeassistant.config_entries import ConfigEntry
24 from homeassistant.const import ATTR_TEMPERATURE, PRECISION_WHOLE, UnitOfTemperature
25 from homeassistant.core import HomeAssistant
26 from homeassistant.helpers.entity_platform import AddEntitiesCallback
27 
28 from .const import DOMAIN
29 from .coordinator import ToloSaunaUpdateCoordinator
30 from .entity import ToloSaunaCoordinatorEntity
31 
32 
34  hass: HomeAssistant,
35  entry: ConfigEntry,
36  async_add_entities: AddEntitiesCallback,
37 ) -> None:
38  """Set up climate controls for TOLO Sauna."""
39  coordinator = hass.data[DOMAIN][entry.entry_id]
40  async_add_entities([SaunaClimate(coordinator, entry)])
41 
42 
44  """Sauna climate control."""
45 
46  _attr_fan_modes = [FAN_ON, FAN_OFF]
47  _attr_hvac_modes = [HVACMode.OFF, HVACMode.HEAT, HVACMode.DRY]
48  _attr_max_humidity = TARGET_HUMIDITY_MAX
49  _attr_max_temp = TARGET_TEMPERATURE_MAX
50  _attr_min_humidity = TARGET_HUMIDITY_MIN
51  _attr_min_temp = TARGET_TEMPERATURE_MIN
52  _attr_name = None
53  _attr_precision = PRECISION_WHOLE
54  _attr_supported_features = (
55  ClimateEntityFeature.TARGET_TEMPERATURE
56  | ClimateEntityFeature.TARGET_HUMIDITY
57  | ClimateEntityFeature.FAN_MODE
58  | ClimateEntityFeature.TURN_OFF
59  | ClimateEntityFeature.TURN_ON
60  )
61  _attr_target_temperature_step = 1
62  _attr_temperature_unit = UnitOfTemperature.CELSIUS
63  _enable_turn_on_off_backwards_compatibility = False
64 
65  def __init__(
66  self, coordinator: ToloSaunaUpdateCoordinator, entry: ConfigEntry
67  ) -> None:
68  """Initialize TOLO Sauna Climate entity."""
69  super().__init__(coordinator, entry)
70 
71  self._attr_unique_id_attr_unique_id = f"{entry.entry_id}_climate"
72 
73  @property
74  def current_temperature(self) -> int:
75  """Return current temperature."""
76  return self.coordinator.data.status.current_temperature
77 
78  @property
79  def current_humidity(self) -> int:
80  """Return current humidity."""
81  return self.coordinator.data.status.current_humidity
82 
83  @property
84  def target_temperature(self) -> int:
85  """Return target temperature."""
86  return self.coordinator.data.settings.target_temperature
87 
88  @property
89  def target_humidity(self) -> int:
90  """Return target humidity."""
91  return self.coordinator.data.settings.target_humidity
92 
93  @property
94  def hvac_mode(self) -> HVACMode:
95  """Get current HVAC mode."""
96  if self.coordinator.data.status.power_on:
97  return HVACMode.HEAT
98  if (
99  not self.coordinator.data.status.power_on
100  and self.coordinator.data.status.fan_on
101  ):
102  return HVACMode.DRY
103  return HVACMode.OFF
104 
105  @property
106  def hvac_action(self) -> HVACAction | None:
107  """Execute HVAC action."""
108  if self.coordinator.data.status.calefaction == Calefaction.HEAT:
109  return HVACAction.HEATING
110  if self.coordinator.data.status.calefaction == Calefaction.KEEP:
111  return HVACAction.IDLE
112  if self.coordinator.data.status.calefaction == Calefaction.INACTIVE:
113  if self.coordinator.data.status.fan_on:
114  return HVACAction.DRYING
115  return HVACAction.OFF
116  return None
117 
118  @property
119  def fan_mode(self) -> str:
120  """Return current fan mode."""
121  if self.coordinator.data.status.fan_on:
122  return FAN_ON
123  return FAN_OFF
124 
125  def set_hvac_mode(self, hvac_mode: HVACMode) -> None:
126  """Set HVAC mode."""
127  if hvac_mode == HVACMode.OFF:
128  self._set_power_and_fan_set_power_and_fan(False, False)
129  if hvac_mode == HVACMode.HEAT:
130  self._set_power_and_fan_set_power_and_fan(True, False)
131  if hvac_mode == HVACMode.DRY:
132  self._set_power_and_fan_set_power_and_fan(False, True)
133 
134  def set_fan_mode(self, fan_mode: str) -> None:
135  """Set fan mode."""
136  self.coordinator.client.set_fan_on(fan_mode == FAN_ON)
137 
138  def set_humidity(self, humidity: int) -> None:
139  """Set desired target humidity."""
140  self.coordinator.client.set_target_humidity(humidity)
141 
142  def set_temperature(self, **kwargs: Any) -> None:
143  """Set desired target temperature."""
144  if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None:
145  return
146 
147  self.coordinator.client.set_target_temperature(round(temperature))
148 
149  def _set_power_and_fan(self, power_on: bool, fan_on: bool) -> None:
150  """Shortcut for setting power and fan of TOLO device on one method."""
151  self.coordinator.client.set_power_on(power_on)
152  self.coordinator.client.set_fan_on(fan_on)
None __init__(self, ToloSaunaUpdateCoordinator coordinator, ConfigEntry entry)
Definition: climate.py:67
None set_hvac_mode(self, HVACMode hvac_mode)
Definition: climate.py:125
None _set_power_and_fan(self, bool power_on, bool fan_on)
Definition: climate.py:149
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: climate.py:37