Merge branch 'main' into refactor

This commit is contained in:
Andre Basche 2023-06-22 13:18:45 +02:00
commit 0d43eeff3d
35 changed files with 847 additions and 127 deletions

39
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,39 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: Andre0512
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Environment (please complete the following information):**
- Home Assistant Version: [e.g. `2023.6.1`]
- hOn Integration Version [e.g. `0.8.1`, can be found in HACS]
- pyhOn Version [e.g. `0.13.1`, can be found in device log]
**Additional context**
Add any other context about the problem here.
**Device Log**
Post your device info here (if available)
1. Enable the "Show Device Info" button
_This button can be found in the diagnostic section of your device or in the entity overview if "show disabled entities" is enabled._
2. Press the button to create a notification
3. Open home assistant notifications and copy the message (Crtl+A, Ctrl+C)

View file

@ -0,0 +1,26 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: Andre0512
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Device Log**
Post your device info here (if available)
1. Enable the "Show Device Info" button
_This button can be found in the diagnostic section of your device or in the entity overview if "show disabled entities" is enabled._
2. Press the button to create a notification
3. Open home assistant notifications and copy the message (Crtl+A, Ctrl+C)
**Additional context**
Add any other context or screenshots about the feature request here.

View file

@ -14,9 +14,10 @@ Home Assistant integration for [Haier's mobile app hOn](https://hon-smarthome.co
- [Dish Washer](https://github.com/Andre0512/hon#dish-washer) - [Dish Washer](https://github.com/Andre0512/hon#dish-washer)
- [Air conditioner](https://github.com/Andre0512/hon#air-conditioner) - [Air conditioner](https://github.com/Andre0512/hon#air-conditioner)
- [Fridge](https://github.com/Andre0512/hon#fridge) - [Fridge](https://github.com/Andre0512/hon#fridge)
- [Hob](https://github.com/Andre0512/hon#hob) [BETA] - [Induction Hob](https://github.com/Andre0512/hon#induction-hob) [BETA]
- [Hood](https://github.com/Andre0512/hon#hood) [BETA] - [Hood](https://github.com/Andre0512/hon#hood) [BETA]
- [Wine Cellar](https://github.com/Andre0512/hon#wine-cellar) [BETA] - [Wine Cellar](https://github.com/Andre0512/hon#wine-cellar) [BETA]
- [Air Purifier](https://github.com/Andre0512/hon#air-purifier) [BETA]
## Installation ## Installation
**Method 1:** [![Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=Andre0512&repository=hon&category=integration) **Method 1:** [![Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=Andre0512&repository=hon&category=integration)
@ -37,18 +38,18 @@ _If the integration is not in the list, you need to clear the browser cache._
## Supported Models ## Supported Models
Support has been confirmed for these models, but many more will work. Please add already supported devices [with this form to complete the list](https://forms.gle/bTSD8qFotdZFytbf8). Support has been confirmed for these models, but many more will work. Please add already supported devices [with this form to complete the list](https://forms.gle/bTSD8qFotdZFytbf8).
| | **Haier** | **Hoover** | **Candy** | | | **Haier** | **Hoover** | **Candy** |
|---------------------|------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------| |---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------|
| **Washing Machine** | HW90-B14TEAM5 <br/> HW100-B14959U1 | H-WASH 500 <br/> H7W4 48MBC-S | RO441286DWMC4-07 <br/> HW 68AMC/1-80 <br/> HWPD 69AMBC/1-S | | **Washing Machine** | HW90-B14TEAM5 <br/> HW100-B14959U1 | H-WASH 500 <br/> H7W4 48MBC-S | CO4 107T1/2-07 <br/> CBWO49TWME-S <br/> RO44 1286DWMC4-07 <br/> HW 68AMC/1-80 <br/> HWPD 69AMBC/1-S |
| **Tumble Dryer** | HD80-A3959 | H-DRY 500 <br/> H9A3TCBEXS-S <br/> HLE C10DCE-80 <br/> NDE H10A2TCE-80 <br/> NDE H9A2TSBEXS-S <br/> NDPHY10A2TCBEXSS | BCTDH7A1TE <br/> CSOE C10DE-80 <br/> ROE H9A3TCEX-S | | **Tumble Dryer** | HD80-A3959 | H-DRY 500 <br/> H9A3TCBEXS-S <br/> HLE C10DCE-80 <br/> NDE H10A2TCE-80 <br/> NDE H9A2TSBEXS-S <br/> NDPHY10A2TCBEXSS | BCTDH7A1TE <br/> CSOE C10DE-80 <br/> ROE H9A3TCEX-S |
| **Washer Dryer** | HWD100-B14979 | HWPS4954DAMR-11 | RPW41066BWMR/1-S | | **Washer Dryer** | HWD100-B14979 | HWPS4954DAMR-11 | RPW41066BWMR/1-S |
| **Oven** | HWO60SM2F3XH | HSOT3161WG | | | **Oven** | HWO60SM2F3XH | HSOT3161WG | |
| **Dish Washer** | XIB 3B2SFS-80 <br/> XIB 6B2D3FB | HFB 6B2S3FX | | | **Dish Washer** | XIB 3B2SFS-80 <br/> XIB 6B2D3FB | HFB 6B2S3FX | |
| **Air conditioner** | AD105S2SM3FA <br/> AS20HPL1HRA <br/> AS25PBAHRA <br/> AS25S2SF1FA-WH <br/> AS25TADHRA-2 <br/> AS35TADHRA-2 <br/> | | | | **Air Conditioner** | AD105S2SM3FA <br/> AS20HPL1HRA <br/> AS25PBAHRA <br/> AS25S2SF1FA-WH <br/> AS25TADHRA-2 <br/> AS35S2SF2FA-3 <br/> AS35TADHRA-2 <br/> AS35TAMHRA-C | | |
| **Fridge** | HFW7720ENMB | | CCE4T620EWU | | **Fridge** | HFW7720ENMB | | CCE4T620EWU |
| **Hob** | HA2MTSJ68MC | | CIS633SCTTWIFI | | **Hob** | HA2MTSJ68MC | | CIS633SCTTWIFI |
| **Hood** | HADG6DS46BWIFI | | | | **Hood** | HADG6DS46BWIFI | | |
| **Wine Cellar** | HWS247FDU1 | | | | **Wine Cellar** | HWS247FDU1 | | |
## Supported Languages ## Supported Languages
Translation of internal names like programs are available for all languages which are official supported by the hOn app: Translation of internal names like programs are available for all languages which are official supported by the hOn app:
@ -137,7 +138,7 @@ For every device exists a hidden button which can be used to log all infos of yo
## Appliance Features ## Appliance Features
### Air conditioner ### Air Conditioner
#### Controls #### Controls
| Name | Icon | Entity | Key | | Name | Icon | Entity | Key |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@ -171,7 +172,36 @@ For every device exists a hidden button which can be used to log all infos of yo
| Program | `play` | `sensor` | `programName` | | Program | `play` | `sensor` | `programName` |
| Selected Temperature | `thermometer` | `sensor` | `tempSel` | | Selected Temperature | `thermometer` | `sensor` | `tempSel` |
### Dish washer ### Air Purifier
#### Controls
| Name | Icon | Entity | Key |
| --- | --- | --- | --- |
| Aroma Time Off | `thermometer` | `number` | `settings.aromaTimeOff` |
| Aroma Time On | `thermometer` | `number` | `settings.aromaTimeOn` |
| Diffuser Level | | `select` | `settings.aromaStatus` |
| Light status | `lightbulb` | `number` | `settings.lightStatus` |
| Lock Status | | `switch` | `lockStatus` |
| Mode | `run` | `select` | `settings.machMode` |
| Pollen Level | | `number` | `settings.pollenLevel` |
| Touch Tone | | `switch` | `touchToneStatus` |
#### Sensors
| Name | Icon | Entity | Key |
| --- | --- | --- | --- |
| Air Quality | | `sensor` | `airQuality` |
| CO Level | | `sensor` | `coLevel` |
| Error | `math-log` | `sensor` | `errors` |
| Humidity | | `sensor` | `humidityIndoor` |
| Main Filter Status | | `sensor` | `mainFilterStatus` |
| On | `power-cycle` | `binary_sensor` | `attributes.parameters.onOffStatus` |
| Pre Filter Status | | `sensor` | `preFilterStatus` |
| Temperature | | `sensor` | `temp` |
| Total Work Time | | `sensor` | `totalWorkTime` |
| VOC | | `sensor` | `vocValueIndoor` |
| Wind Speed | | `sensor` | `windSpeed` |
| pm10 | | `sensor` | `pm10ValueIndoor` |
| pm2p5 | | `sensor` | `pm2p5ValueIndoor` |
### Dish Washer
#### Controls #### Controls
| Name | Icon | Entity | Key | | Name | Icon | Entity | Key |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@ -217,10 +247,6 @@ For every device exists a hidden button which can be used to log all infos of yo
| Start Program | `hvac` | `button` | `startProgram` | | Start Program | `hvac` | `button` | `startProgram` |
| Stop Program | `hvac-off` | `button` | `stopProgram` | | Stop Program | `hvac-off` | `button` | `stopProgram` |
| Wind Speed | | `fan` | `settings.windSpeed` | | Wind Speed | | `fan` | `settings.windSpeed` |
#### Configs
| Name | Icon | Entity | Key |
| --- | --- | --- | --- |
| Light status | `lightbulb` | `number` | `startProgram.lightStatus` |
#### Sensors #### Sensors
| Name | Icon | Entity | Key | | Name | Icon | Entity | Key |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@ -231,13 +257,14 @@ For every device exists a hidden button which can be used to log all infos of yo
| Filter Cleaning Status | | `sensor` | `filterCleaningStatus` | | Filter Cleaning Status | | `sensor` | `filterCleaningStatus` |
| Last Work Time | `clock-start` | `sensor` | `lastWorkTime` | | Last Work Time | `clock-start` | `sensor` | `lastWorkTime` |
| Light Status | `lightbulb` | `sensor` | `lightStatus` | | Light Status | `lightbulb` | `sensor` | `lightStatus` |
| Light status | `lightbulb` | `number` | `startProgram.lightStatus` |
| Mach Mode | | `sensor` | `machMode` | | Mach Mode | | `sensor` | `machMode` |
| On / Off Status | `lightbulb` | `sensor` | `onOffStatus` | | On / Off Status | `lightbulb` | `sensor` | `onOffStatus` |
| Quick Delay Time Status | | `sensor` | `quickDelayTimeStatus` | | Quick Delay Time Status | | `sensor` | `quickDelayTimeStatus` |
| RGB Light Color | `lightbulb` | `sensor` | `rgbLightColors` | | RGB Light Color | `lightbulb` | `sensor` | `rgbLightColors` |
| RGB Light Status | `lightbulb` | `sensor` | `rgbLightStatus` | | RGB Light Status | `lightbulb` | `sensor` | `rgbLightStatus` |
### Hob ### Induction Hob
#### Controls #### Controls
| Name | Icon | Entity | Key | | Name | Icon | Entity | Key |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@ -321,7 +348,7 @@ For every device exists a hidden button which can be used to log all infos of yo
| Temperature Freezer | `snowflake-thermometer` | `sensor` | `tempZ2` | | Temperature Freezer | `snowflake-thermometer` | `sensor` | `tempZ2` |
| Temperature Fridge | `thermometer` | `sensor` | `tempZ1` | | Temperature Fridge | `thermometer` | `sensor` | `tempZ1` |
### Tumble dryer ### Tumble Dryer
#### Controls #### Controls
| Name | Icon | Entity | Key | | Name | Icon | Entity | Key |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@ -380,7 +407,7 @@ For every device exists a hidden button which can be used to log all infos of yo
| Temperature | `thermometer` | `sensor` | `temp` | | Temperature | `thermometer` | `sensor` | `temp` |
| Temperature 2 | `thermometer` | `sensor` | `tempZ2` | | Temperature 2 | `thermometer` | `sensor` | `tempZ2` |
### Washer dryer ### Washer Dryer
#### Controls #### Controls
| Name | Icon | Entity | Key | | Name | Icon | Entity | Key |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@ -455,7 +482,7 @@ For every device exists a hidden button which can be used to log all infos of yo
| Total Wash Cycle | `counter` | `sensor` | `totalWashCycle` | | Total Wash Cycle | `counter` | `sensor` | `totalWashCycle` |
| Total Water | | `sensor` | `totalWaterUsed` | | Total Water | | `sensor` | `totalWaterUsed` |
### Washing machine ### Washing Machine
#### Controls #### Controls
| Name | Icon | Entity | Key | | Name | Icon | Entity | Key |
| --- | --- | --- | --- | | --- | --- | --- | --- |

View file

@ -242,6 +242,16 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = {
translation_key="holiday_mode", translation_key="holiday_mode",
), ),
), ),
"AP": (
HonBinarySensorEntityDescription(
key="attributes.parameters.onOffStatus",
name="On",
device_class=BinarySensorDeviceClass.RUNNING,
on_value="1",
icon="mdi:power-cycle",
translation_key="on",
),
),
} }
BINARY_SENSORS["WD"] = unique_entities(BINARY_SENSORS["WM"], BINARY_SENSORS["TD"]) BINARY_SENSORS["WD"] = unique_entities(BINARY_SENSORS["WM"], BINARY_SENSORS["TD"])

View file

@ -4,7 +4,7 @@ import pkg_resources
from homeassistant.components import persistent_notification from homeassistant.components import persistent_notification
from homeassistant.components.button import ButtonEntityDescription, ButtonEntity from homeassistant.components.button import ButtonEntityDescription, ButtonEntity
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory from homeassistant.helpers.entity import EntityCategory
from pyhon.appliance import HonAppliance from pyhon.appliance import HonAppliance
from .const import DOMAIN from .const import DOMAIN

View file

@ -22,7 +22,7 @@ from homeassistant.const import (
from homeassistant.core import callback from homeassistant.core import callback
from pyhon.appliance import HonAppliance from pyhon.appliance import HonAppliance
from .const import HON_HVAC_MODE, HON_FAN, HON_HVAC_PROGRAM, DOMAIN from .const import HON_HVAC_MODE, HON_FAN, DOMAIN
from .hon import HonEntity from .hon import HonEntity
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -115,13 +115,14 @@ class HonACClimateEntity(HonEntity, ClimateEntity):
super().__init__(hass, entry, device, description) super().__init__(hass, entry, device, description)
self._attr_temperature_unit = TEMP_CELSIUS self._attr_temperature_unit = TEMP_CELSIUS
self._attr_target_temperature_step = device.settings["settings.tempSel"].step self._set_temperature_bound()
self._attr_max_temp = device.settings["settings.tempSel"].max
self._attr_min_temp = device.settings["settings.tempSel"].min
self._attr_hvac_modes = [HVACMode.OFF] self._attr_hvac_modes = [HVACMode.OFF]
for mode in device.settings["settings.machMode"].values: for mode in device.settings["settings.machMode"].values:
self._attr_hvac_modes.append(HON_HVAC_MODE[int(mode)]) self._attr_hvac_modes.append(HON_HVAC_MODE[int(mode)])
self._attr_preset_modes = []
for mode in device.settings["startProgram.program"].values:
self._attr_preset_modes.append(mode)
self._attr_fan_modes = [FAN_OFF] self._attr_fan_modes = [FAN_OFF]
for mode in device.settings["settings.windSpeed"].values: for mode in device.settings["settings.windSpeed"].values:
self._attr_fan_modes.append(HON_FAN[int(mode)]) self._attr_fan_modes.append(HON_FAN[int(mode)])
@ -135,10 +136,18 @@ class HonACClimateEntity(HonEntity, ClimateEntity):
ClimateEntityFeature.TARGET_TEMPERATURE ClimateEntityFeature.TARGET_TEMPERATURE
| ClimateEntityFeature.FAN_MODE | ClimateEntityFeature.FAN_MODE
| ClimateEntityFeature.SWING_MODE | ClimateEntityFeature.SWING_MODE
| ClimateEntityFeature.PRESET_MODE
) )
self._handle_coordinator_update(update=False) self._handle_coordinator_update(update=False)
def _set_temperature_bound(self) -> None:
self._attr_target_temperature_step = self._device.settings[
"settings.tempSel"
].step
self._attr_max_temp = self._device.settings["settings.tempSel"].max
self._attr_min_temp = self._device.settings["settings.tempSel"].min
@property @property
def target_temperature(self) -> int | None: def target_temperature(self) -> int | None:
"""Return the temperature we try to reach.""" """Return the temperature we try to reach."""
@ -166,13 +175,31 @@ class HonACClimateEntity(HonEntity, ClimateEntity):
async def async_set_hvac_mode(self, hvac_mode): async def async_set_hvac_mode(self, hvac_mode):
self._attr_hvac_mode = hvac_mode self._attr_hvac_mode = hvac_mode
if hvac_mode == HVACMode.OFF: if hvac_mode == HVACMode.OFF:
command = "stopProgram" await self._device.commands["stopProgram"].send()
self._device.sync_command("stopProgram", "settings")
else: else:
mode = HON_HVAC_PROGRAM[hvac_mode] self._device.settings["settings.onOffStatus"].value = "1"
self._device.settings["startProgram.program"].value = mode setting = self._device.settings["settings.machMode"]
command = "startProgram" modes = {HON_HVAC_MODE[int(number)]: number for number in setting.values}
await self._device.commands[command].send() setting.value = modes[hvac_mode]
self._device.sync_command(command, "settings") await self._device.commands["settings"].send()
self.async_write_ha_state()
@property
def preset_mode(self) -> str | None:
"""Return the current Preset for this channel."""
return None
async def async_set_preset_mode(self, preset_mode: str) -> None:
"""Set the new preset mode."""
if program := self._device.settings.get(f"startProgram.program"):
program.value = preset_mode
self._device.sync_command("startProgram", "settings")
self._set_temperature_bound()
self._handle_coordinator_update(update=False)
await self.coordinator.async_refresh()
self._attr_preset_mode = preset_mode
await self._device.commands["startProgram"].send()
self.async_write_ha_state() self.async_write_ha_state()
@property @property

View file

@ -188,3 +188,18 @@ AC_HUMAN_SENSE = {
2: "follow_touch", 2: "follow_touch",
3: "unknown", 3: "unknown",
} }
AP_MACH_MODE = {
0: "standby",
1: "sleep",
2: "auto",
3: "allergens",
4: "max",
}
AP_DIFFUSER_LEVEL = {
1: "soft",
2: "mid",
3: "h_biotics",
4: "custom",
}

View file

@ -85,5 +85,7 @@ def get_coordinator(hass, appliance):
def get_readable(description, value): def get_readable(description, value):
with suppress(ValueError): if description.option_list is not None:
return description.option_list.get(int(value), value) with suppress(ValueError):
return description.option_list.get(int(value), value)
return value

View file

@ -9,7 +9,7 @@
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"issue_tracker": "https://github.com/Andre0512/hon/issues", "issue_tracker": "https://github.com/Andre0512/hon/issues",
"requirements": [ "requirements": [
"pyhOn==0.13.0" "pyhOn==0.13.1"
], ],
"version": "0.9.0-beta.2" "version": "0.9.0-beta.4"
} }

View file

@ -167,7 +167,29 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = {
key="startProgram.lightStatus", key="startProgram.lightStatus",
name="Light status", name="Light status",
icon="mdi:lightbulb", icon="mdi:lightbulb",
entity_category=EntityCategory.CONFIG, ),
),
"AP": (
HonNumberEntityDescription(
key="settings.aromaTimeOn",
name="Aroma Time On",
icon="mdi:thermometer",
native_unit_of_measurement=UnitOfTime.SECONDS,
),
HonNumberEntityDescription(
key="settings.aromaTimeOff",
name="Aroma Time Off",
icon="mdi:thermometer",
native_unit_of_measurement=UnitOfTime.SECONDS,
),
HonNumberEntityDescription(
key="settings.lightStatus",
name="Light status",
icon="mdi:lightbulb",
),
HonNumberEntityDescription(
key="settings.pollenLevel",
name="Pollen Level",
), ),
), ),
} }
@ -206,7 +228,7 @@ class HonNumberEntity(HonEntity, NumberEntity):
@property @property
def native_value(self) -> float | None: def native_value(self) -> float | None:
return self._device.get(self.entity_description.key) return self._device.get(self.entity_description.key.split(".")[-1])
async def async_set_native_value(self, value: float) -> None: async def async_set_native_value(self, value: float) -> None:
setting = self._device.settings[self.entity_description.key] setting = self._device.settings[self.entity_description.key]
@ -214,6 +236,8 @@ class HonNumberEntity(HonEntity, NumberEntity):
setting.value = value setting.value = value
command = self.entity_description.key.split(".")[0] command = self.entity_description.key.split(".")[0]
await self._device.commands[command].send() await self._device.commands[command].send()
if command != "settings":
self._device.sync_command(command, "settings")
await self.coordinator.async_refresh() await self.coordinator.async_refresh()
@callback @callback
@ -223,7 +247,7 @@ class HonNumberEntity(HonEntity, NumberEntity):
self._attr_native_max_value = setting.max self._attr_native_max_value = setting.max
self._attr_native_min_value = setting.min self._attr_native_min_value = setting.min
self._attr_native_step = setting.step self._attr_native_step = setting.step
self._attr_native_value = setting.value self._attr_native_value = self.native_value
if update: if update:
self.async_write_ha_state() self.async_write_ha_state()

