1 """Provides functionality to interact with humidifier devices."""
3 from __future__
import annotations
5 from datetime
import timedelta
6 from enum
import StrEnum
7 from functools
import partial
9 from typing
import Any, final
11 from propcache
import cached_property
12 import voluptuous
as vol
26 all_with_deprecated_constants,
27 check_if_deprecated_constant,
28 dir_with_deprecated_constants,
37 _DEPRECATED_DEVICE_CLASS_DEHUMIDIFIER,
38 _DEPRECATED_DEVICE_CLASS_HUMIDIFIER,
39 _DEPRECATED_SUPPORT_MODES,
42 ATTR_CURRENT_HUMIDITY,
61 HumidifierEntityFeature,
64 _LOGGER = logging.getLogger(__name__)
66 DATA_COMPONENT: HassKey[EntityComponent[HumidifierEntity]] =
HassKey(DOMAIN)
67 ENTITY_ID_FORMAT = DOMAIN +
".{}"
68 PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA
69 PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE
74 """Device class for humidifiers."""
76 HUMIDIFIER =
"humidifier"
77 DEHUMIDIFIER =
"dehumidifier"
80 DEVICE_CLASSES_SCHEMA = vol.All(vol.Lower, vol.Coerce(HumidifierDeviceClass))
84 DEVICE_CLASSES = [cls.value
for cls
in HumidifierDeviceClass]
90 def is_on(hass: HomeAssistant, entity_id: str) -> bool:
91 """Return if the humidifier is on based on the statemachine.
95 return hass.states.is_state(entity_id, STATE_ON)
98 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
99 """Set up humidifier devices."""
100 component = hass.data[DATA_COMPONENT] = EntityComponent[HumidifierEntity](
101 _LOGGER, DOMAIN, hass, SCAN_INTERVAL
103 await component.async_setup(config)
105 component.async_register_entity_service(SERVICE_TURN_ON,
None,
"async_turn_on")
106 component.async_register_entity_service(SERVICE_TURN_OFF,
None,
"async_turn_off")
107 component.async_register_entity_service(SERVICE_TOGGLE,
None,
"async_toggle")
108 component.async_register_entity_service(
110 {vol.Required(ATTR_MODE): cv.string},
112 [HumidifierEntityFeature.MODES],
114 component.async_register_entity_service(
115 SERVICE_SET_HUMIDITY,
117 vol.Required(ATTR_HUMIDITY): vol.All(
118 vol.Coerce(int), vol.Range(min=0, max=100)
121 async_service_humidity_set,
128 """Set up a config entry."""
133 """Unload a config entry."""
138 """A class that describes humidifier entities."""
140 device_class: HumidifierDeviceClass |
None =
None
143 CACHED_PROPERTIES_WITH_ATTR_ = {
152 "supported_features",
157 """Base class for humidifier entities."""
159 _entity_component_unrecorded_attributes = frozenset(
160 {ATTR_MIN_HUMIDITY, ATTR_MAX_HUMIDITY, ATTR_AVAILABLE_MODES}
163 entity_description: HumidifierEntityDescription
164 _attr_action: HumidifierAction |
None =
None
165 _attr_available_modes: list[str] |
None
166 _attr_current_humidity: float |
None =
None
167 _attr_device_class: HumidifierDeviceClass |
None
168 _attr_max_humidity: float = DEFAULT_MAX_HUMIDITY
169 _attr_min_humidity: float = DEFAULT_MIN_HUMIDITY
170 _attr_mode: str |
None
172 _attr_target_humidity: float |
None =
None
176 """Return capability attributes."""
177 data: dict[str, Any] = {
189 """Return the class of this entity."""
190 if hasattr(self,
"_attr_device_class"):
191 return self._attr_device_class
192 if hasattr(self,
"entity_description"):
193 return self.entity_description.device_class
199 """Return the optional state attributes."""
200 data: dict[str, Any] = {}
202 if self.
actionaction
is not None:
203 data[ATTR_ACTION] = self.
actionaction
if self.
is_onis_on
else HumidifierAction.OFF
212 data[ATTR_MODE] = self.
modemode
217 def action(self) -> HumidifierAction | None:
218 """Return the current action."""
219 return self._attr_action
223 """Return the current humidity."""
224 return self._attr_current_humidity
228 """Return the humidity we try to reach."""
229 return self._attr_target_humidity
233 """Return the current mode, e.g., home, auto, baby.
235 Requires HumidifierEntityFeature.MODES.
237 return self._attr_mode
241 """Return a list of available modes.
243 Requires HumidifierEntityFeature.MODES.
245 return self._attr_available_modes
248 """Set new target humidity."""
249 raise NotImplementedError
252 """Set new target humidity."""
253 await self.
hasshass.async_add_executor_job(self.
set_humidityset_humidity, humidity)
257 raise NotImplementedError
261 await self.
hasshass.async_add_executor_job(self.
set_modeset_mode, mode)
265 """Return the minimum humidity."""
266 return self._attr_min_humidity
270 """Return the maximum humidity."""
271 return self._attr_max_humidity
275 """Return the list of supported features."""
276 return self._attr_supported_features
280 """Return the supported features as HumidifierEntityFeature.
282 Remove this compatibility shim in 2025.1 or later.
285 if type(features)
is int:
293 entity: HumidifierEntity, service_call: ServiceCall
295 """Handle set humidity service."""
296 humidity = service_call.data[ATTR_HUMIDITY]
297 min_humidity = entity.min_humidity
298 max_humidity = entity.max_humidity
300 "Check valid humidity %d in range %d - %d",
305 if humidity < min_humidity
or humidity > max_humidity:
307 translation_domain=DOMAIN,
308 translation_key=
"humidity_out_of_range",
309 translation_placeholders={
310 "humidity":
str(humidity),
311 "min_humidity":
str(min_humidity),
312 "max_humidity":
str(max_humidity),
316 await entity.async_set_humidity(humidity)
322 __getattr__ = partial(check_if_deprecated_constant, module_globals=globals())
324 dir_with_deprecated_constants, module_globals_keys=[*globals().keys()]
None set_humidity(self, int humidity)
list[str]|None available_modes(self)
None async_set_mode(self, str mode)
HumidifierEntityFeature supported_features_compat(self)
dict[str, Any] state_attributes(self)
None set_mode(self, str mode)
HumidifierEntityFeature supported_features(self)
float|None current_humidity(self)
HumidifierAction|None action(self)
HumidifierDeviceClass|None device_class(self)
dict[str, Any] capability_attributes(self)
None async_set_humidity(self, int humidity)
float|None target_humidity(self)
None _report_deprecated_supported_features_values(self, IntFlag replacement)
int|None supported_features(self)
None async_service_humidity_set(HumidifierEntity entity, ServiceCall service_call)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
bool async_setup(HomeAssistant hass, ConfigType config)
bool is_on(HomeAssistant hass, str entity_id)
list[str] all_with_deprecated_constants(dict[str, Any] module_globals)