191 lines
5.8 KiB
Python
191 lines
5.8 KiB
Python
"""Support for Yandex Smart Home humidifier."""
|
|
import logging
|
|
from typing import Any
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components.climate.const import SUPPORT_TARGET_HUMIDITY
|
|
from homeassistant.components.humidifier import HumidifierEntity
|
|
from homeassistant.const import ATTR_STATE
|
|
from homeassistant.helpers import entity_platform
|
|
import homeassistant.helpers.config_validation as cv
|
|
|
|
from . import CONF_INCLUDE, DATA_CONFIG, DOMAIN, YandexQuasar
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
SERVICE_MUTE = "mute"
|
|
SERVICE_IONIZATION = "ionization"
|
|
SERVICE_BACKLIGHT = "backlight"
|
|
|
|
HUMIDIFIER_STATE_USER_SCHEMA = {vol.Required(ATTR_STATE): cv.boolean}
|
|
|
|
|
|
DEVICES = ["devices.types.humidifier"]
|
|
|
|
|
|
async def async_setup_entry(hass, entry, async_add_entities):
|
|
"""Set up humidifier from a config entry."""
|
|
include = hass.data[DOMAIN][DATA_CONFIG][CONF_INCLUDE]
|
|
quasar = hass.data[DOMAIN][entry.unique_id]
|
|
devices = [
|
|
YandexHumidifier(quasar, device)
|
|
for device in quasar.devices
|
|
if device["name"] in include and device["type"] in DEVICES
|
|
]
|
|
|
|
platform = entity_platform.async_get_current_platform()
|
|
platform.async_register_entity_service(
|
|
SERVICE_MUTE, HUMIDIFIER_STATE_USER_SCHEMA, "mute"
|
|
)
|
|
platform.async_register_entity_service(
|
|
SERVICE_IONIZATION, HUMIDIFIER_STATE_USER_SCHEMA, "ionization"
|
|
)
|
|
platform.async_register_entity_service(
|
|
SERVICE_BACKLIGHT, HUMIDIFIER_STATE_USER_SCHEMA, "backlight"
|
|
)
|
|
|
|
async_add_entities(devices, True)
|
|
|
|
|
|
# noinspection PyAbstractClass
|
|
class YandexHumidifier(HumidifierEntity):
|
|
"""Yandex Home humidifier entity"""
|
|
_is_on = None
|
|
_min_humidity = None
|
|
_max_humidity = None
|
|
_target_humidity = None
|
|
_precision = None
|
|
_is_muted = None
|
|
_is_ionization_on = None
|
|
_is_backlight_on = None
|
|
_supported = 0
|
|
|
|
def __init__(self, quasar: YandexQuasar, device: dict) -> None:
|
|
"""Initialize entity."""
|
|
self.quasar = quasar
|
|
self.device = device
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return entity unique id."""
|
|
return self.device["id"].replace("-", "")
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return entity name."""
|
|
return self.device["name"]
|
|
|
|
@property
|
|
def is_on(self) -> bool:
|
|
"""Return if device is turned on."""
|
|
return self._is_on
|
|
|
|
@property
|
|
def min_humidity(self) -> int:
|
|
"""Return min humidity."""
|
|
return self._min_humidity
|
|
|
|
@property
|
|
def max_humidity(self) -> int:
|
|
"""Return max humidity."""
|
|
return self._max_humidity
|
|
|
|
@property
|
|
def precision(self) -> int:
|
|
"""Return target humidity precision."""
|
|
return self._precision
|
|
|
|
@property
|
|
def target_humidity(self) -> int:
|
|
"""Return target humidity."""
|
|
return self._target_humidity
|
|
|
|
@property
|
|
def is_muted(self) -> bool:
|
|
"""Return if device is muted."""
|
|
return self._is_muted
|
|
|
|
@property
|
|
def is_ionization_on(self) -> bool:
|
|
"""Return if ionization is turned on."""
|
|
return self._is_ionization_on
|
|
|
|
@property
|
|
def is_backlight_on(self) -> bool:
|
|
"""Return if backlight is turned on."""
|
|
return self._is_backlight_on
|
|
|
|
@property
|
|
def supported_features(self):
|
|
"""Return supported features."""
|
|
return self._supported
|
|
|
|
@property
|
|
def extra_state_attributes(self) -> dict[str, Any]:
|
|
"""Return the device specific state attributes."""
|
|
attributes = {
|
|
"is_muted": self.is_muted,
|
|
"is_ionization_on": self.is_ionization_on,
|
|
"is_backlight_on": self.is_backlight_on,
|
|
}
|
|
return attributes
|
|
|
|
async def init_params(self, capabilities: dict):
|
|
"""Initialize parameters."""
|
|
for capability in capabilities:
|
|
parameters = capability["parameters"]
|
|
instance = parameters.get("instance")
|
|
if instance == "humidity":
|
|
self._supported |= SUPPORT_TARGET_HUMIDITY
|
|
range_ = parameters["range"]
|
|
self._min_humidity = range_["min"]
|
|
self._max_humidity = range_["max"]
|
|
self._precision = range_["precision"]
|
|
|
|
async def async_update(self):
|
|
"""Update the entity."""
|
|
data = await self.quasar.get_device(self.device["id"])
|
|
if self._is_on is None:
|
|
await self.init_params(data["capabilities"])
|
|
|
|
for capability in data["capabilities"]:
|
|
if not capability["retrievable"]:
|
|
continue
|
|
instance = capability["state"]["instance"]
|
|
value = capability["state"]["value"]
|
|
if instance == "on":
|
|
self._is_on = value
|
|
if instance == "humidity":
|
|
self._target_humidity = value
|
|
if instance == "mute":
|
|
self._is_muted = value
|
|
if instance == "ionization":
|
|
self._is_ionization_on = value
|
|
if instance == "backlight":
|
|
self._is_backlight_on = value
|
|
|
|
async def async_turn_on(self, **kwargs):
|
|
"""Turn on."""
|
|
await self.quasar.device_action(self.device["id"], on=True)
|
|
|
|
async def async_turn_off(self, **kwargs):
|
|
"""Turn off."""
|
|
await self.quasar.device_action(self.device["id"], on=False)
|
|
|
|
async def async_set_humidity(self, humidity):
|
|
"""Set humidity."""
|
|
await self.quasar.device_action(self.device["id"], humidity=humidity)
|
|
|
|
async def mute(self, state):
|
|
"""Mute humidifier."""
|
|
await self.quasar.device_action(self.device["id"], mute=state)
|
|
|
|
async def ionization(self, state):
|
|
"""Turn on/off ionization."""
|
|
await self.quasar.device_action(self.device["id"], ionization=state)
|
|
|
|
async def backlight(self, state):
|
|
"""Turn on/off backlight."""
|
|
await self.quasar.device_action(self.device["id"], backlight=state)
|