View file

@ -1,7 +1,6 @@
from __future__ import annotations from __future__ import annotations
import logging import logging
from contextlib import suppress
from dataclasses import dataclass from dataclasses import dataclass
from typing import Dict, List from typing import Dict, List
@ -10,7 +9,6 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.const import UnitOfTemperature, UnitOfTime, REVOLUTIONS_PER_MINUTE from homeassistant.const import UnitOfTemperature, UnitOfTime, REVOLUTIONS_PER_MINUTE
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.entity import EntityCategory
from pyhon.appliance import HonAppliance
from . import const from . import const
from .const import DOMAIN from .const import DOMAIN
@ -135,6 +133,19 @@ SELECTS = {
translation_key="ref_zones", translation_key="ref_zones",
), ),
), ),
"AP": (
HonSelectEntityDescription(
key="settings.aromaStatus",
name="Diffuser Level",
option_list=const.AP_DIFFUSER_LEVEL,
),
HonSelectEntityDescription(
key="settings.machMode",
name="Mode",
icon="mdi:run",
option_list=const.AP_MACH_MODE,
),
),
} }
SELECTS["WD"] = unique_entities(SELECTS["WM"], SELECTS["TD"]) SELECTS["WD"] = unique_entities(SELECTS["WM"], SELECTS["TD"])
@ -157,46 +168,64 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
async_add_entities(entities) async_add_entities(entities)
class HonSelectEntity(HonEntity, SelectEntity): class HonConfigSelectEntity(HonEntity, SelectEntity):
entity_description: HonSelectEntityDescription entity_description: HonConfigSelectEntityDescription
def __init__(self, hass, entry, device: HonAppliance, description) -> None:
super().__init__(hass, entry, device, description)
@property @property
def current_option(self) -> str | None: def current_option(self) -> str | None:
value = self._device.settings.get(self.entity_description.key) if not (setting := self._device.settings.get(self.entity_description.key)):
if value is None or value.value not in self._attr_options:
return None return None
return value.value value = get_readable(self.entity_description, setting.value)
if value not in self._attr_options:
return None
return value
@property
def options(self) -> list[str]:
setting = self._device.settings.get(self.entity_description.key)
if setting is None:
return []
return [get_readable(self.entity_description, key) for key in setting.values]
def _option_to_number(self, option: str, values: List[str]):
if (options := self.entity_description.option_list) is not None:
return next(
(k for k, v in options.items() if str(k) in values and v == option),
option,
)
return option
async def async_select_option(self, option: str) -> None: async def async_select_option(self, option: str) -> None:
self._device.settings[self.entity_description.key].value = option setting = self._device.settings[self.entity_description.key]
command = self.entity_description.key.split(".")[0] setting.value = self._option_to_number(option, setting.values)
await self._device.commands[command].send()
await self.coordinator.async_refresh() await self.coordinator.async_refresh()
@callback @callback
def _handle_coordinator_update(self, update=True) -> None: def _handle_coordinator_update(self, update=True) -> None:
setting = self._device.settings.get(self.entity_description.key) self._attr_available = self.available
if setting is None: self._attr_options = self.options
self._attr_available = False self._attr_current_option = self.current_option
options = []
value = None
else:
self._attr_available = True
options = setting.values
value = setting.value
if self.entity_description.option_list is not None:
with suppress(ValueError):
options = [get_readable(self.entity_description, k) for k in options]
if value is not None:
value = get_readable(self.entity_description, value)
self._attr_options: List[str] = options
self._attr_native_value = value
if update: if update:
self.async_write_ha_state() self.async_write_ha_state()
@property
def available(self) -> bool:
"""Return True if entity is available."""
return self._device.settings.get(self.entity_description.key) is not None
class HonSelectEntity(HonConfigSelectEntity):
entity_description: HonSelectEntityDescription
async def async_select_option(self, option: str) -> None:
setting = self._device.settings[self.entity_description.key]
setting.value = self._option_to_number(option, setting.values)
command = self.entity_description.key.split(".")[0]
await self._device.commands[command].send()
if command != "settings":
self._device.sync_command(command, "settings")
await self.coordinator.async_refresh()
@property @property
def available(self) -> bool: def available(self) -> bool:
"""Return True if entity is available.""" """Return True if entity is available."""
@ -205,16 +234,3 @@ class HonSelectEntity(HonEntity, SelectEntity):
and int(self._device.get("remoteCtrValid", 1)) == 1 and int(self._device.get("remoteCtrValid", 1)) == 1
and self._device.get("attributes.lastConnEvent.category") != "DISCONNECTED" and self._device.get("attributes.lastConnEvent.category") != "DISCONNECTED"
) )
class HonConfigSelectEntity(HonSelectEntity):
entity_description: HonConfigSelectEntityDescription
async def async_select_option(self, option: str) -> None:
self._device.settings[self.entity_description.key].value = option
await self.coordinator.async_refresh()
@property
def available(self) -> bool:
"""Return True if entity is available."""
return super(SelectEntity, self).available

