Compare commits

...

5 Commits

Author SHA1 Message Date
5f9dbef4fc Add dishwasher #21 2023-04-16 21:55:47 +02:00
2aa1d3df01 Correct name for IH #22 2023-04-16 13:56:58 +02:00
e2f7f15a5f Bump pyhon for #22 2023-04-15 22:28:01 +02:00
d91b3edb40 Use unique_id instead of mac address for #22 2023-04-15 22:05:02 +02:00
83c5e3479e Add hob support #22 2023-04-15 04:34:12 +02:00
11 changed files with 454 additions and 41 deletions

View File

@ -5,11 +5,12 @@
[![Home Assistant installs](https://img.shields.io/badge/dynamic/json?color=blue&label=usage&suffix=%20installs&cacheSeconds=15600&url=https://analytics.home-assistant.io/custom_integrations.json&query=$.hon.total)](https://analytics.home-assistant.io/)
Home Assistant integration for Haier hOn: support for Haier/Candy/Hoover home appliances like washing machines.
## Supported Appliances
- Washing Machine
- Tumble Dryer
- Washer Dryer
- Washing Machine
- Oven
- Hob
- Dish Washer
## 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)

View File

@ -104,14 +104,14 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = {
"OV": (
HonBinarySensorEntityDescription(
key="attributes.lastConnEvent.category",
name="Online",
name="Connection",
device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="CONNECTED",
icon="mdi:wifi",
),
HonBinarySensorEntityDescription(
key="attributes.parameters.remoteCtrValid",
name="On",
name="Remote Control",
device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="1",
icon="mdi:remote",
@ -124,6 +124,69 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = {
icon="mdi:power-cycle",
),
),
"IH": (
HonBinarySensorEntityDescription(
key="attributes.lastConnEvent.category",
name="Connection",
device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="CONNECTED",
icon="mdi:wifi",
),
HonBinarySensorEntityDescription(
key="attributes.parameters.remoteCtrValid",
name="Remote Control",
device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="1",
icon="mdi:remote",
),
HonBinarySensorEntityDescription(
key="attributes.parameters.onOffStatus",
name="On",
device_class=BinarySensorDeviceClass.RUNNING,
on_value="1",
icon="mdi:power-cycle",
),
HonBinarySensorEntityDescription(
key="hotStatus",
name="Hot Status",
device_class=BinarySensorDeviceClass.HEAT,
on_value="1",
),
HonBinarySensorEntityDescription(
key="hobLockStatus",
name="Hob Lock",
device_class=BinarySensorDeviceClass.LOCK,
on_value="0",
),
),
"DW": (
HonBinarySensorEntityDescription(
key="saltStatus",
name="Salt",
device_class=BinarySensorDeviceClass.PROBLEM,
on_value="1",
icon="mdi:shaker-outline",
),
HonBinarySensorEntityDescription(
key="rinseAidStatus",
name="Rinse Aid",
device_class=BinarySensorDeviceClass.PROBLEM,
on_value="1",
icon="mdi:spray-bottle",
),
HonBinarySensorEntityDescription(
key="attributes.lastConnEvent.category",
name="Connection",
device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="CONNECTED",
),
HonBinarySensorEntityDescription(
key="doorStatus",
name="Door",
device_class=BinarySensorDeviceClass.DOOR,
on_value="1",
),
),
}
@ -132,11 +195,11 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
coordinators = hass.data[DOMAIN]["coordinators"]
appliances = []
for device in hon.appliances:
if device.mac_address in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address]
if device.unique_id in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.unique_id]
else:
coordinator = HonCoordinator(hass, device)
hass.data[DOMAIN]["coordinators"][device.mac_address] = coordinator
hass.data[DOMAIN]["coordinators"][device.unique_id] = coordinator
await coordinator.async_config_entry_first_refresh()
if descriptions := BINARY_SENSORS.get(device.appliance_type):

View File

@ -25,7 +25,14 @@ BUTTONS: dict[str, tuple[ButtonEntityDescription, ...]] = {
name="Stop Program",
icon="mdi:power-off",
),
)
),
"IH": (
ButtonEntityDescription(
key="startProgram",
name="Start Program",
icon="mdi:pot-steam",
),
),
}
@ -34,11 +41,11 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
coordinators = hass.data[DOMAIN]["coordinators"]
appliances = []
for device in hon.appliances:
if device.mac_address in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address]
if device.unique_id in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.unique_id]
else:
coordinator = HonCoordinator(hass, device)
hass.data[DOMAIN]["coordinators"][device.mac_address] = coordinator
hass.data[DOMAIN]["coordinators"][device.unique_id] = coordinator
await coordinator.async_config_entry_first_refresh()
if descriptions := BUTTONS.get(device.appliance_type):

