126 lines
4.0 KiB
Python
126 lines
4.0 KiB
Python
"""Adds dehumidifer entity for each dehumidifer appliance."""
|
|
|
|
import logging
|
|
from typing import Final
|
|
|
|
from homeassistant.components.humidifier import HumidifierDeviceClass, HumidifierEntity
|
|
from homeassistant.components.humidifier.const import HumidifierEntityFeature
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|
|
|
from custom_components.midea_dehumidifier_lan.const import (
|
|
ATTR_RUNNING,
|
|
DOMAIN,
|
|
MAX_TARGET_HUMIDITY,
|
|
MIN_TARGET_HUMIDITY,
|
|
)
|
|
from custom_components.midea_dehumidifier_lan.appliance_coordinator import (
|
|
ApplianceEntity,
|
|
ApplianceUpdateCoordinator,
|
|
)
|
|
from custom_components.midea_dehumidifier_lan.hub import Hub
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
MODE_SET: Final = "Set"
|
|
MODE_DRY: Final = "Dry"
|
|
MODE_SMART: Final = "Smart"
|
|
MODE_CONTINOUS: Final = "Continuous"
|
|
MODE_PURIFIER: Final = "Purifier"
|
|
MODE_ANTIMOULD: Final = "Antimould"
|
|
MODE_FAN: Final = "Fan"
|
|
|
|
ENTITY_ID_FORMAT = DOMAIN + ".{}"
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant,
|
|
config_entry: ConfigEntry,
|
|
async_add_entities: AddEntitiesCallback,
|
|
) -> None:
|
|
"""Sets up dehumidifier entites"""
|
|
hub: Hub = hass.data[DOMAIN][config_entry.entry_id]
|
|
|
|
async_add_entities(
|
|
DehumidifierEntity(c) for c in hub.coordinators if c.is_dehumidifier()
|
|
)
|
|
|
|
|
|
_MODES = [
|
|
(1, MODE_SET),
|
|
(2, MODE_CONTINOUS),
|
|
(3, MODE_SMART),
|
|
(4, MODE_DRY),
|
|
(6, MODE_PURIFIER),
|
|
(7, MODE_ANTIMOULD),
|
|
]
|
|
|
|
_MODES_FROM_CAPABILITY = {
|
|
1: [MODE_PURIFIER],
|
|
2: [MODE_ANTIMOULD],
|
|
3: [MODE_PURIFIER, MODE_ANTIMOULD],
|
|
4: [MODE_FAN],
|
|
}
|
|
|
|
|
|
# pylint: disable=too-many-ancestors,too-many-instance-attributes
|
|
class DehumidifierEntity(ApplianceEntity, HumidifierEntity):
|
|
"""(de)Humidifer entity for Midea dehumidifier"""
|
|
|
|
_attr_device_class = HumidifierDeviceClass.DEHUMIDIFIER
|
|
_attr_max_humidity = MAX_TARGET_HUMIDITY
|
|
_attr_min_humidity = MIN_TARGET_HUMIDITY
|
|
_attr_supported_features = HumidifierEntityFeature.MODES
|
|
_name_suffix = ""
|
|
_add_extra_attrs = True
|
|
|
|
def __init__(self, coordinator: ApplianceUpdateCoordinator) -> None:
|
|
super().__init__(coordinator)
|
|
|
|
self._attr_mode = None
|
|
self._attr_available_modes = [MODE_SET]
|
|
|
|
def on_online(self, update: bool) -> None:
|
|
capabilities = self.coordinator.appliance.state.capabilities
|
|
|
|
self._attr_available_modes = [MODE_SET]
|
|
if capabilities.get("auto"):
|
|
self._attr_available_modes.append(MODE_SMART)
|
|
self._attr_available_modes.append(MODE_CONTINOUS)
|
|
if capabilities.get("dry_clothes"):
|
|
self._attr_available_modes.append(MODE_DRY)
|
|
|
|
more_modes = capabilities.get("mode", 0)
|
|
self._attr_available_modes += _MODES_FROM_CAPABILITY.get(more_modes, [])
|
|
|
|
super().on_online(update)
|
|
|
|
def on_update(self) -> None:
|
|
dehumi = self.dehumidifier()
|
|
self._attr_mode = next((i[1] for i in _MODES if i[0] == dehumi.mode), MODE_SET)
|
|
self._attr_target_humidity = dehumi.target_humidity
|
|
self._attr_current_humidity = dehumi.current_humidity # add new attribute current_humidity
|
|
self._attr_is_on = dehumi.running
|
|
super().on_update()
|
|
|
|
def turn_on(self, **kwargs) -> None: # pylint: disable=unused-argument
|
|
"""Turn the entity on."""
|
|
self.apply(ATTR_RUNNING, True)
|
|
|
|
def turn_off(self, **kwargs) -> None: # pylint: disable=unused-argument
|
|
"""Turn the entity off."""
|
|
self.apply(ATTR_RUNNING, False)
|
|
|
|
def set_mode(self, mode) -> None:
|
|
"""Set new target preset mode."""
|
|
midea_mode = next((i[0] for i in _MODES if i[1] == mode), None)
|
|
if midea_mode is None:
|
|
_LOGGER.debug("Unsupported dehumidifer mode %s", mode)
|
|
midea_mode = 1
|
|
self.apply("mode", midea_mode)
|
|
|
|
def set_humidity(self, humidity) -> None:
|
|
"""Set new target humidity."""
|
|
self.apply("target_humidity", humidity)
|