Home Assistant Unofficial Reference 2024.12.1
humidifier.py
Go to the documentation of this file.
1 """The Aprilaire humidifier component."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Awaitable, Callable
6 from dataclasses import dataclass
7 from typing import Any, cast
8 
9 from pyaprilaire.const import Attribute
10 
12  HumidifierAction,
13  HumidifierDeviceClass,
14  HumidifierEntity,
15  HumidifierEntityDescription,
16 )
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.typing import StateType
20 
21 from .coordinator import AprilaireConfigEntry, AprilaireCoordinator
22 from .entity import BaseAprilaireEntity
23 
24 HUMIDIFIER_ACTION_MAP: dict[StateType, HumidifierAction] = {
25  0: HumidifierAction.IDLE,
26  1: HumidifierAction.IDLE,
27  2: HumidifierAction.HUMIDIFYING,
28  3: HumidifierAction.OFF,
29 }
30 
31 DEHUMIDIFIER_ACTION_MAP: dict[StateType, HumidifierAction] = {
32  0: HumidifierAction.IDLE,
33  1: HumidifierAction.IDLE,
34  2: HumidifierAction.DRYING,
35  3: HumidifierAction.DRYING,
36  4: HumidifierAction.OFF,
37 }
38 
39 
41  hass: HomeAssistant,
42  config_entry: AprilaireConfigEntry,
43  async_add_entities: AddEntitiesCallback,
44 ) -> None:
45  """Set up Aprilaire humidifier devices."""
46 
47  coordinator = config_entry.runtime_data
48 
49  assert config_entry.unique_id is not None
50 
51  descriptions: list[AprilaireHumidifierDescription] = []
52 
53  if coordinator.data.get(Attribute.HUMIDIFICATION_AVAILABLE) in (0, 1, 2):
54  descriptions.append(
56  key="humidifier",
57  translation_key="humidifier",
58  device_class=HumidifierDeviceClass.HUMIDIFIER,
59  action_key=Attribute.HUMIDIFICATION_STATUS,
60  action_map=HUMIDIFIER_ACTION_MAP,
61  current_humidity_key=Attribute.INDOOR_HUMIDITY_CONTROLLING_SENSOR_VALUE,
62  target_humidity_key=Attribute.HUMIDIFICATION_SETPOINT,
63  min_humidity=10,
64  max_humidity=50,
65  default_humidity=30,
66  set_humidity_fn=coordinator.client.set_humidification_setpoint,
67  )
68  )
69 
70  if coordinator.data.get(Attribute.DEHUMIDIFICATION_AVAILABLE) in (0, 1):
71  descriptions.append(
73  key="dehumidifier",
74  translation_key="dehumidifier",
75  device_class=HumidifierDeviceClass.DEHUMIDIFIER,
76  action_key=Attribute.DEHUMIDIFICATION_STATUS,
77  action_map=DEHUMIDIFIER_ACTION_MAP,
78  current_humidity_key=Attribute.INDOOR_HUMIDITY_CONTROLLING_SENSOR_VALUE,
79  target_humidity_key=Attribute.DEHUMIDIFICATION_SETPOINT,
80  min_humidity=40,
81  max_humidity=90,
82  default_humidity=60,
83  set_humidity_fn=coordinator.client.set_dehumidification_setpoint,
84  )
85  )
86 
88  AprilaireHumidifierEntity(coordinator, description, config_entry.unique_id)
89  for description in descriptions
90  )
91 
92 
93 @dataclass(frozen=True, kw_only=True)
95  """Class describing Aprilaire humidifier entities."""
96 
97  action_key: str
98  action_map: dict[StateType, HumidifierAction]
99  current_humidity_key: str
100  target_humidity_key: str
101  min_humidity: int
102  max_humidity: int
103  default_humidity: int
104  set_humidity_fn: Callable[[int], Awaitable]
105 
106 
108  """Base humidity entity for Aprilaire."""
109 
110  entity_description: AprilaireHumidifierDescription
111  last_target_humidity: int | None = None
112 
113  def __init__(
114  self,
115  coordinator: AprilaireCoordinator,
116  description: AprilaireHumidifierDescription,
117  unique_id: str,
118  ) -> None:
119  """Initialize a select for an Aprilaire device."""
120 
121  self.entity_descriptionentity_description = description
122 
123  super().__init__(coordinator, unique_id)
124 
125  @property
126  def action(self) -> HumidifierAction | None:
127  """Get the current action."""
128 
129  action = self.coordinator.data.get(self.entity_descriptionentity_description.action_key)
130 
131  return self.entity_descriptionentity_description.action_map.get(action, HumidifierAction.OFF)
132 
133  @property
134  def is_on(self) -> bool:
135  """Get whether the humidifier is on."""
136 
137  return self.target_humiditytarget_humiditytarget_humidity is not None and self.target_humiditytarget_humiditytarget_humidity > 0
138 
139  @property
140  def current_humidity(self) -> float | None:
141  """Get the current humidity."""
142 
143  return cast(
144  float,
145  self.coordinator.data.get(self.entity_descriptionentity_description.current_humidity_key),
146  )
147 
148  @property
149  def target_humidity(self) -> float | None:
150  """Get the target humidity."""
151 
152  target_humidity = cast(
153  float,
154  self.coordinator.data.get(self.entity_descriptionentity_description.target_humidity_key),
155  )
156 
157  if target_humidity is not None and target_humidity > 0:
158  self.last_target_humiditylast_target_humidity = int(target_humidity)
159 
160  return target_humidity
161 
162  @property
163  def min_humidity(self) -> float:
164  """Return the minimum humidity."""
165 
166  return self.entity_descriptionentity_description.min_humidity
167 
168  @property
169  def max_humidity(self) -> float:
170  """Return the maximum humidity."""
171 
172  return self.entity_descriptionentity_description.max_humidity
173 
174  async def async_set_humidity(self, humidity: int) -> None:
175  """Set the humidity."""
176 
177  await self.entity_descriptionentity_description.set_humidity_fn(humidity)
178 
179  async def async_turn_on(self, **kwargs: Any) -> None:
180  """Turn the device on."""
181 
182  if self.last_target_humiditylast_target_humidity is None or self.last_target_humiditylast_target_humidity == 0:
183  target_humidity = self.entity_descriptionentity_description.default_humidity
184  else:
185  target_humidity = self.last_target_humiditylast_target_humidity
186 
187  await self.entity_descriptionentity_description.set_humidity_fn(target_humidity)
188 
189  async def async_turn_off(self, **kwargs: Any) -> None:
190  """Turn the device off."""
191 
192  await self.entity_descriptionentity_description.set_humidity_fn(0)
None __init__(self, AprilaireCoordinator coordinator, AprilaireHumidifierDescription description, str unique_id)
Definition: humidifier.py:118
None async_setup_entry(HomeAssistant hass, AprilaireConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: humidifier.py:44