View File

@ -22,12 +22,12 @@ class HonEntity(CoordinatorEntity):
self._hass = hass
self._device = device
self._attr_unique_id = self._device.mac_address
self._attr_unique_id = self._device.unique_id
@property
def device_info(self):
return DeviceInfo(
identifiers={(DOMAIN, self._device.mac_address)},
identifiers={(DOMAIN, self._device.unique_id)},
manufacturer=self._device.get("brand", ""),
name=self._device.nick_name
if self._device.nick_name
@ -43,7 +43,7 @@ class HonCoordinator(DataUpdateCoordinator):
super().__init__(
hass,
_LOGGER,
name=device.mac_address,
name=device.unique_id,
update_interval=timedelta(seconds=30),
)
self._device = device

View File

@ -6,6 +6,6 @@
"documentation": "https://github.com/Andre0512/hon/",
"iot_class": "cloud_polling",
"issue_tracker": "https://github.com/Andre0512/hon/issues",
"requirements": ["pyhOn==0.7.4"],
"version": "0.5.1"
"requirements": ["pyhOn==0.8.0b5"],
"version": "0.6.0-beta.5"
}

View File

@ -1,7 +1,7 @@
from __future__ import annotations
from pyhon import Hon
from pyhon.parameter import HonParameterRange
from pyhon.parameter.range import HonParameterRange
from homeassistant.components.number import (
NumberEntity,
@ -106,6 +106,35 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = {
native_unit_of_measurement=UnitOfTime.MINUTES,
),
),
"IH": (
NumberEntityDescription(
key="startProgram.temp",
name="Temperature",
entity_category=EntityCategory.CONFIG,
icon="mdi:thermometer",
),
NumberEntityDescription(
key="startProgram.powerManagement",
name="Power Management",
entity_category=EntityCategory.CONFIG,
icon="mdi:timelapse",
),
),
"DW": (
NumberEntityDescription(
key="startProgram.delayTime",
name="Delay time",
icon="mdi:timer-plus",
entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=UnitOfTime.MINUTES,
),
NumberEntityDescription(
key="startProgram.waterHard",
name="Water hard",
icon="mdi:water",
entity_category=EntityCategory.CONFIG,
),
),
}
@ -114,11 +143,11 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
coordinators = hass.data[DOMAIN]["coordinators"]
appliances = []
for device in hon.appliances:
if device.mac_address in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address]
if device.unique_id in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.unique_id]
else:
coordinator = HonCoordinator(hass, device)
hass.data[DOMAIN]["coordinators"][device.mac_address] = coordinator
hass.data[DOMAIN]["coordinators"][device.unique_id] = coordinator
await coordinator.async_config_entry_first_refresh()
if descriptions := NUMBERS.get(device.appliance_type):

View File

