Many air conditioner fixes for #52
This commit is contained in:
		| @ -1,6 +1,8 @@ | ||||
| import logging | ||||
| from dataclasses import dataclass | ||||
|  | ||||
| from pyhon import Hon | ||||
|  | ||||
| from homeassistant.components.binary_sensor import ( | ||||
|     BinarySensorEntityDescription, | ||||
|     BinarySensorDeviceClass, | ||||
| @ -8,8 +10,6 @@ from homeassistant.components.binary_sensor import ( | ||||
| ) | ||||
| from homeassistant.config_entries import ConfigEntry | ||||
| from homeassistant.core import callback | ||||
| from pyhon import Hon | ||||
|  | ||||
| from .const import DOMAIN | ||||
| from .hon import HonCoordinator, HonEntity, unique_entities | ||||
|  | ||||
| @ -179,6 +179,20 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             translation_key="door_open", | ||||
|         ), | ||||
|     ), | ||||
|     "AC": ( | ||||
|         HonBinarySensorEntityDescription( | ||||
|             key="filterChangeStatusLocal", | ||||
|             name="Filter Replacement", | ||||
|             device_class=BinarySensorDeviceClass.PROBLEM, | ||||
|             on_value="1", | ||||
|             translation_key="filter_replacement", | ||||
|         ), | ||||
|         HonBinarySensorEntityDescription( | ||||
|             key="ch2oCleaningStatus", | ||||
|             name="Ch2O Cleaning", | ||||
|             on_value="1", | ||||
|         ), | ||||
|     ), | ||||
|     "REF": ( | ||||
|         HonBinarySensorEntityDescription( | ||||
|             key="quickModeZ2", | ||||
|  | ||||
| @ -1,5 +1,8 @@ | ||||
| import logging | ||||
|  | ||||
| from pyhon import Hon | ||||
| from pyhon.appliance import HonAppliance | ||||
|  | ||||
| from homeassistant.components.climate import ( | ||||
|     ClimateEntity, | ||||
|     ClimateEntityDescription, | ||||
| @ -20,9 +23,6 @@ from homeassistant.const import ( | ||||
|     TEMP_CELSIUS, | ||||
| ) | ||||
| from homeassistant.core import callback | ||||
| from pyhon import Hon | ||||
| from pyhon.appliance import HonAppliance | ||||
|  | ||||
| from .const import HON_HVAC_MODE, HON_FAN, HON_HVAC_PROGRAM, DOMAIN | ||||
| from .hon import HonEntity, HonCoordinator | ||||
|  | ||||
| @ -107,6 +107,7 @@ class HonClimateEntity(HonEntity, ClimateEntity): | ||||
|             ] | ||||
|             await self._device.commands["startProgram"].send() | ||||
|         self._attr_hvac_mode = hvac_mode | ||||
|         self.async_write_ha_state() | ||||
|  | ||||
|     async def async_set_fan_mode(self, fan_mode): | ||||
|         mode_number = list(HON_FAN.values()).index(fan_mode) | ||||
| @ -114,6 +115,7 @@ class HonClimateEntity(HonEntity, ClimateEntity): | ||||
|             mode_number | ||||
|         ] | ||||
|         await self._device.commands["settings"].send() | ||||
|         self.async_write_ha_state() | ||||
|  | ||||
|     async def async_set_swing_mode(self, swing_mode): | ||||
|         horizontal = self._device.settings["settings.windDirectionHorizontal"] | ||||
| @ -128,29 +130,29 @@ class HonClimateEntity(HonEntity, ClimateEntity): | ||||
|             horizontal.value = "0" | ||||
|         self._attr_swing_mode = swing_mode | ||||
|         await self._device.commands["settings"].send() | ||||
|         self.async_write_ha_state() | ||||
|  | ||||
|     async def async_set_temperature(self, **kwargs): | ||||
|         if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None: | ||||
|             return False | ||||
|         self._device.settings["settings.tempSel"].value = int(temperature) | ||||
|         self._device.settings["settings.tempSel"].value = str(int(temperature)) | ||||
|         await self._device.commands["settings"].send() | ||||
|         self.async_write_ha_state() | ||||
|  | ||||
|     @callback | ||||
|     def _handle_coordinator_update(self, update=True) -> None: | ||||
|         self._attr_target_temperature = int(float(self._device.get("tempSel"))) | ||||
|         self._attr_current_temperature = float(self._device.get("tempIndoor")) | ||||
|         self._attr_max_temp = self._device.settings["settings.tempSel"].max | ||||
|         self._attr_min_temp = self._device.settings["settings.tempSel"].min | ||||
|  | ||||
|         if self._device.get("onOffStatus") == "0": | ||||
|             self._attr_hvac_mode = HVACMode.OFF | ||||
|         else: | ||||
|             self._attr_hvac_mode = HON_HVAC_MODE[self._device.get("machMode") or "0"] | ||||
|  | ||||
|         self._attr_fan_mode = HON_FAN[self._device.settings["settings.windSpeed"].value] | ||||
|         self._attr_fan_mode = HON_FAN[self._device.get("windSpeed")] | ||||
|  | ||||
|         horizontal = self._device.settings["settings.windDirectionHorizontal"] | ||||
|         vertical = self._device.settings["settings.windDirectionVertical"] | ||||
|         horizontal = self._device.get("windDirectionHorizontal") | ||||
|         vertical = self._device.get("windDirectionVertical") | ||||
|         if horizontal == "7" and vertical == "8": | ||||
|             self._attr_swing_mode = SWING_BOTH | ||||
|         elif horizontal == "7": | ||||
| @ -159,3 +161,4 @@ class HonClimateEntity(HonEntity, ClimateEntity): | ||||
|             self._attr_swing_mode = SWING_VERTICAL | ||||
|         else: | ||||
|             self._attr_swing_mode = SWING_OFF | ||||
|         self.async_write_ha_state() | ||||
|  | ||||
| @ -1,9 +1,9 @@ | ||||
| import logging | ||||
|  | ||||
| import voluptuous as vol | ||||
|  | ||||
| from homeassistant import config_entries | ||||
| from homeassistant.const import CONF_EMAIL, CONF_PASSWORD | ||||
|  | ||||
| from .const import DOMAIN | ||||
|  | ||||
| _LOGGER = logging.getLogger(__name__) | ||||
|  | ||||
| @ -21,7 +21,7 @@ PLATFORMS = [ | ||||
| HON_HVAC_MODE = { | ||||
|     "0": HVACMode.AUTO, | ||||
|     "1": HVACMode.COOL, | ||||
|     "2": HVACMode.COOL, | ||||
|     "2": HVACMode.DRY, | ||||
|     "3": HVACMode.DRY, | ||||
|     "4": HVACMode.HEAT, | ||||
|     "5": HVACMode.FAN_ONLY, | ||||
|  | ||||
| @ -1,11 +1,11 @@ | ||||
| import logging | ||||
| from datetime import timedelta | ||||
|  | ||||
| from pyhon.appliance import HonAppliance | ||||
|  | ||||
| from homeassistant.helpers.entity import DeviceInfo | ||||
| from homeassistant.helpers.update_coordinator import CoordinatorEntity | ||||
| from homeassistant.helpers.update_coordinator import DataUpdateCoordinator | ||||
| from pyhon.appliance import HonAppliance | ||||
|  | ||||
| from .const import DOMAIN | ||||
|  | ||||
| _LOGGER = logging.getLogger(__name__) | ||||
|  | ||||
| @ -108,7 +108,6 @@ SELECTS = { | ||||
|         SelectEntityDescription( | ||||
|             key="startProgram.program", | ||||
|             name="Program", | ||||
|             entity_category=EntityCategory.CONFIG, | ||||
|             translation_key="programs_ac", | ||||
|         ), | ||||
|         SelectEntityDescription( | ||||
|  | ||||
| @ -1,5 +1,7 @@ | ||||
| import logging | ||||
|  | ||||
| from pyhon import Hon | ||||
|  | ||||
| from homeassistant.components.sensor import ( | ||||
|     SensorEntity, | ||||
|     SensorDeviceClass, | ||||
| @ -20,8 +22,6 @@ from homeassistant.const import ( | ||||
| from homeassistant.core import callback | ||||
| from homeassistant.helpers.entity import EntityCategory | ||||
| from homeassistant.helpers.typing import StateType | ||||
| from pyhon import Hon | ||||
|  | ||||
| from . import const | ||||
| from .const import DOMAIN | ||||
| from .hon import HonCoordinator, HonEntity, unique_entities | ||||
| @ -399,6 +399,72 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = { | ||||
|             options=list(const.DISHWASHER_PR_PHASE), | ||||
|         ), | ||||
|     ), | ||||
|     "AC": ( | ||||
|         SensorEntityDescription( | ||||
|             key="tempAirOutdoor", | ||||
|             name="Air Temperature Outdoor", | ||||
|             icon="mdi:thermometer", | ||||
|             state_class=SensorStateClass.MEASUREMENT, | ||||
|             device_class=SensorDeviceClass.TEMPERATURE, | ||||
|             native_unit_of_measurement=UnitOfTemperature.CELSIUS, | ||||
|         ), | ||||
|         SensorEntityDescription( | ||||
|             key="tempCoilerIndoor", | ||||
|             name="Coiler Temperature Indoor", | ||||
|             icon="mdi:thermometer", | ||||
|             state_class=SensorStateClass.MEASUREMENT, | ||||
|             device_class=SensorDeviceClass.TEMPERATURE, | ||||
|             native_unit_of_measurement=UnitOfTemperature.CELSIUS, | ||||
|         ), | ||||
|         SensorEntityDescription( | ||||
|             key="tempCoilerOutdoor", | ||||
|             name="Coiler Temperature Outside", | ||||
|             icon="mdi:thermometer", | ||||
|             state_class=SensorStateClass.MEASUREMENT, | ||||
|             device_class=SensorDeviceClass.TEMPERATURE, | ||||
|             native_unit_of_measurement=UnitOfTemperature.CELSIUS, | ||||
|         ), | ||||
|         SensorEntityDescription( | ||||
|             key="tempDefrostOutdoor", | ||||
|             name="Defrost Temperature Outdoor", | ||||
|             icon="mdi:thermometer", | ||||
|             state_class=SensorStateClass.MEASUREMENT, | ||||
|             device_class=SensorDeviceClass.TEMPERATURE, | ||||
|             native_unit_of_measurement=UnitOfTemperature.CELSIUS, | ||||
|         ), | ||||
|         SensorEntityDescription( | ||||
|             key="tempInAirOutdoor", | ||||
|             name="In Air Temperature Outdoor", | ||||
|             icon="mdi:thermometer", | ||||
|             state_class=SensorStateClass.MEASUREMENT, | ||||
|             device_class=SensorDeviceClass.TEMPERATURE, | ||||
|             native_unit_of_measurement=UnitOfTemperature.CELSIUS, | ||||
|         ), | ||||
|         SensorEntityDescription( | ||||
|             key="tempIndoor", | ||||
|             name="Indoor Temperature", | ||||
|             icon="mdi:thermometer", | ||||
|             state_class=SensorStateClass.MEASUREMENT, | ||||
|             device_class=SensorDeviceClass.TEMPERATURE, | ||||
|             native_unit_of_measurement=UnitOfTemperature.CELSIUS, | ||||
|         ), | ||||
|         SensorEntityDescription( | ||||
|             key="tempOutdoor", | ||||
|             name="Outdoor Temperature", | ||||
|             icon="mdi:thermometer", | ||||
|             state_class=SensorStateClass.MEASUREMENT, | ||||
|             device_class=SensorDeviceClass.TEMPERATURE, | ||||
|             native_unit_of_measurement=UnitOfTemperature.CELSIUS, | ||||
|         ), | ||||
|         SensorEntityDescription( | ||||
|             key="tempSel", | ||||
|             name="Selected Temperature", | ||||
|             icon="mdi:thermometer", | ||||
|             state_class=SensorStateClass.MEASUREMENT, | ||||
|             device_class=SensorDeviceClass.TEMPERATURE, | ||||
|             native_unit_of_measurement=UnitOfTemperature.CELSIUS, | ||||
|         ), | ||||
|     ), | ||||
|     "REF": ( | ||||
|         SensorEntityDescription( | ||||
|             key="humidityEnv", | ||||
|  | ||||
| @ -2,13 +2,14 @@ import logging | ||||
| from dataclasses import dataclass | ||||
| from typing import Any | ||||
|  | ||||
| from homeassistant.components.switch import SwitchEntityDescription, SwitchEntity | ||||
| from homeassistant.config_entries import ConfigEntry | ||||
| from homeassistant.const import EntityCategory | ||||
| from pyhon import Hon | ||||
| from pyhon.appliance import HonAppliance | ||||
| from pyhon.parameter.range import HonParameterRange | ||||
|  | ||||
| from homeassistant.components.switch import SwitchEntityDescription, SwitchEntity | ||||
| from homeassistant.config_entries import ConfigEntry | ||||
| from homeassistant.const import EntityCategory | ||||
| from homeassistant.core import callback | ||||
| from .const import DOMAIN | ||||
| from .hon import HonCoordinator, HonEntity, unique_entities | ||||
|  | ||||
| @ -19,6 +20,7 @@ _LOGGER = logging.getLogger(__name__) | ||||
| class HonSwitchEntityDescriptionMixin: | ||||
|     turn_on_key: str = "" | ||||
|     turn_off_key: str = "" | ||||
|     status_key: str = "" | ||||
|  | ||||
|  | ||||
| @dataclass | ||||
| @ -251,12 +253,14 @@ SWITCHES: dict[str, tuple[HonSwitchEntityDescription, ...]] = { | ||||
|     "AC": ( | ||||
|         HonSwitchEntityDescription( | ||||
|             key="settings.10degreeHeatingStatus", | ||||
|             status_key="10degreeHeatingStatus", | ||||
|             name="10° Heating", | ||||
|             icon="mdi:heat-wave", | ||||
|             translation_key="10_degree_heating", | ||||
|         ), | ||||
|         HonSwitchEntityDescription( | ||||
|             key="settings.echoStatus", | ||||
|             status_key="echoStatus", | ||||
|             name="Echo", | ||||
|             icon="mdi:account-voice", | ||||
|         ), | ||||
| @ -267,23 +271,27 @@ SWITCHES: dict[str, tuple[HonSwitchEntityDescription, ...]] = { | ||||
|         ), | ||||
|         HonSwitchEntityDescription( | ||||
|             key="settings.healthMode", | ||||
|             status_key="healthMode", | ||||
|             name="Health Mode", | ||||
|             icon="mdi:medication-outline", | ||||
|         ), | ||||
|         HonSwitchEntityDescription( | ||||
|             key="settings.muteStatus", | ||||
|             status_key="muteStatus", | ||||
|             name="Mute", | ||||
|             icon="mdi:volume-off", | ||||
|             translation_key="mute_mode", | ||||
|         ), | ||||
|         HonSwitchEntityDescription( | ||||
|             key="settings.rapidMode", | ||||
|             status_key="rapidMode", | ||||
|             name="Rapid Mode", | ||||
|             icon="mdi:run-fast", | ||||
|             translation_key="rapid_mode", | ||||
|         ), | ||||
|         HonSwitchEntityDescription( | ||||
|             key="settings.screenDisplayStatus", | ||||
|             status_key="screenDisplayStatus", | ||||
|             name="Screen Display", | ||||
|             icon="mdi:monitor-small", | ||||
|         ), | ||||
| @ -295,12 +303,14 @@ SWITCHES: dict[str, tuple[HonSwitchEntityDescription, ...]] = { | ||||
|         ), | ||||
|         HonSwitchEntityDescription( | ||||
|             key="settings.selfCleaningStatus", | ||||
|             status_key="selfCleaningStatus", | ||||
|             name="Self Cleaning", | ||||
|             icon="mdi:air-filter", | ||||
|             translation_key="self_clean", | ||||
|         ), | ||||
|         HonSwitchEntityDescription( | ||||
|             key="settings.silentSleepStatus", | ||||
|             status_key="silentSleepStatus", | ||||
|             name="Silent Sleep", | ||||
|             icon="mdi:bed", | ||||
|             translation_key="silent_mode", | ||||
| @ -392,6 +402,8 @@ class HonSwitchEntity(HonEntity, SwitchEntity): | ||||
|                 or hasattr(setting, "min") | ||||
|                 and setting.value != setting.min | ||||
|             ) | ||||
|         elif self.entity_description.status_key: | ||||
|             return self._device.get(self.entity_description.status_key, "0") == "1" | ||||
|         return self._device.get(self.entity_description.key, False) | ||||
|  | ||||
|     async def async_turn_on(self, **kwargs: Any) -> None: | ||||
| @ -438,3 +450,11 @@ class HonSwitchEntity(HonEntity, SwitchEntity): | ||||
|                 and self._device.get("attributes.lastConnEvent.category") | ||||
|                 != "DISCONNECTED" | ||||
|             ) | ||||
|  | ||||
|     @callback | ||||
|     def _handle_coordinator_update(self): | ||||
|         if not self.entity_description.status_key: | ||||
|             return | ||||
|         value = self._device.get(self.entity_description.status_key, "0") | ||||
|         self._attr_state = value == "1" | ||||
|         self.async_write_ha_state() | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Otevřená dvířka Chladnička" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Výměna filtru" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Tür offen Kühlschrank" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Filteraustausch" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Πόρτα ανοιχτή Ψυγείο" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Αντικατάσταση φίλτρου" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1323,6 +1323,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Door open Fridge" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Filter replacement" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Puerta abierta Frigorífico" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Sustitución del filtro" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Porte ouverte Réfrigérateur" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Remplacement du filtre" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -708,6 +708,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Door open Fridge" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Filter replacement" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Otvorena vrata Hladnjak" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Zamjena filtra" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1307,6 +1307,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Porta aperta Frigorifero" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Sostituzione filtro" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Deur open Koelkast" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Filter vervangen" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Drzwi otwarte Lodówka" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Wymiana filtra" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Porta aberta Frigorífico" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Substituição do filtro" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Ușă deschisă Frigider" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Înlocuirea filtrului" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Дверца открыта Холодильник" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Замена фильтра" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Otvorené dvere Chladnička" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Výmena filtra" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Door open Hladilnik" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Menjava filtra" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Vrata su otvorena Frižider" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Zamena filtera" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "Kapı açık Buzdolabı" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "Filtre değişimi" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
| @ -1255,6 +1255,9 @@ | ||||
|             }, | ||||
|             "fridge_door": { | ||||
|                 "name": "门打开 冰箱" | ||||
|             }, | ||||
|             "filter_replacement": { | ||||
|                 "name": "更换过滤器" | ||||
|             } | ||||
|         }, | ||||
|         "number": { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user