View file

@ -9,7 +9,12 @@ from homeassistant.components.sensor import (
SensorEntityDescription, SensorEntityDescription,
) )
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import PERCENTAGE from homeassistant.const import (
PERCENTAGE,
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_BILLION,
CONCENTRATION_PARTS_PER_MILLION,
)
from homeassistant.const import ( from homeassistant.const import (
REVOLUTIONS_PER_MINUTE, REVOLUTIONS_PER_MINUTE,
UnitOfEnergy, UnitOfEnergy,
@ -637,6 +642,7 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
name="Temperature", name="Temperature",
icon="mdi:thermometer", icon="mdi:thermometer",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS, native_unit_of_measurement=UnitOfTemperature.CELSIUS,
translation_key="temperature", translation_key="temperature",
), ),
@ -673,6 +679,7 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
icon="mdi:thermometer", icon="mdi:thermometer",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfTemperature.CELSIUS, native_unit_of_measurement=UnitOfTemperature.CELSIUS,
device_class=SensorDeviceClass.TEMPERATURE,
translation_key="temperature", translation_key="temperature",
), ),
HonSensorEntityDescription( HonSensorEntityDescription(
@ -683,6 +690,76 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
translation_key="programs_wc", translation_key="programs_wc",
), ),
), ),
"AP": (
HonSensorEntityDescription(
key="errors", name="Error", icon="mdi:math-log", translation_key="errors"
),
HonSensorEntityDescription(
key="mainFilterStatus",
name="Main Filter Status",
native_unit_of_measurement=PERCENTAGE,
),
HonSensorEntityDescription(
key="preFilterStatus",
name="Pre Filter Status",
native_unit_of_measurement=PERCENTAGE,
),
HonSensorEntityDescription(
key="totalWorkTime",
name="Total Work Time",
native_unit_of_measurement=UnitOfTime.MINUTES,
device_class=SensorDeviceClass.DURATION,
),
HonSensorEntityDescription(
key="coLevel",
name="CO Level",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.CO,
native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
),
HonSensorEntityDescription(
key="pm10ValueIndoor",
name="pm10",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.PM10,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
),
HonSensorEntityDescription(
key="pm2p5ValueIndoor",
name="pm2p5",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.PM25,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
),
HonSensorEntityDescription(
key="vocValueIndoor",
name="VOC",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
native_unit_of_measurement=CONCENTRATION_PARTS_PER_BILLION,
),
HonSensorEntityDescription(
key="humidityIndoor",
name="Humidity",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.HUMIDITY,
native_unit_of_measurement=PERCENTAGE,
translation_key="humidity",
),
HonSensorEntityDescription(
key="temp",
name="Temperature",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
translation_key="temperature",
),
HonSensorEntityDescription(key="windSpeed", name="Wind Speed"),
HonSensorEntityDescription(
key="airQuality",
name="Air Quality",
),
),
} }
SENSORS["WD"] = unique_entities(SENSORS["WM"], SENSORS["TD"]) SENSORS["WD"] = unique_entities(SENSORS["WM"], SENSORS["TD"])

