mirror of https://github.com/simbaja/ha_gehome.git
- removed target select
- added dehumidifier entity - sdk version bump
This commit is contained in:
parent
0d9cb8f934
commit
296f81dfb2
|
@ -15,8 +15,7 @@ from ..entities import (
|
||||||
GeErdPropertySensor,
|
GeErdPropertySensor,
|
||||||
GeErdSwitch,
|
GeErdSwitch,
|
||||||
ErdOnOffBoolConverter,
|
ErdOnOffBoolConverter,
|
||||||
DehumidifierTargetHumiditySelect,
|
GeDehumidifier
|
||||||
DehumidifierFanSettingOptionsConverter
|
|
||||||
)
|
)
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
@ -31,11 +30,12 @@ class DehumidifierApi(ApplianceApi):
|
||||||
|
|
||||||
dhum_entities = [
|
dhum_entities = [
|
||||||
GeErdSwitch(self, ErdCode.AC_POWER_STATUS, bool_converter=ErdOnOffBoolConverter(), icon_on_override="mdi:power-on", icon_off_override="mdi:power-off"),
|
GeErdSwitch(self, ErdCode.AC_POWER_STATUS, bool_converter=ErdOnOffBoolConverter(), icon_on_override="mdi:power-on", icon_off_override="mdi:power-off"),
|
||||||
GeErdSelect(self, ErdCode.AC_FAN_SETTING, DehumidifierFanSettingOptionsConverter(), icon_override="mdi:fan"),
|
GeErdSensor(self, ErdCode.AC_FAN_SETTING, icon_override="mdi:fan"),
|
||||||
GeErdSensor(self, ErdCode.DHUM_CURRENT_HUMIDITY, uom_override="%", icon_override="mdi:water-percent"),
|
GeErdSensor(self, ErdCode.DHUM_CURRENT_HUMIDITY),
|
||||||
DehumidifierTargetHumiditySelect(self, ErdCode.DHUM_TARGET_HUMIDITY, icon_override="mdi:water-percent"),
|
GeErdSensor(self, ErdCode.DHUM_TARGET_HUMIDITY),
|
||||||
GeErdPropertySensor(self, ErdCode.DHUM_MAINTENANCE, "empty_bucket", device_class_override="problem"),
|
GeErdPropertySensor(self, ErdCode.DHUM_MAINTENANCE, "empty_bucket", device_class_override="problem"),
|
||||||
GeErdPropertySensor(self, ErdCode.DHUM_MAINTENANCE, "clean_filter", device_class_override="problem")
|
GeErdPropertySensor(self, ErdCode.DHUM_MAINTENANCE, "clean_filter", device_class_override="problem"),
|
||||||
|
GeDehumidifier(self)
|
||||||
]
|
]
|
||||||
|
|
||||||
entities = base_entities + dhum_entities
|
entities = base_entities + dhum_entities
|
||||||
|
|
|
@ -13,4 +13,5 @@ from .ge_erd_button import GeErdButton
|
||||||
from .ge_erd_number import GeErdNumber
|
from .ge_erd_number import GeErdNumber
|
||||||
from .ge_water_heater import GeAbstractWaterHeater
|
from .ge_water_heater import GeAbstractWaterHeater
|
||||||
from .ge_erd_select import GeErdSelect
|
from .ge_erd_select import GeErdSelect
|
||||||
from .ge_climate import GeClimate
|
from .ge_climate import GeClimate
|
||||||
|
from .ge_humidifier import GeHumidifier
|
|
@ -145,5 +145,7 @@ class GeErdEntity(GeEntity):
|
||||||
return "mdi:water"
|
return "mdi:water"
|
||||||
if self.erd_code_class == ErdCodeClass.CCM_SENSOR:
|
if self.erd_code_class == ErdCodeClass.CCM_SENSOR:
|
||||||
return "mdi:coffee-maker"
|
return "mdi:coffee-maker"
|
||||||
|
if self.erd_code_class == ErdCodeClass.HUMIDITY:
|
||||||
|
return "mdi:water-percent"
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -9,6 +9,7 @@ from homeassistant.const import (
|
||||||
DEVICE_CLASS_TEMPERATURE,
|
DEVICE_CLASS_TEMPERATURE,
|
||||||
DEVICE_CLASS_BATTERY,
|
DEVICE_CLASS_BATTERY,
|
||||||
DEVICE_CLASS_POWER_FACTOR,
|
DEVICE_CLASS_POWER_FACTOR,
|
||||||
|
DEVICE_CLASS_HUMIDITY,
|
||||||
TEMP_FAHRENHEIT,
|
TEMP_FAHRENHEIT,
|
||||||
)
|
)
|
||||||
from gehomesdk import ErdCodeType, ErdCodeClass
|
from gehomesdk import ErdCodeType, ErdCodeClass
|
||||||
|
@ -111,6 +112,8 @@ class GeErdSensor(GeErdEntity, SensorEntity):
|
||||||
return "%"
|
return "%"
|
||||||
if self.device_class == DEVICE_CLASS_POWER_FACTOR:
|
if self.device_class == DEVICE_CLASS_POWER_FACTOR:
|
||||||
return "%"
|
return "%"
|
||||||
|
if self.erd_code_class == ErdCodeClass.HUMIDITY:
|
||||||
|
return "%"
|
||||||
if self.erd_code_class == ErdCodeClass.FLOW_RATE:
|
if self.erd_code_class == ErdCodeClass.FLOW_RATE:
|
||||||
#if self._measurement_system == ErdMeasurementUnits.METRIC:
|
#if self._measurement_system == ErdMeasurementUnits.METRIC:
|
||||||
# return "lpm"
|
# return "lpm"
|
||||||
|
@ -135,6 +138,8 @@ class GeErdSensor(GeErdEntity, SensorEntity):
|
||||||
return DEVICE_CLASS_POWER
|
return DEVICE_CLASS_POWER
|
||||||
if self.erd_code_class == ErdCodeClass.ENERGY:
|
if self.erd_code_class == ErdCodeClass.ENERGY:
|
||||||
return DEVICE_CLASS_ENERGY
|
return DEVICE_CLASS_ENERGY
|
||||||
|
if self.erd_code_class == ErdCodeClass.HUMIDITY:
|
||||||
|
return DEVICE_CLASS_HUMIDITY
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -144,7 +149,7 @@ class GeErdSensor(GeErdEntity, SensorEntity):
|
||||||
|
|
||||||
if self.device_class in [DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_ENERGY]:
|
if self.device_class in [DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_ENERGY]:
|
||||||
return SensorStateClass.MEASUREMENT
|
return SensorStateClass.MEASUREMENT
|
||||||
if self.erd_code_class in [ErdCodeClass.FLOW_RATE, ErdCodeClass.PERCENTAGE]:
|
if self.erd_code_class in [ErdCodeClass.FLOW_RATE, ErdCodeClass.PERCENTAGE, ErdCodeClass.HUMIDITY]:
|
||||||
return SensorStateClass.MEASUREMENT
|
return SensorStateClass.MEASUREMENT
|
||||||
if self.erd_code_class in [ErdCodeClass.LIQUID_VOLUME]:
|
if self.erd_code_class in [ErdCodeClass.LIQUID_VOLUME]:
|
||||||
return SensorStateClass.TOTAL_INCREASING
|
return SensorStateClass.TOTAL_INCREASING
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
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
|
||||||
|
from .options_converter import OptionsConverter
|
||||||
|
|
||||||
|
_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
|
||||||
|
):
|
||||||
|
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
|
||||||
|
|
||||||
|
@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]:
|
||||||
|
if self.target_humidity == humidity:
|
||||||
|
return
|
||||||
|
|
||||||
|
_LOGGER.debug(f"Setting Target Humidity from {self.target_humidity} to {humidity}")
|
||||||
|
|
||||||
|
# make sure we're on
|
||||||
|
if not self.is_on:
|
||||||
|
await self.async_turn_on()
|
||||||
|
|
||||||
|
# set the mode
|
||||||
|
await self.appliance.async_set_erd_value(
|
||||||
|
self.target_humidity_erd_code,
|
||||||
|
self.humidity,
|
||||||
|
)
|
||||||
|
|
||||||
|
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
|
||||||
|
)
|
|
@ -1,2 +1 @@
|
||||||
from .dehumidifier_target_select import DehumidifierTargetHumiditySelect
|
from .dehumidifier import GeDehumidifier
|
||||||
from .dehumidifier_fan_options import DehumidifierFanSettingOptionsConverter
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
SMART_DRY = "Smart Dry"
|
||||||
|
DEFAULT_MIN_HUMIDITY = 35
|
||||||
|
DEFAULT_MAX_HUMIDITY = 80
|
|
@ -0,0 +1,74 @@
|
||||||
|
"""GE Home Dehumidifier"""
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from homeassistant.components.humidifier import HumidifierDeviceClass
|
||||||
|
from homeassistant.components.humidifier.const import HumidifierEntityFeature
|
||||||
|
|
||||||
|
from gehomesdk import ErdCode, DehumidifierTargetRange
|
||||||
|
|
||||||
|
from ...devices import ApplianceApi
|
||||||
|
from ..common import GeHumidifier
|
||||||
|
from .const import *
|
||||||
|
from .dehumidifier_fan_options import DehumidifierFanSettingOptionsConverter
|
||||||
|
|
||||||
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
class GeDehumidifier(GeHumidifier):
|
||||||
|
"""GE Dehumidifier"""
|
||||||
|
|
||||||
|
icon = "mdi:air-humidifier"
|
||||||
|
|
||||||
|
def __init__(self, api: ApplianceApi):
|
||||||
|
|
||||||
|
#try to get the range
|
||||||
|
range: DehumidifierTargetRange = api.try_get_erd_value(ErdCode.DHUM_TARGET_HUMIDITY_RANGE)
|
||||||
|
low = DEFAULT_MIN_HUMIDITY if range is None else range.min_humidity
|
||||||
|
high = DEFAULT_MAX_HUMIDITY if range is None else range.max_humidity
|
||||||
|
|
||||||
|
#try to get the fan mode and determine feature
|
||||||
|
mode = api.try_get_erd_value(ErdCode.AC_FAN_SETTING)
|
||||||
|
self._has_fan = mode is not None
|
||||||
|
self._mode_converter = DehumidifierFanSettingOptionsConverter()
|
||||||
|
|
||||||
|
#initialize the dehumidifier
|
||||||
|
super().__init__(api,
|
||||||
|
HumidifierDeviceClass.DEHUMIDIFIER,
|
||||||
|
ErdCode.AC_POWER_STATUS,
|
||||||
|
ErdCode.DHUM_TARGET_HUMIDITY,
|
||||||
|
ErdCode.DHUM_CURRENT_HUMIDITY,
|
||||||
|
low,
|
||||||
|
high
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def supported_features(self) -> HumidifierEntityFeature:
|
||||||
|
if self._has_fan:
|
||||||
|
return HumidifierEntityFeature(HumidifierEntityFeature.MODES)
|
||||||
|
else:
|
||||||
|
return HumidifierEntityFeature(0)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def mode(self) -> str | None:
|
||||||
|
if not self._has_fan:
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
return self._mode_converter.to_option_string(
|
||||||
|
self.appliance.get_erd_value(ErdCode.AC_FAN_SETTING)
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def available_modes(self) -> list[str] | None:
|
||||||
|
if not self._has_fan:
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
return self._mode_converter.options
|
||||||
|
|
||||||
|
async def async_set_mode(self, mode: str) -> None:
|
||||||
|
if not self._has_fan:
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
"""Change the selected mode."""
|
||||||
|
_LOGGER.debug(f"Setting mode from {self.mode} to {mode}")
|
||||||
|
|
||||||
|
new_state = self._mode_converter.from_option_string(mode)
|
||||||
|
await self.appliance.async_set_erd_value(self.erd_code, new_state)
|
|
@ -3,16 +3,19 @@ from typing import List, Any, Optional
|
||||||
|
|
||||||
from gehomesdk import ErdAcFanSetting
|
from gehomesdk import ErdAcFanSetting
|
||||||
from ..common import OptionsConverter
|
from ..common import OptionsConverter
|
||||||
|
from .const import SMART_DRY
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
class DehumidifierFanSettingOptionsConverter(OptionsConverter):
|
class DehumidifierFanSettingOptionsConverter(OptionsConverter):
|
||||||
@property
|
@property
|
||||||
def options(self) -> List[str]:
|
def options(self) -> List[str]:
|
||||||
return [i.stringify() for i in [ErdAcFanSetting.DEFAULT, ErdAcFanSetting.LOW, ErdAcFanSetting.MED, ErdAcFanSetting.HIGH]]
|
return [SMART_DRY] + [i.stringify() for i in [ErdAcFanSetting.LOW, ErdAcFanSetting.MED, ErdAcFanSetting.HIGH]]
|
||||||
|
|
||||||
def from_option_string(self, value: str) -> Any:
|
def from_option_string(self, value: str) -> Any:
|
||||||
try:
|
try:
|
||||||
|
if value == SMART_DRY:
|
||||||
|
return ErdAcFanSetting.DEFAULT
|
||||||
return ErdAcFanSetting[value.upper()]
|
return ErdAcFanSetting[value.upper()]
|
||||||
except:
|
except:
|
||||||
_LOGGER.warn(f"Could not set fan setting to {value.upper()}")
|
_LOGGER.warn(f"Could not set fan setting to {value.upper()}")
|
||||||
|
@ -20,7 +23,7 @@ class DehumidifierFanSettingOptionsConverter(OptionsConverter):
|
||||||
def to_option_string(self, value: ErdAcFanSetting) -> Optional[str]:
|
def to_option_string(self, value: ErdAcFanSetting) -> Optional[str]:
|
||||||
try:
|
try:
|
||||||
if value is not None:
|
if value is not None:
|
||||||
return value.stringify()
|
return SMART_DRY if value == ErdAcFanSetting.DEFAULT else value.stringify()
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
return ErdAcFanSetting.DEFAULT.stringify()
|
return SMART_DRY
|
||||||
|
|
|
@ -1,55 +0,0 @@
|
||||||
import logging
|
|
||||||
from typing import List, Any, Optional
|
|
||||||
|
|
||||||
from gehomesdk import ErdCodeType, DehumidifierTargetRange
|
|
||||||
from ...devices import ApplianceApi
|
|
||||||
from ..common import GeErdSelect, OptionsConverter
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
DEFAULT_MIN_HUMIDITY = 35
|
|
||||||
DEFAULT_MAX_HUMIDITY = 80
|
|
||||||
|
|
||||||
class DehumidifierTargetOptionsConverter(OptionsConverter):
|
|
||||||
def __init__(self, min = DEFAULT_MIN_HUMIDITY, max = DEFAULT_MAX_HUMIDITY) -> None:
|
|
||||||
super().__init__()
|
|
||||||
self._min = min
|
|
||||||
self._max = max
|
|
||||||
|
|
||||||
@property
|
|
||||||
def options(self) -> List[str]:
|
|
||||||
return [str(i) for i in range(min,max) if i % 5 == 0]
|
|
||||||
|
|
||||||
def from_option_string(self, value: str) -> Any:
|
|
||||||
return int(value)
|
|
||||||
def to_option_string(self, value: int) -> Optional[str]:
|
|
||||||
try:
|
|
||||||
if value is not None:
|
|
||||||
return str(value)
|
|
||||||
except:
|
|
||||||
return self._min
|
|
||||||
|
|
||||||
class DehumidifierTargetHumiditySelect(GeErdSelect):
|
|
||||||
|
|
||||||
def __init__(self, api: ApplianceApi, erd_code: ErdCodeType, erd_override: str = None):
|
|
||||||
self._low = DEFAULT_MIN_HUMIDITY
|
|
||||||
self._high = DEFAULT_MAX_HUMIDITY
|
|
||||||
|
|
||||||
#try to get the range
|
|
||||||
value: DehumidifierTargetRange = api.try_get_erd_value(erd_code)
|
|
||||||
if value is not None:
|
|
||||||
self._low = value.min_humidity
|
|
||||||
self._high = value.max_humidity
|
|
||||||
|
|
||||||
super().__init__(api, erd_code, DehumidifierTargetOptionsConverter(self._low, self._high), erd_override=erd_override)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def current_option(self):
|
|
||||||
return self._converter.to_option_string(self.appliance.get_erd_value(self.erd_code))
|
|
||||||
|
|
||||||
async def async_select_option(self, option: str) -> None:
|
|
||||||
"""Change the selected option."""
|
|
||||||
_LOGGER.debug(f"Setting select from {self.current_option} to {option}")
|
|
||||||
|
|
||||||
new_state = self._converter.from_option_string(option)
|
|
||||||
await self.appliance.async_set_erd_value(self.erd_code, new_state)
|
|
|
@ -5,7 +5,7 @@
|
||||||
"integration_type": "hub",
|
"integration_type": "hub",
|
||||||
"iot_class": "cloud_push",
|
"iot_class": "cloud_push",
|
||||||
"documentation": "https://github.com/simbaja/ha_gehome",
|
"documentation": "https://github.com/simbaja/ha_gehome",
|
||||||
"requirements": ["gehomesdk==0.5.17","magicattr==0.1.6","slixmpp==1.8.3"],
|
"requirements": ["gehomesdk==0.5.18","magicattr==0.1.6","slixmpp==1.8.3"],
|
||||||
"codeowners": ["@simbaja"],
|
"codeowners": ["@simbaja"],
|
||||||
"version": "0.6.8"
|
"version": "0.6.8"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue