core/homeassistant/components/honeywell/humidifier.py

137 lines
4.9 KiB
Python

"""Support for Honeywell (de)humidifiers."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from typing import Any
from aiosomecomfort.device import Device
from homeassistant.components.humidifier import (
HumidifierDeviceClass,
HumidifierEntity,
HumidifierEntityDescription,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import HoneywellConfigEntry
from .const import DOMAIN
HUMIDIFIER_KEY = "humidifier"
DEHUMIDIFIER_KEY = "dehumidifier"
@dataclass(frozen=True, kw_only=True)
class HoneywellHumidifierEntityDescription(HumidifierEntityDescription):
"""Describes a Honeywell humidifier entity."""
current_humidity: Callable[[Device], Any]
current_set_humidity: Callable[[Device], Any]
max_humidity: Callable[[Device], Any]
min_humidity: Callable[[Device], Any]
set_humidity: Callable[[Device, Any], Any]
mode: Callable[[Device], Any]
off: Callable[[Device], Any]
on: Callable[[Device], Any]
HUMIDIFIERS: dict[str, HoneywellHumidifierEntityDescription] = {
"Humidifier": HoneywellHumidifierEntityDescription(
key=HUMIDIFIER_KEY,
translation_key=HUMIDIFIER_KEY,
current_humidity=lambda device: device.current_humidity,
set_humidity=lambda device, humidity: device.set_humidifier_setpoint(humidity),
min_humidity=lambda device: device.humidifier_lower_limit,
max_humidity=lambda device: device.humidifier_upper_limit,
current_set_humidity=lambda device: device.humidifier_setpoint,
mode=lambda device: device.humidifier_mode,
off=lambda device: device.set_humidifier_off(),
on=lambda device: device.set_humidifier_auto(),
device_class=HumidifierDeviceClass.HUMIDIFIER,
),
"Dehumidifier": HoneywellHumidifierEntityDescription(
key=DEHUMIDIFIER_KEY,
translation_key=DEHUMIDIFIER_KEY,
current_humidity=lambda device: device.current_humidity,
set_humidity=lambda device, humidity: device.set_dehumidifier_setpoint(
humidity
),
min_humidity=lambda device: device.dehumidifier_lower_limit,
max_humidity=lambda device: device.dehumidifier_upper_limit,
current_set_humidity=lambda device: device.dehumidifier_setpoint,
mode=lambda device: device.dehumidifier_mode,
off=lambda device: device.set_dehumidifier_off(),
on=lambda device: device.set_dehumidifier_auto(),
device_class=HumidifierDeviceClass.DEHUMIDIFIER,
),
}
async def async_setup_entry(
hass: HomeAssistant,
config_entry: HoneywellConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up Honeywell (de)humidifier dynamically."""
data = config_entry.runtime_data
entities: list = []
for device in data.devices.values():
if device.has_humidifier:
entities.append(HoneywellHumidifier(device, HUMIDIFIERS["Humidifier"]))
if device.has_dehumidifier:
entities.append(HoneywellHumidifier(device, HUMIDIFIERS["Dehumidifier"]))
async_add_entities(entities)
class HoneywellHumidifier(HumidifierEntity):
"""Representation of a Honeywell US (De)Humidifier."""
entity_description: HoneywellHumidifierEntityDescription
_attr_has_entity_name = True
def __init__(
self, device: Device, description: HoneywellHumidifierEntityDescription
) -> None:
"""Initialize the (De)Humidifier."""
self._device = device
self.entity_description = description
self._attr_unique_id = f"{device.deviceid}_{description.key}"
self._attr_min_humidity = description.min_humidity(device)
self._attr_max_humidity = description.max_humidity(device)
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, device.deviceid)},
name=device.name,
manufacturer="Honeywell",
)
@property
def is_on(self) -> bool:
"""Return the device is on or off."""
return self.entity_description.mode(self._device) != 0
@property
def target_humidity(self) -> int | None:
"""Return the humidity we try to reach."""
return self.entity_description.current_set_humidity(self._device)
@property
def current_humidity(self) -> int | None:
"""Return the current humidity."""
return self.entity_description.current_humidity(self._device)
async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn the device on."""
await self.entity_description.on(self._device)
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn the device off."""
await self.entity_description.off(self._device)
async def async_set_humidity(self, humidity: int) -> None:
"""Set new target humidity."""
await self.entity_description.set_humidity(self._device, humidity)