Improve air conditioner support
This commit is contained in:
		
							
								
								
									
										24
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								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
 | 
			
		||||
 
 | 
			
		||||
@@ -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":
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
        ),
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
        ),
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user