From a5c7b99569e7d088f28f3bd8a530d249f8bcf730 Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Mon, 8 May 2023 02:05:04 +0200 Subject: [PATCH] Improve air conditioner support --- README.md | 24 +++++++------- custom_components/hon/climate.py | 56 ++++++++++++++++++-------------- custom_components/hon/const.py | 13 ++++++++ custom_components/hon/number.py | 2 +- custom_components/hon/select.py | 3 +- custom_components/hon/switch.py | 29 +++++++++++------ 6 files changed, 78 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 6c137cd..6f9c8db 100644 --- a/README.md +++ b/README.md @@ -138,19 +138,19 @@ I moved the api related stuff into the package [pyhOn](https://github.com/Andre0 #### Configs | Name | Icon | Entity | Key | | --- | --- | --- | --- | -| 10° Heating | | `switch` | `startProgram.10degreeHeatingStatus` | -| Echo | | `switch` | `startProgram.echoStatus` | -| Eco Mode | | `switch` | `startProgram.ecoMode` | -| Eco Pilot | | `select` | `startProgram.humanSensingStatus` | -| Health Mode | | `switch` | `startProgram.healthMode` | -| Mute | | `switch` | `startProgram.muteStatus` | +| 10° Heating | `heat-wave` | `switch` | `settings.10degreeHeatingStatus` | +| Echo | `account-voice` | `switch` | `settings.echoStatus` | +| Eco Mode | | `switch` | `settings.ecoMode` | +| Eco Pilot | `run` | `select` | `settings.humanSensingStatus` | +| Health Mode | `medication-outline` | `switch` | `settings.healthMode` | +| Mute | `volume-off` | `switch` | `settings.muteStatus` | | Program | | `select` | `startProgram.program` | -| Rapid Mode | | `switch` | `startProgram.rapidMode` | -| Screen Display | | `switch` | `startProgram.screenDisplayStatus` | -| Self Cleaning | | `switch` | `startProgram.selfCleaningStatus` | -| Self Cleaning 56 | | `switch` | `startProgram.selfCleaning56Status` | -| Silent Sleep | | `switch` | `startProgram.silentSleepStatus` | -| Target Temperature | `thermometer` | `number` | `startProgram.tempSel` | +| Rapid Mode | `run-fast` | `switch` | `settings.rapidMode` | +| Screen Display | `monitor-small` | `switch` | `settings.screenDisplayStatus` | +| Self Cleaning | `air-filter` | `switch` | `settings.selfCleaningStatus` | +| Self Cleaning 56 | `air-filter` | `switch` | `settings.selfCleaning56Status` | +| Silent Sleep | `bed` | `switch` | `settings.silentSleepStatus` | +| Target Temperature | `thermometer` | `number` | `settings.tempSel` | ### Dish washer #### Controls diff --git a/custom_components/hon/climate.py b/custom_components/hon/climate.py index ef4c520..d5998a7 100644 --- a/custom_components/hon/climate.py +++ b/custom_components/hon/climate.py @@ -29,7 +29,7 @@ from .hon import HonEntity, HonCoordinator _LOGGER = logging.getLogger(__name__) CLIMATES = { - "AC": (ClimateEntityDescription(key="startProgram"),), + "AC": (ClimateEntityDescription(key="startProgram", icon="mdi:air-conditioner"),), } @@ -47,7 +47,7 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non if descriptions := CLIMATES.get(device.appliance_type): for description in descriptions: - if description.key not in device.available_settings: + if description.key not in list(device.commands): continue appliances.extend( [HonClimateEntity(hass, coordinator, entry, device, description)] @@ -61,21 +61,21 @@ class HonClimateEntity(HonEntity, ClimateEntity): ) -> None: super().__init__(hass, entry, coordinator, device) self._coordinator = coordinator - self._device = coordinator.device + self._device = device self.entity_description = description self._hass = hass self._attr_unique_id = f"{super().unique_id}climate" self._attr_temperature_unit = TEMP_CELSIUS self._attr_target_temperature_step = PRECISION_WHOLE - self._attr_max_temp = device.settings["tempSel"].max - self._attr_min_temp = device.settings["tempSel"].min + self._attr_max_temp = device.settings["settings.tempSel"].max + self._attr_min_temp = device.settings["settings.tempSel"].min self._attr_hvac_modes = [HVACMode.OFF] + [ - HON_HVAC_MODE[mode] for mode in device.settings["machMode"].values + HON_HVAC_MODE[mode] for mode in device.settings["settings.machMode"].values ] self._attr_fan_modes = [FAN_OFF] + [ - HON_FAN[mode] for mode in device.settings["windSpeed"].values + HON_FAN[mode] for mode in device.settings["settings.windSpeed"].values ] self._attr_swing_modes = [ SWING_OFF, @@ -89,22 +89,28 @@ class HonClimateEntity(HonEntity, ClimateEntity): | ClimateEntityFeature.SWING_MODE ) + self._handle_coordinator_update() + async def async_set_hvac_mode(self, hvac_mode): if hvac_mode == HVACMode.OFF: - self._device.commands["stopProgram"].send() + await self._device.commands["stopProgram"].send() else: - self._device.settings["program"].value = HON_HVAC_PROGRAM[hvac_mode] - self._device.commands["startProgram"].send() + self._device.settings["startProgram.program"].value = HON_HVAC_PROGRAM[ + hvac_mode + ] + await self._device.commands["startProgram"].send() self._attr_hvac_mode = hvac_mode async def async_set_fan_mode(self, fan_mode): mode_number = list(HON_FAN.values()).index(fan_mode) - self._device.settings["windSpeed"].value = list(HON_FAN.keys())[mode_number] - self._device.commands["startProgram"].send() + self._device.settings["settings.windSpeed"].value = list(HON_FAN.keys())[ + mode_number + ] + await self._device.commands["settings"].send() async def async_set_swing_mode(self, swing_mode): - horizontal = self._device.settings["windDirectionHorizontal"] - vertical = self._device.settings["windDirectionVertical"] + horizontal = self._device.settings["settings.windDirectionHorizontal"] + vertical = self._device.settings["settings.windDirectionVertical"] if swing_mode in [SWING_BOTH, SWING_HORIZONTAL]: horizontal.value = "7" if swing_mode in [SWING_BOTH, SWING_VERTICAL]: @@ -114,30 +120,30 @@ class HonClimateEntity(HonEntity, ClimateEntity): if swing_mode in [SWING_OFF, SWING_VERTICAL] and horizontal.value == "7": horizontal.value = "0" self._attr_swing_mode = swing_mode - self._device.commands["startProgram"].send() + await self._device.commands["settings"].send() async def async_set_temperature(self, **kwargs): if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None: return False - self._device.settings["selTemp"].value = temperature - self._device.commands["startProgram"].send() + self._device.settings["settings.selTemp"].value = temperature + await self._device.commands["settings"].send() @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["tempSel"].max - self._attr_min_temp = self._device.settings["tempSel"].min + # 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")] + self._attr_hvac_mode = HON_HVAC_MODE[self._device.get("machMode") or "0"] - self._attr_fan_mode = HON_FAN[self._device.settings["windSpeed"].value] + self._attr_fan_mode = HON_FAN[self._device.settings["settings.windSpeed"].value] - horizontal = self._device.settings["windDirectionHorizontal"] - vertical = self._device.settings["windDirectionVertical"] + horizontal = self._device.settings["settings.windDirectionHorizontal"] + vertical = self._device.settings["settings.windDirectionVertical"] if horizontal == "7" and vertical == "8": self._attr_swing_mode = SWING_BOTH elif horizontal == "7": diff --git a/custom_components/hon/const.py b/custom_components/hon/const.py index 59e1863..13c4961 100644 --- a/custom_components/hon/const.py +++ b/custom_components/hon/const.py @@ -120,6 +120,19 @@ TUMBLE_DRYER_PR_PHASE = { "19": "WASHING_CMD&CTRL.PHASE_DRYING.TITLE", "20": "WASHING_CMD&CTRL.PHASE_DRYING.TITLE", } +DIRTY_LEVEL = { + "1": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.LITTLE", + "2": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.NORMAL", + "3": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.VERY", +} + +STEAM_LEVEL = { + "0": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.NO_STEAM", + "1": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_FABRICS.COTTON_TITLE", + "2": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_FABRICS.DELICATE_TITLE", + "3": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_FABRICS.SYNTHETIC_TITLE", +} + DISHWASHER_PR_PHASE = { "0": "WASHING_CMD&CTRL.PHASE_READY.TITLE", "1": "WASHING_CMD&CTRL.PHASE_PREWASH.TITLE", diff --git a/custom_components/hon/number.py b/custom_components/hon/number.py index cfd8345..2aed8b3 100644 --- a/custom_components/hon/number.py +++ b/custom_components/hon/number.py @@ -146,7 +146,7 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = { ), "AC": ( NumberEntityDescription( - key="startProgram.tempSel", + key="settings.tempSel", name="Target Temperature", entity_category=EntityCategory.CONFIG, icon="mdi:thermometer", diff --git a/custom_components/hon/select.py b/custom_components/hon/select.py index a27df1d..0f65bc9 100644 --- a/custom_components/hon/select.py +++ b/custom_components/hon/select.py @@ -98,8 +98,9 @@ SELECTS = { translation_key="programs_ac", ), SelectEntityDescription( - key="startProgram.humanSensingStatus", + key="settings.humanSensingStatus", name="Eco Pilot", + icon="mdi:run", entity_category=EntityCategory.CONFIG, translation_key="eco_pilot", ), diff --git a/custom_components/hon/switch.py b/custom_components/hon/switch.py index 9b751c3..671572c 100644 --- a/custom_components/hon/switch.py +++ b/custom_components/hon/switch.py @@ -237,59 +237,68 @@ SWITCHES: dict[str, tuple[HonSwitchEntityDescription, ...]] = { ), "AC": ( HonSwitchEntityDescription( - key="startProgram.10degreeHeatingStatus", + key="settings.10degreeHeatingStatus", name="10° Heating", + icon="mdi:heat-wave", entity_category=EntityCategory.CONFIG, translation_key="10_degree_heating", ), HonSwitchEntityDescription( - key="startProgram.echoStatus", + key="settings.echoStatus", name="Echo", + icon="mdi:account-voice", entity_category=EntityCategory.CONFIG, ), HonSwitchEntityDescription( - key="startProgram.ecoMode", + key="settings.ecoMode", name="Eco Mode", entity_category=EntityCategory.CONFIG, translation_key="eco_mode", ), HonSwitchEntityDescription( - key="startProgram.healthMode", + key="settings.healthMode", name="Health Mode", + icon="mdi:medication-outline", entity_category=EntityCategory.CONFIG, ), HonSwitchEntityDescription( - key="startProgram.muteStatus", + key="settings.muteStatus", name="Mute", + icon="mdi:volume-off", entity_category=EntityCategory.CONFIG, translation_key="mute_mode", ), HonSwitchEntityDescription( - key="startProgram.rapidMode", + key="settings.rapidMode", name="Rapid Mode", + icon="mdi:run-fast", entity_category=EntityCategory.CONFIG, translation_key="rapid_mode", ), HonSwitchEntityDescription( - key="startProgram.screenDisplayStatus", + key="settings.screenDisplayStatus", name="Screen Display", + icon="mdi:monitor-small", entity_category=EntityCategory.CONFIG, ), HonSwitchEntityDescription( - key="startProgram.selfCleaning56Status", + key="settings.selfCleaning56Status", name="Self Cleaning 56", + icon="mdi:air-filter", entity_category=EntityCategory.CONFIG, translation_key="self_clean_56", ), HonSwitchEntityDescription( - key="startProgram.selfCleaningStatus", + key="settings.selfCleaningStatus", name="Self Cleaning", + icon="mdi:air-filter", entity_category=EntityCategory.CONFIG, translation_key="self_clean", ), HonSwitchEntityDescription( - key="startProgram.silentSleepStatus", + key="settings.silentSleepStatus", name="Silent Sleep", + icon="mdi:bed", entity_category=EntityCategory.CONFIG, translation_key="silent_mode", ),