@ -4,7 +4,7 @@ import logging
from pyhon import Hon
from pyhon.appliance import HonAppliance
from pyhon.parameter import HonParameterFixed
from pyhon.parameter.fixed import HonParameterFixed
from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.config_entries import ConfigEntry
@ -68,6 +68,7 @@ SELECTS = {
key="startProgram.program",
name="Program",
entity_category=EntityCategory.CONFIG,
translation_key="programs",
),
SelectEntityDescription(
key="startProgram.preheatStatus",
@ -75,6 +76,22 @@ SELECTS = {
entity_category=EntityCategory.CONFIG,
),
),
"IH": (
SelectEntityDescription(
key="startProgram.program",
name="Program",
entity_category=EntityCategory.CONFIG,
translation_key="programs",
),
),
"DW": (
SelectEntityDescription(
key="startProgram.program",
name="Program",
entity_category=EntityCategory.CONFIG,
translation_key="programs_dw",
),
),
}
@ -83,11 +100,11 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
coordinators = hass.data[DOMAIN]["coordinators"]
appliances = []
for device in hon.appliances:
if device.mac_address in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address]
if device.unique_id in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.unique_id]
else:
coordinator = HonCoordinator(hass, device)
hass.data[DOMAIN]["coordinators"][device.mac_address] = coordinator
hass.data[DOMAIN]["coordinators"][device.unique_id] = coordinator
await coordinator.async_config_entry_first_refresh()
if descriptions := SELECTS.get(device.appliance_type):

View File

@ -21,6 +21,7 @@ from homeassistant.const import (
from homeassistant.core import callback
from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.typing import StateType
from homeassistant.const import PERCENTAGE
from .const import DOMAIN
from .hon import HonCoordinator, HonEntity
@ -221,6 +222,85 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
icon="mdi:thermometer",
),
),
"IH": (
SensorEntityDescription(
key="remainingTimeMM",
name="Remaining Time",
icon="mdi:timer",
native_unit_of_measurement=UnitOfTime.MINUTES,
),
SensorEntityDescription(
key="temp",
name="Temperature",
icon="mdi:thermometer",
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
),
SensorEntityDescription(key="errors", name="Error", icon="mdi:math-log"),
),
"DW": (
SensorEntityDescription(
key="startProgram.ecoIndex",
name="Eco Index",
icon="mdi:sprout",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.CONFIG,
),
SensorEntityDescription(
key="startProgram.waterEfficiency",
name="Water Efficiency",
icon="mdi:water",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.CONFIG,
),
SensorEntityDescription(
key="startProgram.waterSaving",
name="Water Saving",
icon="mdi:water-percent",
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=PERCENTAGE,
entity_category=EntityCategory.CONFIG,
),
SensorEntityDescription(
key="startProgram.temp",
name="Temperature",
icon="mdi:thermometer",
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
entity_category=EntityCategory.CONFIG,
),
SensorEntityDescription(
key="startProgram.energyLabel",
name="Energy Label",
icon="mdi:lightning-bolt-circle",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.CONFIG,
),
SensorEntityDescription(
key="startProgram.remainingTime",
name="Time",
icon="mdi:timer",
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfTime.MINUTES,
entity_category=EntityCategory.CONFIG,
),
SensorEntityDescription(
key="machMode",
name="Machine Status",
icon="mdi:information",
translation_key="mode_dw",
),
SensorEntityDescription(
key="errors", name="Error", icon="mdi:math-log", translation_key="errors"
),
SensorEntityDescription(
key="remainingTimeMM",
name="Remaining Time",
icon="mdi:timer",
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfTime.MINUTES,
),
),
}
@ -229,11 +309,11 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
coordinators = hass.data[DOMAIN]["coordinators"]
appliances = []
for device in hon.appliances:
if device.mac_address in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address]
if device.unique_id in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.unique_id]
else:
coordinator = HonCoordinator(hass, device)
hass.data[DOMAIN]["coordinators"][device.mac_address] = coordinator
hass.data[DOMAIN]["coordinators"][device.unique_id] = coordinator
await coordinator.async_config_entry_first_refresh()
if descriptions := SENSORS.get(device.appliance_type):

View File