View file

@ -5,7 +5,7 @@ from typing import Any
from homeassistant.components.switch import SwitchEntityDescription, SwitchEntity from homeassistant.components.switch import SwitchEntityDescription, SwitchEntity
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory from homeassistant.helpers.entity import EntityCategory
from homeassistant.core import callback from homeassistant.core import callback
from pyhon.parameter.base import HonParameter from pyhon.parameter.base import HonParameter
from pyhon.parameter.range import HonParameterRange from pyhon.parameter.range import HonParameterRange
@ -333,6 +333,16 @@ SWITCHES: dict[str, tuple[HonSwitchEntityDescription, ...]] = {
key="lightStatus", name="Light", icon="mdi:lightbulb" key="lightStatus", name="Light", icon="mdi:lightbulb"
), ),
), ),
"AP": (
HonSwitchEntityDescription(
key="touchToneStatus",
name="Touch Tone",
),
HonSwitchEntityDescription(
key="lockStatus",
name="Lock Status",
),
),
} }
SWITCHES["WD"] = unique_entities(SWITCHES["WD"], SWITCHES["WM"]) SWITCHES["WD"] = unique_entities(SWITCHES["WD"], SWITCHES["WM"])

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Klimatizační jednotka" "name": "Klimatizační jednotka",
"state_attributes": {
"preset_mode": {
"name": "Programy",
"state": {
"iot_10_heating": "Funkce Vytápění 10 °C",
"iot_auto": "Auto",
"iot_cool": "Chlazení",
"iot_dry": "Odvlhčování",
"iot_fan": "Ventilátor",
"iot_heat": "Vytápění",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Automatické čištění",
"iot_self_clean": "Samočištění zamrazením",
"iot_self_clean_56": "Samočištění 56°C sterilizace ",
"iot_simple_start": "Spustit nyní",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + auto",
"iot_uv_and_cool": "UV + zchlazení",
"iot_uv_and_dry": "UV + odstranění vlhkosti",
"iot_uv_and_fan": "UV + ventilátor",
"iot_uv_and_heat": "UV + ohřev"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Chladnička", "name": "Chladnička",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Klimaanlage" "name": "Klimaanlage",
"state_attributes": {
"preset_mode": {
"name": "Programme",
"state": {
"iot_10_heating": "10°C Heizfunktion",
"iot_auto": "Auto",
"iot_cool": "Kühl",
"iot_dry": "Trocken",
"iot_fan": "Ventilator",
"iot_heat": "Heizen",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Selbst reinigen",
"iot_self_clean": "Self-Clean",
"iot_self_clean_56": "Steri-Clean 56°C",
"iot_simple_start": "Jetzt beginnen",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + Auto",
"iot_uv_and_cool": "UV + Kalt",
"iot_uv_and_dry": "UV + Entfeuchter",
"iot_uv_and_fan": "UV + Gebläse",
"iot_uv_and_heat": "UV + Heizen"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Kühlschrank", "name": "Kühlschrank",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Κλιματιστικό" "name": "Κλιματιστικό",
"state_attributes": {
"preset_mode": {
"name": "Προγράμματα",
"state": {
"iot_10_heating": "10° C Λειτουργία θέρμανσης",
"iot_auto": "Αυτόματο",
"iot_cool": "Ψύξη",
"iot_dry": "Στέγνωμα",
"iot_fan": "Ανεμιστήρας",
"iot_heat": "Ζέστη",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Αυτοκαθαρισμός",
"iot_self_clean": "Αυτοκαθαρισμός",
"iot_self_clean_56": "Steri-Clean 56°C",
"iot_simple_start": "Εκκίνηση τώρα",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + Auto",
"iot_uv_and_cool": "UV + Ψύξη",
"iot_uv_and_dry": "UV + Αφυγραντήρας",
"iot_uv_and_fan": "UV + Ανεμιστήρας",
"iot_uv_and_heat": "UV + Θέρμανση"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Ψυγείο", "name": "Ψυγείο",

View file

@ -1868,7 +1868,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Air conditioner" "name": "Air conditioner",
"state_attributes": {
"preset_mode": {
"name": "Programs",
"state": {
"iot_10_heating": "10°C Heating function",
"iot_auto": "Auto",
"iot_cool": "Cool",
"iot_dry": "Dry",
"iot_fan": "Fan",
"iot_heat": "Heat",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Self-purify",
"iot_self_clean": "Self-clean",
"iot_self_clean_56": "Steri-Clean 56°C",
"iot_simple_start": "Start now",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + Auto",
"iot_uv_and_cool": "UV + Cold",
"iot_uv_and_dry": "UV + Dehumidifier",
"iot_uv_and_fan": "UV + Fan",
"iot_uv_and_heat": "UV + Heat"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Fridge", "name": "Fridge",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Aire acondicionado" "name": "Aire acondicionado",
"state_attributes": {
"preset_mode": {
"name": "Programas",
"state": {
"iot_10_heating": "Función de calentamiento de 10° C",
"iot_auto": "Automático",
"iot_cool": "Frío",
"iot_dry": "Deshumidificar",
"iot_fan": "Ventilador",
"iot_heat": "Calor",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Autopurificar",
"iot_self_clean": "Autolimpieza",
"iot_self_clean_56": "Limpieza desinfectante 56°",
"iot_simple_start": "Iniciar ahora",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + Automático",
"iot_uv_and_cool": "UV + Frío",
"iot_uv_and_dry": "UV + Deshumidificador",
"iot_uv_and_fan": "UV + Ventilador",
"iot_uv_and_heat": "UV + Calor"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Frigorífico", "name": "Frigorífico",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Climatiseur" "name": "Climatiseur",
"state_attributes": {
"preset_mode": {
"name": "Programmes",
"state": {
"iot_10_heating": "Fonction Chauffage 10 °C",
"iot_auto": "Automatique",
"iot_cool": "Frais",
"iot_dry": "Sec",
"iot_fan": "Ventilateur",
"iot_heat": "Chaleur",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Auto-purification",
"iot_self_clean": "Auto-nettoyage",
"iot_self_clean_56": "Steri-Clean 56°C",
"iot_simple_start": "Démarrez maintenant",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + Auto",
"iot_uv_and_cool": "UV + Froid",
"iot_uv_and_dry": "UV + Déshumidificateur",
"iot_uv_and_fan": "UV + ventilateur",
"iot_uv_and_heat": "UV + Chaleur"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Réfrigérateur", "name": "Réfrigérateur",

View file

@ -964,7 +964,15 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Air conditioner" "name": "Air conditioner",
"state_attributes": {
"preset_mode": {
"name": "Programs",
"state": {
"iot_simple_start": "התחל עכשיו"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Fridge", "name": "Fridge",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Klimatizacijski uređaj" "name": "Klimatizacijski uređaj",
"state_attributes": {
"preset_mode": {
"name": "Programi",
"state": {
"iot_10_heating": "Funkcija grijanja na 10 °C",
"iot_auto": "Automatski",
"iot_cool": "Hlađenje",
"iot_dry": "Sušenje",
"iot_fan": "Ventilator",
"iot_heat": "Zagrijavanje",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Sampročišćavanje",
"iot_self_clean": "Samočišćenje",
"iot_self_clean_56": "Sterilno čišćenje 56°C",
"iot_simple_start": "Pokreni sada",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + automatski",
"iot_uv_and_cool": "UV + hladno",
"iot_uv_and_dry": "UV + odvlaživač",
"iot_uv_and_fan": "UV + ventilator",
"iot_uv_and_heat": "UV + grijanje"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Hladnjak", "name": "Hladnjak",

View file

@ -1844,7 +1844,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Condizionatore" "name": "Condizionatore",
"state_attributes": {
"preset_mode": {
"name": "Programmi",
"state": {
"iot_10_heating": "Funzione 10°C Heating ",
"iot_auto": "Auto",
"iot_cool": "Freddo",
"iot_dry": "Deumidificazione",
"iot_fan": "Ventilatore",
"iot_heat": "Caldo",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Self purify",
"iot_self_clean": "Self clean",
"iot_self_clean_56": "Steri-Clean 56°C",
"iot_simple_start": "Avvia ora",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + Auto",
"iot_uv_and_cool": "UV + Freddo",
"iot_uv_and_dry": "UV + Deumidificatore",
"iot_uv_and_fan": "UV + Ventola",
"iot_uv_and_heat": "UV + Caldo"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Frigorifero", "name": "Frigorifero",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Airconditioner" "name": "Airconditioner",
"state_attributes": {
"preset_mode": {
"name": "Programma's",
"state": {
"iot_10_heating": "10°C-verwarmingsfunctie",
"iot_auto": "Automatisch",
"iot_cool": "Koelen",
"iot_dry": "Drogen",
"iot_fan": "Ventilator",
"iot_heat": "Verwarming",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Zelfzuivering",
"iot_self_clean": "Zelfreiniging",
"iot_self_clean_56": "Sterilisatie reiniging 56°C",
"iot_simple_start": "Start nu",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + Auto",
"iot_uv_and_cool": "UV + Koud",
"iot_uv_and_dry": "UV + Ontvochtiger",
"iot_uv_and_fan": "UV + Hetelucht",
"iot_uv_and_heat": "UV + Warmte"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Koelkast", "name": "Koelkast",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Klimatyzator" "name": "Klimatyzator",
"state_attributes": {
"preset_mode": {
"name": "Programy",
"state": {
"iot_10_heating": "Funkcja grzania 10°C",
"iot_auto": "Auto",
"iot_cool": "Chłodzenie",
"iot_dry": "Osuszanie",
"iot_fan": "Wentylator",
"iot_heat": "Grzanie",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Self Purify",
"iot_self_clean": "Self Clean",
"iot_self_clean_56": "Steri Clean 56°C",
"iot_simple_start": "Uruchom teraz",
"iot_uv": "Sterylizacja UVC",
"iot_uv_and_auto": "UV + automat",
"iot_uv_and_cool": "UV + chłodzenie",
"iot_uv_and_dry": "UV + osuszacz powietrza",
"iot_uv_and_fan": "UV + wentylator",
"iot_uv_and_heat": "UV + podgrzewanie"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Lodówka", "name": "Lodówka",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Ar Condicionado" "name": "Ar Condicionado",
"state_attributes": {
"preset_mode": {
"name": "Programas",
"state": {
"iot_10_heating": "Função de aquecimento de 10 °C",
"iot_auto": "Auto",
"iot_cool": "Frio",
"iot_dry": "Secar",
"iot_fan": "Ventilador",
"iot_heat": "Calor",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Autopurificação",
"iot_self_clean": "Autolimpeza",
"iot_self_clean_56": "Steri-Clean 56°C",
"iot_simple_start": "Iniciar agora",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + Auto",
"iot_uv_and_cool": "UV + Frio",
"iot_uv_and_dry": "UV + Desumidificador",
"iot_uv_and_fan": "UV + Ventilação",
"iot_uv_and_heat": "UV + Calor"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Frigorífico", "name": "Frigorífico",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Aer condiționat" "name": "Aer condiționat",
"state_attributes": {
"preset_mode": {
"name": "Programe",
"state": {
"iot_10_heating": "Funcția de încălzire la 10 °C",
"iot_auto": "Automat",
"iot_cool": "Răcire",
"iot_dry": "Uscare",
"iot_fan": "Ventilare",
"iot_heat": "Încălzire",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Auto-purificare",
"iot_self_clean": "Autocurățare",
"iot_self_clean_56": "Curățare-sterilizare la 56°C",
"iot_simple_start": "Începeți acum",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + automat",
"iot_uv_and_cool": "UV + răcire",
"iot_uv_and_dry": "UV + dezumidificator",
"iot_uv_and_fan": "UV + ventilator",
"iot_uv_and_heat": "UV + încălzire"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Frigider", "name": "Frigider",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Кондиционер воздуха" "name": "Кондиционер воздуха",
"state_attributes": {
"preset_mode": {
"name": "Программы",
"state": {
"iot_10_heating": "Функция нагрева до 10°C",
"iot_auto": "Авто",
"iot_cool": "Охлаждение",
"iot_dry": "Сушка",
"iot_fan": "Вентилятор",
"iot_heat": "Нагрев",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Самоочищение",
"iot_self_clean": "Самоочистка",
"iot_self_clean_56": "Steri-Clean 56°C",
"iot_simple_start": "Пуск сейчас",
"iot_uv": "Ультрафиолет",
"iot_uv_and_auto": "УФ + Авто",
"iot_uv_and_cool": "УФ + Охлаждение",
"iot_uv_and_dry": "УФ + Осушитель",
"iot_uv_and_fan": "УФ + Вентилятор",
"iot_uv_and_heat": "УФ + Нагрев"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Холодильник", "name": "Холодильник",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Klimatizácia" "name": "Klimatizácia",
"state_attributes": {
"preset_mode": {
"name": "Programy",
"state": {
"iot_10_heating": "Funkcia vykurovania na 10 °C",
"iot_auto": "Automatika",
"iot_cool": "Chladiť",
"iot_dry": "Sušiť",
"iot_fan": "Ventilátor",
"iot_heat": "Ohrev",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Samoprečisťovanie",
"iot_self_clean": "Samočistenie",
"iot_self_clean_56": "Sterilné čistenie 56°C",
"iot_simple_start": "Spustiť teraz",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + Auto",
"iot_uv_and_cool": "UV + Studené",
"iot_uv_and_dry": "UV + Odvlhčovač",
"iot_uv_and_fan": "UV + Ventilátor",
"iot_uv_and_heat": "UV + Ohrev"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Chladnička", "name": "Chladnička",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Klimatska naprava" "name": "Klimatska naprava",
"state_attributes": {
"preset_mode": {
"name": "Programi",
"state": {
"iot_10_heating": "Funkcija ogrevanja pri 10 °C",
"iot_auto": "Samodejno",
"iot_cool": "Hlajenje",
"iot_dry": "Sušenje",
"iot_fan": "Ventilator",
"iot_heat": "Segrevanje",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Samoočiščevanje",
"iot_self_clean": "Samodejno čiščenje",
"iot_self_clean_56": "Sterilno čiščenje 56°C",
"iot_simple_start": "Zaženi zdaj",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + samodejno",
"iot_uv_and_cool": "UV + hlajenje",
"iot_uv_and_dry": "UV + razvlaževanje",
"iot_uv_and_fan": "UV + ventilator",
"iot_uv_and_heat": "UV + gretje"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Hladilnik", "name": "Hladilnik",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Klima uređaj" "name": "Klima uređaj",
"state_attributes": {
"preset_mode": {
"name": "Programi",
"state": {
"iot_10_heating": "Funkcija grejanja 10° C",
"iot_auto": "Automatski",
"iot_cool": "Hlađenje",
"iot_dry": "Sušenje",
"iot_fan": "Ventilator",
"iot_heat": "Toplota",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Samopročišćavanje",
"iot_self_clean": "Samočišćenje",
"iot_self_clean_56": "Sterilno čišćenje 56°C",
"iot_simple_start": "Pokrenuti sada",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + automatsko",
"iot_uv_and_cool": "UV+ hladno",
"iot_uv_and_dry": "UV + odvlaživač",
"iot_uv_and_fan": "UV + ventilator",
"iot_uv_and_heat": "UV + toplota"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Frižider", "name": "Frižider",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "Klima" "name": "Klima",
"state_attributes": {
"preset_mode": {
"name": "Programlar",
"state": {
"iot_10_heating": "10°C Isıtma fonksiyonu",
"iot_auto": "Otomatik",
"iot_cool": "Soğuk",
"iot_dry": "Kuru",
"iot_fan": "Fan",
"iot_heat": "Isı",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "Kendi kendini arındırma",
"iot_self_clean": "Kendi kendini temizleme",
"iot_self_clean_56": "Steril Temizleme 56°C",
"iot_simple_start": "Şimdi başlat",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + Otomatik",
"iot_uv_and_cool": "UV + Soğuk",
"iot_uv_and_dry": "UV + Nem giderici",
"iot_uv_and_fan": "UV + Fan",
"iot_uv_and_heat": "UV + Isıtma"
}
}
}
}, },
"fridge": { "fridge": {
"name": "Buzdolabı", "name": "Buzdolabı",

View file

@ -1839,7 +1839,31 @@
}, },
"climate": { "climate": {
"air_conditioner": { "air_conditioner": {
"name": "空调" "name": "空调",
"state_attributes": {
"preset_mode": {
"name": "程序",
"state": {
"iot_10_heating": "10°C 加热功能",
"iot_auto": "自动",
"iot_cool": "冷却",
"iot_dry": "烘干",
"iot_fan": "风扇",
"iot_heat": "加热",
"iot_nano_aqua": "Nano Aqua",
"iot_purify": "自净",
"iot_self_clean": "自洁",
"iot_self_clean_56": "无菌清洁 56°C",
"iot_simple_start": "立即启动",
"iot_uv": "UV",
"iot_uv_and_auto": "UV + 自动",
"iot_uv_and_cool": "UV + 制冷",
"iot_uv_and_dry": "UV + 减湿器",
"iot_uv_and_fan": "UV + 风扇",
"iot_uv_and_heat": "UV + 加热"
}
}
}
}, },
"fridge": { "fridge": {
"name": "冰箱", "name": "冰箱",

29
info.md
View file

@ -10,11 +10,12 @@ Support for home appliances of [Haier's mobile app hOn](https://hon-smarthome.co
- [Washer Dryer](https://github.com/Andre0512/hon#washer-dryer) - [Washer Dryer](https://github.com/Andre0512/hon#washer-dryer)
- [Oven](https://github.com/Andre0512/hon#oven) - [Oven](https://github.com/Andre0512/hon#oven)
- [Dish Washer](https://github.com/Andre0512/hon#dish-washer) - [Dish Washer](https://github.com/Andre0512/hon#dish-washer)
- [Air conditioner](https://github.com/Andre0512/hon#air-conditioner) - [Air Conditioner](https://github.com/Andre0512/hon#air-conditioner)
- [Fridge](https://github.com/Andre0512/hon#fridge) - [Fridge](https://github.com/Andre0512/hon#fridge)
- [Hob](https://github.com/Andre0512/hon#hob) [BETA] - [Induction Hob](https://github.com/Andre0512/hon#induction-hob) [BETA]
- [Hood](https://github.com/Andre0512/hon#hood) [BETA] - [Hood](https://github.com/Andre0512/hon#hood) [BETA]
- [Wine Cellar](https://github.com/Andre0512/hon#wine-cellar) [BETA] - [Wine Cellar](https://github.com/Andre0512/hon#wine-cellar) [BETA]
- [Air Purifier](https://github.com/Andre0512/hon#air-purifier) [BETA]
## Configuration ## Configuration
@ -26,18 +27,18 @@ _If the integration is not in the list, you need to clear the browser cache._
## Supported Models ## Supported Models
Support has been confirmed for these models, but many more will work. Please add already supported devices [with this form to complete the list](https://forms.gle/bTSD8qFotdZFytbf8). Support has been confirmed for these models, but many more will work. Please add already supported devices [with this form to complete the list](https://forms.gle/bTSD8qFotdZFytbf8).
| | **Haier** | **Hoover** | **Candy** | | | **Haier** | **Hoover** | **Candy** |
|---------------------|------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------| |---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------|
| **Washing Machine** | HW90-B14TEAM5 <br/> HW100-B14959U1 | H-WASH 500 <br/> H7W4 48MBC-S | RO441286DWMC4-07 <br/> HW 68AMC/1-80 <br/> HWPD 69AMBC/1-S | | **Washing Machine** | HW90-B14TEAM5 <br/> HW100-B14959U1 | H-WASH 500 <br/> H7W4 48MBC-S | CO4 107T1/2-07 <br/> CBWO49TWME-S <br/> RO44 1286DWMC4-07 <br/> HW 68AMC/1-80 <br/> HWPD 69AMBC/1-S |
| **Tumble Dryer** | HD80-A3959 | H-DRY 500 <br/> H9A3TCBEXS-S <br/> HLE C10DCE-80 <br/> NDE H10A2TCE-80 <br/> NDE H9A2TSBEXS-S <br/> NDPHY10A2TCBEXSS | BCTDH7A1TE <br/> CSOE C10DE-80 <br/> ROE H9A3TCEX-S | | **Tumble Dryer** | HD80-A3959 | H-DRY 500 <br/> H9A3TCBEXS-S <br/> HLE C10DCE-80 <br/> NDE H10A2TCE-80 <br/> NDE H9A2TSBEXS-S <br/> NDPHY10A2TCBEXSS | BCTDH7A1TE <br/> CSOE C10DE-80 <br/> ROE H9A3TCEX-S |
| **Washer Dryer** | HWD100-B14979 | HWPS4954DAMR-11 | RPW41066BWMR/1-S | | **Washer Dryer** | HWD100-B14979 | HWPS4954DAMR-11 | RPW41066BWMR/1-S |
| **Oven** | HWO60SM2F3XH | HSOT3161WG | | | **Oven** | HWO60SM2F3XH | HSOT3161WG | |
| **Dish Washer** | XIB 3B2SFS-80 <br/> XIB 6B2D3FB | HFB 6B2S3FX | | | **Dish Washer** | XIB 3B2SFS-80 <br/> XIB 6B2D3FB | HFB 6B2S3FX | |
| **Air conditioner** | AD105S2SM3FA <br/> AS20HPL1HRA <br/> AS25PBAHRA <br/> AS25S2SF1FA-WH <br/> AS25TADHRA-2 <br/> AS35TADHRA-2 <br/> | | | | **Air Conditioner** | AD105S2SM3FA <br/> AS20HPL1HRA <br/> AS25PBAHRA <br/> AS25S2SF1FA-WH <br/> AS25TADHRA-2 <br/> AS35S2SF2FA-3 <br/> AS35TADHRA-2 <br/> AS35TAMHRA-C | | |
| **Fridge** | HFW7720ENMB | | CCE4T620EWU | | **Fridge** | HFW7720ENMB | | CCE4T620EWU |
| **Hob** | HA2MTSJ68MC | | CIS633SCTTWIFI | | **Hob** | HA2MTSJ68MC | | CIS633SCTTWIFI |
| **Hood** | HADG6DS46BWIFI | | | | **Hood** | HADG6DS46BWIFI | | |
| **Wine Cellar** | HWS247FDU1 | | | | **Wine Cellar** | HWS247FDU1 | | |
## Supported Languages ## Supported Languages
Translation of internal names like programs are available for all languages which are official supported by the hOn app: Translation of internal names like programs are available for all languages which are official supported by the hOn app:

View file

@ -22,21 +22,21 @@ from custom_components.hon.switch import (
) )
APPLIANCES = { APPLIANCES = {
"AC": "Air conditioner", "AC": "Air Conditioner",
"AP": "Air purifier", "AP": "Air Purifier",
"AS": "Air scanner", "AS": "Air Scanner",
"DW": "Dish washer", "DW": "Dish Washer",
"HO": "Hood", "HO": "Hood",
"IH": "Hob", "IH": "Induction Hob",
"MW": "Microwave", "MW": "Microwave",
"OV": "Oven", "OV": "Oven",
"REF": "Fridge", "REF": "Fridge",
"RVC": "Robot vacuum cleaner", "RVC": "Robot Vacuum Cleaner",
"TD": "Tumble dryer", "TD": "Tumble Dryer",
"WC": "Wine Cellar", "WC": "Wine Cellar",
"WD": "Washer dryer", "WD": "Washer Dryer",
"WH": "Water Heater", "WH": "Water Heater",
"WM": "Washing machine", "WM": "Washing Machine",
} }
ENTITY_CATEGORY_SORT = ["control", "config", "sensor"] ENTITY_CATEGORY_SORT = ["control", "config", "sensor"]

View file

@ -159,6 +159,12 @@ CLIMATE = {
"state": "PROGRAMS.OV", "state": "PROGRAMS.OV",
} }
}, },
"air_conditioner": {
"preset_mode": {
"name": "OV.TABS.PROGRAMS_TITLE",
"state": "PROGRAMS.AC",
}
},
"wine": { "wine": {
"preset_mode": { "preset_mode": {
"name": "WC.NAME", "name": "WC.NAME",