Home Assistant Unofficial Reference 2024.12.1
climate.py
Go to the documentation of this file.
1 """Support for Homematic thermostats."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
8  PRESET_BOOST,
9  PRESET_COMFORT,
10  PRESET_ECO,
11  PRESET_NONE,
12  ClimateEntity,
13  ClimateEntityFeature,
14  HVACMode,
15 )
16 from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
20 
21 from .const import ATTR_DISCOVER_DEVICES, HM_ATTRIBUTE_SUPPORT
22 from .entity import HMDevice
23 
24 HM_TEMP_MAP = ["ACTUAL_TEMPERATURE", "TEMPERATURE"]
25 
26 HM_HUMI_MAP = ["ACTUAL_HUMIDITY", "HUMIDITY"]
27 
28 HM_PRESET_MAP = {
29  "BOOST_MODE": PRESET_BOOST,
30  "COMFORT_MODE": PRESET_COMFORT,
31  "LOWERING_MODE": PRESET_ECO,
32 }
33 
34 HM_CONTROL_MODE = "CONTROL_MODE"
35 HMIP_CONTROL_MODE = "SET_POINT_MODE"
36 
37 
39  hass: HomeAssistant,
40  config: ConfigType,
41  add_entities: AddEntitiesCallback,
42  discovery_info: DiscoveryInfoType | None = None,
43 ) -> None:
44  """Set up the Homematic thermostat platform."""
45  if discovery_info is None:
46  return
47 
48  devices = []
49  for conf in discovery_info[ATTR_DISCOVER_DEVICES]:
50  new_device = HMThermostat(conf)
51  devices.append(new_device)
52 
53  add_entities(devices, True)
54 
55 
57  """Representation of a Homematic thermostat."""
58 
59  _attr_supported_features = (
60  ClimateEntityFeature.TARGET_TEMPERATURE
61  | ClimateEntityFeature.PRESET_MODE
62  | ClimateEntityFeature.TURN_OFF
63  | ClimateEntityFeature.TURN_ON
64  )
65  _attr_temperature_unit = UnitOfTemperature.CELSIUS
66  _enable_turn_on_off_backwards_compatibility = False
67 
68  @property
69  def hvac_mode(self) -> HVACMode:
70  """Return hvac operation ie. heat, cool mode.
71 
72  Need to be one of HVAC_MODE_*.
73  """
74  if self.target_temperaturetarget_temperaturetarget_temperature <= self._hmdevice_hmdevice.OFF_VALUE + 0.5:
75  return HVACMode.OFF
76  if "MANU_MODE" in self._hmdevice_hmdevice.ACTIONNODE:
77  if self._hm_control_mode_hm_control_mode_hm_control_mode == self._hmdevice_hmdevice.MANU_MODE:
78  return HVACMode.HEAT
79  return HVACMode.AUTO
80 
81  # Simple devices
82  if self._data.get("BOOST_MODE"):
83  return HVACMode.AUTO
84  return HVACMode.HEAT
85 
86  @property
87  def hvac_modes(self) -> list[HVACMode]:
88  """Return the list of available hvac operation modes.
89 
90  Need to be a subset of HVAC_MODES.
91  """
92  if "AUTO_MODE" in self._hmdevice_hmdevice.ACTIONNODE:
93  return [HVACMode.AUTO, HVACMode.HEAT, HVACMode.OFF]
94  return [HVACMode.HEAT, HVACMode.OFF]
95 
96  @property
97  def preset_mode(self):
98  """Return the current preset mode, e.g., home, away, temp."""
99  if self._data.get("BOOST_MODE", False):
100  return "boost"
101 
102  if not self._hm_control_mode_hm_control_mode_hm_control_mode:
103  return PRESET_NONE
104 
105  mode = HM_ATTRIBUTE_SUPPORT[HM_CONTROL_MODE][1][self._hm_control_mode_hm_control_mode_hm_control_mode]
106  mode = mode.lower()
107 
108  # Filter HVAC states
109  if mode not in (HVACMode.AUTO, HVACMode.HEAT):
110  return PRESET_NONE
111  return mode
112 
113  @property
114  def preset_modes(self):
115  """Return a list of available preset modes."""
116  return [
117  HM_PRESET_MAP[mode]
118  for mode in self._hmdevice_hmdevice.ACTIONNODE
119  if mode in HM_PRESET_MAP
120  ]
121 
122  @property
123  def current_humidity(self):
124  """Return the current humidity."""
125  for node in HM_HUMI_MAP:
126  if node in self._data:
127  return self._data[node]
128  return None
129 
130  @property
132  """Return the current temperature."""
133  for node in HM_TEMP_MAP:
134  if node in self._data:
135  return self._data[node]
136  return None
137 
138  @property
140  """Return the target temperature."""
141  return self._data.get(self._state_state_state)
142 
143  def set_temperature(self, **kwargs: Any) -> None:
144  """Set new target temperature."""
145  if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None:
146  return
147 
148  self._hmdevice_hmdevice.writeNodeData(self._state_state_state, float(temperature))
149 
150  def set_hvac_mode(self, hvac_mode: HVACMode) -> None:
151  """Set new target hvac mode."""
152  if hvac_mode == HVACMode.AUTO:
153  self._hmdevice_hmdevice.MODE = self._hmdevice_hmdevice.AUTO_MODE
154  elif hvac_mode == HVACMode.HEAT:
155  self._hmdevice_hmdevice.MODE = self._hmdevice_hmdevice.MANU_MODE
156  elif hvac_mode == HVACMode.OFF:
157  self._hmdevice_hmdevice.turnoff()
158 
159  def set_preset_mode(self, preset_mode: str) -> None:
160  """Set new preset mode."""
161  if preset_mode == PRESET_BOOST:
162  self._hmdevice_hmdevice.MODE = self._hmdevice_hmdevice.BOOST_MODE
163  elif preset_mode == PRESET_COMFORT:
164  self._hmdevice_hmdevice.MODE = self._hmdevice_hmdevice.COMFORT_MODE
165  elif preset_mode == PRESET_ECO:
166  self._hmdevice_hmdevice.MODE = self._hmdevice_hmdevice.LOWERING_MODE
167 
168  @property
169  def min_temp(self):
170  """Return the minimum temperature."""
171  return 4.5
172 
173  @property
174  def max_temp(self):
175  """Return the maximum temperature."""
176  return 30.5
177 
178  @property
180  """Return the supported step of target temperature."""
181  return 0.5
182 
183  @property
184  def _hm_control_mode(self):
185  """Return Control mode."""
186  if HMIP_CONTROL_MODE in self._data:
187  return self._data[HMIP_CONTROL_MODE]
188 
189  # Homematic
190  return self._data.get("CONTROL_MODE")
191 
192  def _init_data_struct(self):
193  """Generate a data dict (self._data) from the Homematic metadata."""
194  self._state_state_state = next(iter(self._hmdevice_hmdevice.WRITENODE.keys()))
195  self._data[self._state_state_state] = None
196 
197  if (
198  HM_CONTROL_MODE in self._hmdevice_hmdevice.ATTRIBUTENODE
199  or HMIP_CONTROL_MODE in self._hmdevice_hmdevice.ATTRIBUTENODE
200  ):
201  self._data[HM_CONTROL_MODE] = None
202 
203  for node in self._hmdevice_hmdevice.SENSORNODE:
204  self._data[node] = None
None set_hvac_mode(self, HVACMode hvac_mode)
Definition: climate.py:150
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: climate.py:43