@ -1,5 +1,4 @@
import logging
from dataclasses import dataclass
from typing import Any
@ -8,6 +7,7 @@ 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 .const import DOMAIN
from .hon import HonCoordinator, HonEntity
@ -89,6 +89,51 @@ SWITCHES: dict[str, tuple[HonSwitchEntityDescription, ...]] = {
turn_off_key="resumeProgram",
),
),
"DW": (
HonSwitchEntityDescription(
key="active",
name="Dish Washer",
icon="mdi:dishwasher",
turn_on_key="startProgram",
turn_off_key="stopProgram",
),
HonSwitchEntityDescription(
key="startProgram.extraDry",
name="Extra Dry",
icon="mdi:hair-dryer",
entity_category=EntityCategory.CONFIG,
),
HonSwitchEntityDescription(
key="startProgram.halfLoad",
name="Half Load",
icon="mdi:fraction-one-half",
entity_category=EntityCategory.CONFIG,
),
HonSwitchEntityDescription(
key="startProgram.openDoor",
name="Open Door",
icon="mdi:door-open",
entity_category=EntityCategory.CONFIG,
),
HonSwitchEntityDescription(
key="startProgram.threeInOne",
name="Three in One",
icon="mdi:numeric-3-box-outline",
entity_category=EntityCategory.CONFIG,
),
HonSwitchEntityDescription(
key="startProgram.ecoExpress",
name="Eco Express",
icon="mdi:sprout",
entity_category=EntityCategory.CONFIG,
),
HonSwitchEntityDescription(
key="startProgram.addDish",
name="Add Dish",
icon="mdi:silverware-fork-knife",
entity_category=EntityCategory.CONFIG,
),
),
}
@ -97,11 +142,11 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
coordinators = hass.data[DOMAIN]["coordinators"]
appliances = []
for device in hon.appliances:
if device.mac_address in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address]
if device.unique_id in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.unique_id]
else:
coordinator = HonCoordinator(hass, device)
hass.data[DOMAIN]["coordinators"][device.mac_address] = coordinator
hass.data[DOMAIN]["coordinators"][device.unique_id] = coordinator
await coordinator.async_config_entry_first_refresh()
if descriptions := SWITCHES.get(device.appliance_type):
@ -138,13 +183,6 @@ class HonSwitchEntity(HonEntity, SwitchEntity):
self.entity_description = description
self._attr_unique_id = f"{super().unique_id}{description.key}"
def available(self) -> bool:
if self.entity_category == EntityCategory.CONFIG:
return (
self._device.settings[self.entity_description.key].typology != "fixed"
)
return True
@property
def is_on(self) -> bool | None:
"""Return True if entity is on."""
@ -160,7 +198,9 @@ class HonSwitchEntity(HonEntity, SwitchEntity):
async def async_turn_on(self, **kwargs: Any) -> None:
if self.entity_category == EntityCategory.CONFIG:
setting = self._device.settings[self.entity_description.key]
setting.value = setting.max
setting.value = (
setting.max if isinstance(setting, HonParameterRange) else "1"
)
self.async_write_ha_state()
else:
await self._device.commands[self.entity_description.turn_on_key].send()
@ -168,7 +208,9 @@ class HonSwitchEntity(HonEntity, SwitchEntity):
async def async_turn_off(self, **kwargs: Any) -> None:
if self.entity_category == EntityCategory.CONFIG:
setting = self._device.settings[self.entity_description.key]
setting.value = setting.min
setting.value = (
setting.min if isinstance(setting, HonParameterRange) else "0"
)
self.async_write_ha_state()
else:
await self._device.commands[self.entity_description.turn_off_key].send()

View File

