ha_gehome/entities/common/ge_humidifier.py

105 lines
3.2 KiB
Python

import abc
import logging
from typing import Coroutine, Any, Optional
from homeassistant.components.humidifier import HumidifierEntity, HumidifierDeviceClass
from homeassistant.components.humidifier.const import HumidifierEntityFeature
from gehomesdk import ErdCodeType, ErdOnOff
from ...const import DOMAIN
from ...devices import ApplianceApi
from .ge_entity import GeEntity
DEFAULT_TARGET_PRECISION = 5
_LOGGER = logging.getLogger(__name__)
class GeHumidifier(GeEntity, HumidifierEntity, metaclass=abc.ABCMeta):
"""GE Humidifier Abstract Entity """
def __init__(
self,
api: ApplianceApi,
device_class: HumidifierDeviceClass,
power_status_erd_code: ErdCodeType,
target_humidity_erd_code: ErdCodeType,
current_humidity_erd_code: ErdCodeType,
range_min: int,
range_max: int,
target_precision = DEFAULT_TARGET_PRECISION
):
super().__init__(api)
self._device_class = device_class
self._power_status_erd_code = power_status_erd_code
self._target_humidity_erd_code = target_humidity_erd_code
self._current_humidity_erd_code = current_humidity_erd_code
self._range_min = range_min
self._range_max = range_max
self._target_precision = target_precision
@property
def unique_id(self) -> str:
return f"{DOMAIN}_{self.serial_or_mac}_{self._device_class}"
@property
def name(self) -> Optional[str]:
return f"{self.serial_or_mac} {self._device_class.title()}"
@property
def target_humidity(self) -> int | None:
return int(self.appliance.get_erd_value(self._target_humidity_erd_code))
@property
def current_humidity(self) -> int | None:
return int(self.appliance.get_erd_value(self._current_humidity_erd_code))
@property
def min_humidity(self) -> int:
return self._range_min
@property
def max_humidity(self) -> int:
return self._range_max
@property
def supported_features(self) -> HumidifierEntityFeature:
return HumidifierEntityFeature(HumidifierEntityFeature.MODES)
@property
def is_on(self) -> bool:
return self.appliance.get_erd_value(self._power_status_erd_code) == ErdOnOff.ON
@property
def device_class(self):
return self._device_class
async def async_set_humidity(self, humidity: int) -> Coroutine[Any, Any, None]:
# round to target precision
target = round(humidity / self._target_precision) * self._target_precision
# if it's the same, just exit
if self.target_humidity == target:
return
_LOGGER.debug(f"Setting Target Humidity from {self.target_humidity} to {target}")
# make sure we're on
if not self.is_on:
await self.async_turn_on()
# set the target humidity
await self.appliance.async_set_erd_value(
self._target_humidity_erd_code,
target,
)
async def async_turn_on(self):
await self.appliance.async_set_erd_value(
self._power_status_erd_code, ErdOnOff.ON
)
async def async_turn_off(self):
await self.appliance.async_set_erd_value(
self._power_status_erd_code, ErdOnOff.OFF
)