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 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. Home Assistant integration for Haier hOn: support for Haier/Candy/Hoover home appliances like washing machines.
## Supported Appliances ## Supported Appliances
- Washing Machine
- Tumble Dryer - Tumble Dryer
- Washer Dryer - Washer Dryer
- Washing Machine
- Oven - Oven
- Hob
- Dish Washer
## 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)

View File

@ -104,14 +104,14 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = {
"OV": ( "OV": (
HonBinarySensorEntityDescription( HonBinarySensorEntityDescription(
key="attributes.lastConnEvent.category", key="attributes.lastConnEvent.category",
name="Online", name="Connection",
device_class=BinarySensorDeviceClass.CONNECTIVITY, device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="CONNECTED", on_value="CONNECTED",
icon="mdi:wifi", icon="mdi:wifi",
), ),
HonBinarySensorEntityDescription( HonBinarySensorEntityDescription(
key="attributes.parameters.remoteCtrValid", key="attributes.parameters.remoteCtrValid",
name="On", name="Remote Control",
device_class=BinarySensorDeviceClass.CONNECTIVITY, device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="1", on_value="1",
icon="mdi:remote", icon="mdi:remote",
@ -124,6 +124,69 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = {
icon="mdi:power-cycle", 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"] coordinators = hass.data[DOMAIN]["coordinators"]
appliances = [] appliances = []
for device in hon.appliances: for device in hon.appliances:
if device.mac_address in coordinators: if device.unique_id in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address] coordinator = hass.data[DOMAIN]["coordinators"][device.unique_id]
else: else:
coordinator = HonCoordinator(hass, device) 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() await coordinator.async_config_entry_first_refresh()
if descriptions := BINARY_SENSORS.get(device.appliance_type): if descriptions := BINARY_SENSORS.get(device.appliance_type):

View File

@ -25,7 +25,14 @@ BUTTONS: dict[str, tuple[ButtonEntityDescription, ...]] = {
name="Stop Program", name="Stop Program",
icon="mdi:power-off", 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"] coordinators = hass.data[DOMAIN]["coordinators"]
appliances = [] appliances = []
for device in hon.appliances: for device in hon.appliances:
if device.mac_address in coordinators: if device.unique_id in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address] coordinator = hass.data[DOMAIN]["coordinators"][device.unique_id]
else: else:
coordinator = HonCoordinator(hass, device) 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() await coordinator.async_config_entry_first_refresh()
if descriptions := BUTTONS.get(device.appliance_type): if descriptions := BUTTONS.get(device.appliance_type):

View File

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

View File

@ -6,6 +6,6 @@
"documentation": "https://github.com/Andre0512/hon/", "documentation": "https://github.com/Andre0512/hon/",
"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": ["pyhOn==0.7.4"], "requirements": ["pyhOn==0.8.0b5"],
"version": "0.5.1" "version": "0.6.0-beta.5"
} }

View File

@ -1,7 +1,7 @@
from __future__ import annotations from __future__ import annotations
from pyhon import Hon from pyhon import Hon
from pyhon.parameter import HonParameterRange from pyhon.parameter.range import HonParameterRange
from homeassistant.components.number import ( from homeassistant.components.number import (
NumberEntity, NumberEntity,
@ -106,6 +106,35 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = {
native_unit_of_measurement=UnitOfTime.MINUTES, 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"] coordinators = hass.data[DOMAIN]["coordinators"]
appliances = [] appliances = []
for device in hon.appliances: for device in hon.appliances:
if device.mac_address in coordinators: if device.unique_id in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address] coordinator = hass.data[DOMAIN]["coordinators"][device.unique_id]
else: else:
coordinator = HonCoordinator(hass, device) 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() await coordinator.async_config_entry_first_refresh()
if descriptions := NUMBERS.get(device.appliance_type): if descriptions := NUMBERS.get(device.appliance_type):

View File

@ -4,7 +4,7 @@ import logging
from pyhon import Hon from pyhon import Hon
from pyhon.appliance import HonAppliance 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.components.select import SelectEntity, SelectEntityDescription
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
@ -68,6 +68,7 @@ SELECTS = {
key="startProgram.program", key="startProgram.program",
name="Program", name="Program",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
translation_key="programs",
), ),
SelectEntityDescription( SelectEntityDescription(
key="startProgram.preheatStatus", key="startProgram.preheatStatus",
@ -75,6 +76,22 @@ SELECTS = {
entity_category=EntityCategory.CONFIG, 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"] coordinators = hass.data[DOMAIN]["coordinators"]
appliances = [] appliances = []
for device in hon.appliances: for device in hon.appliances:
if device.mac_address in coordinators: if device.unique_id in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address] coordinator = hass.data[DOMAIN]["coordinators"][device.unique_id]
else: else:
coordinator = HonCoordinator(hass, device) 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() await coordinator.async_config_entry_first_refresh()
if descriptions := SELECTS.get(device.appliance_type): if descriptions := SELECTS.get(device.appliance_type):

View File

@ -21,6 +21,7 @@ from homeassistant.const import (
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.typing import StateType from homeassistant.helpers.typing import StateType
from homeassistant.const import PERCENTAGE
from .const import DOMAIN from .const import DOMAIN
from .hon import HonCoordinator, HonEntity from .hon import HonCoordinator, HonEntity
@ -221,6 +222,85 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
icon="mdi:thermometer", 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"] coordinators = hass.data[DOMAIN]["coordinators"]
appliances = [] appliances = []
for device in hon.appliances: for device in hon.appliances:
if device.mac_address in coordinators: if device.unique_id in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address] coordinator = hass.data[DOMAIN]["coordinators"][device.unique_id]
else: else:
coordinator = HonCoordinator(hass, device) 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() await coordinator.async_config_entry_first_refresh()
if descriptions := SENSORS.get(device.appliance_type): if descriptions := SENSORS.get(device.appliance_type):

View File

@ -1,5 +1,4 @@
import logging import logging
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any from typing import Any
@ -8,6 +7,7 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory from homeassistant.const import EntityCategory
from pyhon import Hon from pyhon import Hon
from pyhon.appliance import HonAppliance from pyhon.appliance import HonAppliance
from pyhon.parameter.range import HonParameterRange
from .const import DOMAIN from .const import DOMAIN
from .hon import HonCoordinator, HonEntity from .hon import HonCoordinator, HonEntity
@ -89,6 +89,51 @@ SWITCHES: dict[str, tuple[HonSwitchEntityDescription, ...]] = {
turn_off_key="resumeProgram", 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"] coordinators = hass.data[DOMAIN]["coordinators"]
appliances = [] appliances = []
for device in hon.appliances: for device in hon.appliances:
if device.mac_address in coordinators: if device.unique_id in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address] coordinator = hass.data[DOMAIN]["coordinators"][device.unique_id]
else: else:
coordinator = HonCoordinator(hass, device) 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() await coordinator.async_config_entry_first_refresh()
if descriptions := SWITCHES.get(device.appliance_type): if descriptions := SWITCHES.get(device.appliance_type):
@ -138,13 +183,6 @@ class HonSwitchEntity(HonEntity, SwitchEntity):
self.entity_description = description self.entity_description = description
self._attr_unique_id = f"{super().unique_id}{description.key}" 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 @property
def is_on(self) -> bool | None: def is_on(self) -> bool | None:
"""Return True if entity is on.""" """Return True if entity is on."""
@ -160,7 +198,9 @@ class HonSwitchEntity(HonEntity, SwitchEntity):
async def async_turn_on(self, **kwargs: Any) -> None: async def async_turn_on(self, **kwargs: Any) -> None:
if self.entity_category == EntityCategory.CONFIG: if self.entity_category == EntityCategory.CONFIG:
setting = self._device.settings[self.entity_description.key] 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() self.async_write_ha_state()
else: else:
await self._device.commands[self.entity_description.turn_on_key].send() 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: async def async_turn_off(self, **kwargs: Any) -> None:
if self.entity_category == EntityCategory.CONFIG: if self.entity_category == EntityCategory.CONFIG:
setting = self._device.settings[self.entity_description.key] 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() self.async_write_ha_state()
else: else:
await self._device.commands[self.entity_description.turn_off_key].send() await self._device.commands[self.entity_description.turn_off_key].send()

View File

@ -72,6 +72,16 @@
"13": "Ready to Store H-2", "13": "Ready to Store H-2",
"14": "Extra Dry H-3" "14": "Extra Dry H-3"
} }
},
"mode_dw": {
"state": {
"0": "Disconnected",
"1": "Ready",
"2": "Running",
"3": "Delayed start",
"5": "Delayed start cancelled",
"7": "Finished"
}
} }
}, },
"select": { "select": {
@ -402,7 +412,170 @@
"wool": "Wool", "wool": "Wool",
"wool_and_delicates_49": "Wool and Delicates 49'", "wool_and_delicates_49": "Wool and Delicates 49'",
"wool_dry": "Wool Dry", "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 - Washer Dryer
- Washing Machine - Washing Machine
- Oven - Oven
- Hob
## Tested Appliances ## Tested Appliances
- Haier WD90-B14TEAM5 - Haier WD90-B14TEAM5