@ -72,6 +72,16 @@
"13": "Ready to Store H-2",
"14": "Extra Dry H-3"
}
},
"mode_dw": {
"state": {
"0": "Disconnected",
"1": "Ready",
"2": "Running",
"3": "Delayed start",
"5": "Delayed start cancelled",
"7": "Finished"
}
}
},
"select": {
@ -402,7 +412,170 @@
"wool": "Wool",
"wool_and_delicates_49": "Wool and Delicates 49'",
"wool_dry": "Wool Dry",
"wool_soft_care": "Wool and Soft Car"
"wool_soft_care": "Wool and Soft Car",
"bakery": "Pasta and Pastries",
"bakery_steam": "Steam-baked bread",
"bottom_heating": "Bottom Heating",
"bottom_heating_fan": "Bottom Heating + Fan",
"bread": "Bread",
"bread_steam": "Steam-baked pastries",
"combi": "Combi",
"convection_fan": "Convection + Fan",
"convection_fan_turnspit": "Convection + Fan + Turnspit",
"conventional": "Conventional",
"conventional_turnspit": "Convection + Turnspit",
"defrost": "Defrost",
"descaling": "Descaling",
"fish": "Fish",
"fish_steam": "Steam-cooked fish",
"grill_cata": "Grill",
"grill_fan_cata": "Grill fan",
"grill_fan_pyro": "Grill + Fan",
"grill_pyro": "Grill",
"h20_clean": "H2O-Clean",
"iot_bread": "Bread",
"iot_h20_clean": "h2O clean",
"leavening": "Leavening",
"light_fan": "Light Fan",
"low_temp_cooking": "Low Temperature Cooking",
"low_temp_cooking_fish": "Low Temperature Cooking - Fish",
"low_temp_cooking_fish_steam": "Low Temperature Steam Cooking - Fish",
"low_temp_cooking_meat": "Low Temperature Cooking - Meat",
"low_temp_cooking_meat_steam": "Low Temperature Steam Cooking - Meat",
"low_temp_cooking_steam": "Low Temperature Steam Cooking",
"meat": "Meat",
"meat_steam": "Steam-cooked meat",
"multi_level": "Multi-Level",
"paella": "Paella",
"pasta_and_bakery": "Pasta and Bakery",
"pizza": "Pizza",
"pyrolysis": "Pyrolysis",
"pyrolysis_plus": "Pyrolysis +",
"red_meat": "Red Meat",
"red_meat_steam": "Steam-cooked red meat",
"regenerate": "Regeneration",
"soft_plus": "Soft+",
"super_grill": "Super Grill",
"tailor_bake": "Tailor bake",
"tailor_bake_cata": "Tailor Bake",
"tailor_bake_pyro": "Tailor Bake",
"vegetables": "Vegetables",
"vegetables_cata": "Vegetables",
"vegetables_pyro": "Vegetables",
"water_discharge": "Water Drain",
"white_meat": "White Meat",
"white_meat_steam": "Steam-cooked white meat",
"iot_standard_boiling": "Boiling",
"iot_standard_frying": "Frying",
"iot_standard_keep_warm": "Keep Warm",
"iot_standard_melting": "Melting",
"iot_standard_simmering": "Simmering"
}
},
"programs_dw": {
"state": {
"59_min": "Rapid 59'",
"auto_care": "Auto Care",
"auto_care_soil": "Auto Care",
"auto_hygiene": "Auto Hygiene",
"auto_plus": "AutoPlus",
"auto_rapid": "Auto Rapid",
"auto_sensor": "Auto Sensor",
"auto_sensor_soil": "Auto Sensor",
"auto_universal": "Auto Universal 50 - 60°C",
"auto_universal_plus": "Auto Universal+ 65 - 75°C",
"auto_universal_plus_soil": "Auto Universal+ 65 - 75°C",
"auto_universal_soil": "Auto Universal 50 - 60°C",
"auto_wash": "Auto Wash",
"auto_wash_soil": "Auto Wash",
"classe_a_59": "A Wash 59' 65°C",
"delicate": "Delicate 45°C",
"dishwasher_care": "Limescale cleaning",
"eco": "Eco",
"eco_asynch": "Eco 45°C",
"eco_bldc": "Eco 45°C",
"eco_synch": "Eco 45°C",
"gentle_wash": "Gentle wash",
"glass": "Glass",
"glassware": "Glassware 45°C",
"glass_care": "Glass Care",
"hygiene": "Hygiene",
"hygiene_plus": "Hygiene+ 75°C",
"intensive": "Intensive",
"intensive_rapid": "Intensive Rapid",
"iot_auto_sensor": "Auto Sensor",
"iot_auto_universal_soil": "Auto Universal 50 - 60°C",
"iot_auto_wash_soil": "Auto Wash",
"iot_baby_care": "Baby Care",
"iot_breakfast": "Breakfast",
"iot_checkup": "Check-Up",
"iot_china_crystals": "China Crystals",
"iot_classe_a_59": "Rapid 59'",
"iot_cocktail_glasses": "Coktail Glasses",
"iot_cocktail_glasses_soil": "Coktail Glasses",
"iot_daily_care": "Daily Care",
"iot_daily_care_soil": "Daily Care",
"iot_delicate": "Delicate 45°C",
"iot_dinner_for_two": "Dinner for 2",
"iot_dinner_for_two_soil": "Dinner for 2",
"iot_dreft_quick_cycle": "Dreft Quick",
"iot_eco_asynch": "Eco 45°C",
"iot_eco_bldc": "Eco 45°C",
"iot_eco_synch": "Eco 45°C",
"iot_extra_hygiene": "Extra Hygiene",
"iot_fairy_quick_cycle": "Fairy Short",
"iot_happy_hour": "Happy Hour",
"iot_jar_quick_cycle": "Jar Quick",
"iot_party": "Party",
"iot_party_soil": "Party",
"iot_pizza_menu": "Pizza Menu",
"iot_pizza_menu_soil": "Pizza Menu",
"iot_plastic_tupperware": "Plastic & Tupperware",
"iot_porcelain": "Porcelain",
"iot_pot_and_pans": "Pot & Pans",
"iot_pot_and_pans_soil": "Pot & Pans",
"iot_power_mix_wash": "Power Mix Wash",
"iot_power_mix_wash_soil": "Power Mix Wash",
"iot_prewash": "Pre-wash",
"iot_pyrex_and_glassware": "Pyrex & Glassware",
"iot_rapid_29": "Rapid 29'",
"iot_rapid_39": "Rapid 39' 60°C",
"iot_single": "Single",
"iot_steam": "Steam 75°C",
"iot_super_flash": "Super Flash",
"iot_super_wash": "Super Wash",
"iot_turbopower": "TurboPower",
"iot_universal": "Universal 60°C",
"iot_wok_grids_maxi_pans": "Special Pans (Wok, Grids & Maxi Pans)",
"iot_wok_grids_maxi_pans_soil": "Special Pans (Wok, Grids & Maxi Pans)",
"iot_yes_quick_cycle": "Yes Quick",
"night": "Night 55°C",
"prewash": "Pre-wash",
"rapid_20": "Rapid 20'",
"rapid_24": "Rapid 24'",
"rapid_29": "Rapid 29' 50°C",
"rapid_35": "Wash&Dry 35'",
"rapid_39": "Rapid 39' 60°C",
"rapid_49": "Rapid 49'",
"rapid_59": "Rapid 59'",
"sanitising": "Sanitising",
"silence": "Silence",
"silent": "Silent",
"silent_care": "Silent Care",
"smart_ai": "Smart AI",
"smart_ai_pro": "Smart AI Pro",
"smart_ai_rapid": "Smart AI Rapid",
"special": "Special",
"special_pw_prz": "Special",
"steam": "Steam 75°C",
"steam_plus": "Steam Plus 75°C",
"total_care": "Total Care 50°C",
"ultra_silence": "Ultra Silence 55°C",
"ultra_silent": "Ultra Silent 55°C",
"universal": "Universal 60°C",
"universal_plus": "Universal Plus 70°C",
"zone_wash": "Flex Zone Wash",
"zoom_39": "Zoom 39 min"
}
}
}

View File

@ -9,6 +9,7 @@ Support for home appliances of Haier's mobile app hOn.
- Washer Dryer
- Washing Machine
- Oven
- Hob
## Tested Appliances
- Haier WD90-B14TEAM5