Home Assistant Unofficial Reference 2024.12.1
climate.py
Go to the documentation of this file.
1 """Support for Adax wifi-enabled home heaters."""
2 
3 from __future__ import annotations
4 
5 from typing import Any, cast
6 
7 from adax import Adax
8 from adax_local import Adax as AdaxLocal
9 
11  ClimateEntity,
12  ClimateEntityFeature,
13  HVACMode,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.const import (
17  ATTR_TEMPERATURE,
18  CONF_IP_ADDRESS,
19  CONF_PASSWORD,
20  CONF_TOKEN,
21  CONF_UNIQUE_ID,
22  PRECISION_WHOLE,
23  UnitOfTemperature,
24 )
25 from homeassistant.core import HomeAssistant
26 from homeassistant.helpers.aiohttp_client import async_get_clientsession
27 from homeassistant.helpers.device_registry import DeviceInfo
28 from homeassistant.helpers.entity_platform import AddEntitiesCallback
29 
30 from .const import ACCOUNT_ID, CONNECTION_TYPE, DOMAIN, LOCAL
31 
32 
34  hass: HomeAssistant,
35  entry: ConfigEntry,
36  async_add_entities: AddEntitiesCallback,
37 ) -> None:
38  """Set up the Adax thermostat with config flow."""
39  if entry.data.get(CONNECTION_TYPE) == LOCAL:
40  adax_data_handler = AdaxLocal(
41  entry.data[CONF_IP_ADDRESS],
42  entry.data[CONF_TOKEN],
43  websession=async_get_clientsession(hass, verify_ssl=False),
44  )
46  [LocalAdaxDevice(adax_data_handler, entry.data[CONF_UNIQUE_ID])], True
47  )
48  return
49 
50  adax_data_handler = Adax(
51  entry.data[ACCOUNT_ID],
52  entry.data[CONF_PASSWORD],
53  websession=async_get_clientsession(hass),
54  )
55 
57  (
58  AdaxDevice(room, adax_data_handler)
59  for room in await adax_data_handler.get_rooms()
60  ),
61  True,
62  )
63 
64 
66  """Representation of a heater."""
67 
68  _attr_hvac_modes = [HVACMode.HEAT, HVACMode.OFF]
69  _attr_max_temp = 35
70  _attr_min_temp = 5
71  _attr_supported_features = (
72  ClimateEntityFeature.TARGET_TEMPERATURE
73  | ClimateEntityFeature.TURN_OFF
74  | ClimateEntityFeature.TURN_ON
75  )
76  _attr_target_temperature_step = PRECISION_WHOLE
77  _attr_temperature_unit = UnitOfTemperature.CELSIUS
78  _enable_turn_on_off_backwards_compatibility = False
79 
80  def __init__(self, heater_data: dict[str, Any], adax_data_handler: Adax) -> None:
81  """Initialize the heater."""
82  self._device_id_device_id = heater_data["id"]
83  self._adax_data_handler_adax_data_handler = adax_data_handler
84 
85  self._attr_unique_id_attr_unique_id = f"{heater_data['homeId']}_{heater_data['id']}"
86  self._attr_device_info_attr_device_info = DeviceInfo(
87  identifiers={(DOMAIN, heater_data["id"])},
88  # Instead of setting the device name to the entity name, adax
89  # should be updated to set has_entity_name = True, and set the entity
90  # name to None
91  name=cast(str | None, self.namename),
92  manufacturer="Adax",
93  )
94 
95  async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
96  """Set hvac mode."""
97  if hvac_mode == HVACMode.HEAT:
98  temperature = max(self.min_tempmin_temp, self.target_temperaturetarget_temperature or self.min_tempmin_temp)
99  await self._adax_data_handler_adax_data_handler.set_room_target_temperature(
100  self._device_id_device_id, temperature, True
101  )
102  elif hvac_mode == HVACMode.OFF:
103  await self._adax_data_handler_adax_data_handler.set_room_target_temperature(
104  self._device_id_device_id, self.min_tempmin_temp, False
105  )
106  else:
107  return
108  await self._adax_data_handler_adax_data_handler.update()
109 
110  async def async_set_temperature(self, **kwargs: Any) -> None:
111  """Set new target temperature."""
112  if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None:
113  return
114  await self._adax_data_handler_adax_data_handler.set_room_target_temperature(
115  self._device_id_device_id, temperature, True
116  )
117 
118  async def async_update(self) -> None:
119  """Get the latest data."""
120  for room in await self._adax_data_handler_adax_data_handler.get_rooms():
121  if room["id"] != self._device_id_device_id:
122  continue
123  self._attr_name_attr_name = room["name"]
124  self._attr_current_temperature_attr_current_temperature = room.get("temperature")
125  self._attr_target_temperature_attr_target_temperature = room.get("targetTemperature")
126  if room["heatingEnabled"]:
127  self._attr_hvac_mode_attr_hvac_mode = HVACMode.HEAT
128  self._attr_icon_attr_icon = "mdi:radiator"
129  else:
130  self._attr_hvac_mode_attr_hvac_mode = HVACMode.OFF
131  self._attr_icon_attr_icon = "mdi:radiator-off"
132  return
133 
134 
136  """Representation of a heater."""
137 
138  _attr_hvac_modes = [HVACMode.HEAT, HVACMode.OFF]
139  _attr_hvac_mode = HVACMode.HEAT
140  _attr_max_temp = 35
141  _attr_min_temp = 5
142  _attr_supported_features = (
143  ClimateEntityFeature.TARGET_TEMPERATURE
144  | ClimateEntityFeature.TURN_OFF
145  | ClimateEntityFeature.TURN_ON
146  )
147  _attr_target_temperature_step = PRECISION_WHOLE
148  _attr_temperature_unit = UnitOfTemperature.CELSIUS
149 
150  def __init__(self, adax_data_handler: AdaxLocal, unique_id: str) -> None:
151  """Initialize the heater."""
152  self._adax_data_handler_adax_data_handler = adax_data_handler
153  self._attr_unique_id_attr_unique_id = unique_id
154  self._attr_device_info_attr_device_info = DeviceInfo(
155  identifiers={(DOMAIN, unique_id)},
156  manufacturer="Adax",
157  )
158 
159  async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
160  """Set hvac mode."""
161  if hvac_mode == HVACMode.HEAT:
162  temperature = self._attr_target_temperature_attr_target_temperature or self._attr_min_temp_attr_min_temp
163  await self._adax_data_handler_adax_data_handler.set_target_temperature(temperature)
164  elif hvac_mode == HVACMode.OFF:
165  await self._adax_data_handler_adax_data_handler.set_target_temperature(0)
166 
167  async def async_set_temperature(self, **kwargs: Any) -> None:
168  """Set new target temperature."""
169  if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None:
170  return
171  await self._adax_data_handler_adax_data_handler.set_target_temperature(temperature)
172 
173  async def async_update(self) -> None:
174  """Get the latest data."""
175  data = await self._adax_data_handler_adax_data_handler.get_status()
176  self._attr_current_temperature_attr_current_temperature = data["current_temperature"]
177  self._attr_available_attr_available = self._attr_current_temperature_attr_current_temperature is not None
178  if (target_temp := data["target_temperature"]) == 0:
179  self._attr_hvac_mode_attr_hvac_mode = HVACMode.OFF
180  self._attr_icon_attr_icon = "mdi:radiator-off"
181  if target_temp == 0:
182  self._attr_target_temperature_attr_target_temperature = self._attr_min_temp_attr_min_temp
183  else:
184  self._attr_hvac_mode_attr_hvac_mode = HVACMode.HEAT
185  self._attr_icon_attr_icon = "mdi:radiator"
186  self._attr_target_temperature_attr_target_temperature = target_temp
None async_set_temperature(self, **Any kwargs)
Definition: climate.py:110
None __init__(self, dict[str, Any] heater_data, Adax adax_data_handler)
Definition: climate.py:80
None async_set_hvac_mode(self, HVACMode hvac_mode)
Definition: climate.py:95
None __init__(self, AdaxLocal adax_data_handler, str unique_id)
Definition: climate.py:150
None async_set_hvac_mode(self, HVACMode hvac_mode)
Definition: climate.py:159
str|UndefinedType|None name(self)
Definition: entity.py:738
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: climate.py:37
def get_rooms(HomeAssistant hass, ConfigEntry entry)
Definition: media_player.py:70
IssData update(pyiss.ISS iss)
Definition: __init__.py:33
def get_status(hass, host, port)
Definition: panel.py:387
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)