Compare commits

...

37 Commits

Author SHA1 Message Date
92add01a59 Bump pyhon version 2023-04-11 01:03:54 +02:00
4a685e67e0 Try to fix login issues #11 2023-04-10 20:35:22 +02:00
6303843116 Add python check action 2023-04-10 19:59:04 +02:00
907bc44533 Reformat with black 2023-04-10 19:51:16 +02:00
4901be4050 Update badges, bump version 2023-04-10 18:50:51 +02:00
c8189414b8 Use pyhon v0.6.1 2023-04-10 17:02:16 +02:00
799ac67d94 Use info.md for hacs 2023-04-10 08:17:27 +02:00
7e9202ef38 New pyhOn version 2023-04-10 07:09:54 +02:00
e1a2af70e9 Bump to v0.4.0 2023-04-08 06:15:33 +02:00
c78aeb1fbb Merge pull request #14 from MiguelAngelLV/oven
Add oven support
2023-04-08 04:46:45 +02:00
67f280512d Merge branch 'main' into oven 2023-04-08 04:45:56 +02:00
6093b57f76 Merge branch 'main' into oven 2023-04-08 04:44:47 +02:00
287e895f4d Merge branch 'main' into oven 2023-04-08 04:33:55 +02:00
d3dc1b9f45 Merge pull request #13 from alexandre-leites/main
Added WD device type sensors.
2023-04-07 20:56:44 +02:00
116f9d5470 Add oven support 2023-04-07 13:52:55 +02:00
05e9d835b1 Added WD device type sensors. 2023-04-05 23:11:19 +02:00
135d6cafed Update to for hacs default integration 2023-04-02 02:44:13 +02:00
077bded6dd Improve washing machine sensors 2023-04-02 02:44:13 +02:00
0d575f65f9 Merge pull request #7 from drudgebg/main
Adding time selection for some of the TD programs
2023-03-22 22:33:19 +01:00
34e888f6d6 Adding time selection for some of the TD programs 2023-03-22 09:25:30 +02:00
26db07acdc Bump version to v0.3.0 2023-03-21 22:28:08 +01:00
e698393841 Merge pull request #6 from drudgebg/main
Add Tumble Dryer support, tested with haier HD80-A3959 and Bulgarian translation
2023-03-21 22:14:56 +01:00
28a0ae53e0 Update custom_components/hon/number.py 2023-03-21 22:12:59 +01:00
34e99230da Update bg.json 2023-03-21 14:10:06 +02:00
5032811963 Update en.json 2023-03-21 14:09:19 +02:00
196309ef5f Update binary_sensor.py 2023-03-21 14:05:03 +02:00
ae6d28f520 Update number.py 2023-03-21 14:03:39 +02:00
1a53ee7e5e Update switch.py
Add Tumble Dryer
2023-03-21 14:01:41 +02:00
fbee75108d Update select.py
Add Tumble Dryer
2023-03-21 14:00:50 +02:00
fb8306a4d9 Update sensor.py
Add Tumble Dryer
2023-03-21 13:59:39 +02:00
7ec3ca4681 Add Bulgarian translation 2023-03-21 13:56:14 +02:00
2a3bcfe033 Update en.json
Add Tumble Dryer haier HD80-A3959 Programs
2023-03-21 13:54:57 +02:00
db49881b57 Bump version to v0.2.5 2023-03-14 23:20:32 +01:00
93b9989cf2 Bump version to v0.2.4 2023-03-14 19:00:03 +01:00
8eaf2d75e6 Bump version to v0.2.3 2023-03-13 23:12:19 +01:00
57473349c3 Bump version 2023-03-11 22:57:45 +01:00
dfd661cc7c Make translation keys hassfest conform 2023-03-11 01:11:53 +01:00
16 changed files with 1398 additions and 406 deletions

38
.github/workflows/python_check.yml vendored Normal file
View File

@ -0,0 +1,38 @@
name: Python check
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11"]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install flake8 pylint black
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=88 --statistics
# - name: Analysing the code with pylint
# run: |
# pylint --max-line-length 88 $(git ls-files '*.py')
- name: Check black style
run: |
black . --check

View File

@ -1,20 +1,30 @@
# Haier hOn # Haier hOn
[![hacs_badge](https://img.shields.io/badge/HACS-Custom-41BDF5.svg)](https://github.com/hacs/integration) [![hacs_badge](https://img.shields.io/badge/HACS-Default-41BDF5.svg)](https://hacs.xyz)
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/Andre0512/hon?color=green)](https://github.com/Andre0512/hon/releases/latest)
Home Assistant component supporting devices of Haier's mobile app **hOn**. ![GitHub](https://img.shields.io/github/license/Andre0512/hon?color=red)
[![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
- Tumble Dryer
- Washer Dryer
- Washing Machine
- Oven
## Installation ## Installation
#### Installing via HACS **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)
1. You need to have installed [HACS](https://hacs.xyz/)
2. Go to HACS->Integrations **Method 2:** [HACS](https://hacs.xyz/) > Integrations > Add Integration > **Haier hOn** > Install
3. Add this repo (`https://github.com/Andre0512/hon.git`) into your HACS custom repositories
4. Search for Haier hOn and Download it **Method 3:** Manually copy `hon` folder from [latest release](https://github.com/Andre0512/hon/releases/latest) to `config/custom_components` folder.
5. Restart your HomeAssistant
6. Go to Settings->Devices & Services _Restart Home Assistant_
7. Shift reload your browser
8. Click Add Integration ## Configuration
9. Search for Haier hOn
10. Type your username used in the hOn App and hit submit **Method 1**: [![Open your Home Assistant instance and start setting up a new integration.](https://my.home-assistant.io/badges/config_flow_start.svg)](https://my.home-assistant.io/redirect/config_flow_start/?domain=hon)
**Method 2**: Settings > Devices & Services > Add Integration > **Haier hOn**
_If the integration is not in the list, you need to clear the browser cache._
## Contribute ## Contribute
Any kind of contribution is welcome! Any kind of contribution is welcome!
@ -58,17 +68,17 @@ Any kind of contribution is welcome!
5. Create a [pull request](https://github.com/Andre0512/hon/pulls) 5. Create a [pull request](https://github.com/Andre0512/hon/pulls)
#### Tips and Tricks #### Tips and Tricks
- If you want to have some states humanreadable, have a look at the `translation_key` parameter of the `EntityDescription` - If you want to have some states humanreadable, have a look at the `translation_key` parameter of the `EntityDescription`.
- If you need to implement some more logic, create a pull request to the underlying library. There we collect special requirements in the `appliances` directory. - If you need to implement some more logic, create a pull request to the underlying library. There we collect special requirements in the `appliances` directory.
- Use [pyhOn's translate command](https://github.com/Andre0512/pyhOn#translation) to read out the official translations
## Supported Appliances
- Washing Machine
## Tested Devices ## Tested Devices
- Haier WD90 - Haier WD90-B14TEAM5
- Haier HD80-A3959
- Haier HWO60SM2F3XH
- Hoover H-WASH 500
## About this Repo ## About this Repo
The existing integrations missed some features from the app I liked to have in HomeAssistant. The existing integrations missed some features from the app I liked to have in HomeAssistant.
I tried to create a pull request, but in the structures of these existing repos, I find it hard to fit in my needs, so I basically rewrote everything. I tried to create a pull request, but in the structures of these existing repos, I find it hard to fit in my needs, so I basically rewrote everything.
I moved the api related stuff into the package [pyhOn](https://github.com/Andre0512/pyhOn). I moved the api related stuff into the package [pyhOn](https://github.com/Andre0512/pyhOn).

View File

@ -1,7 +1,7 @@
import logging import logging
import voluptuous as vol import voluptuous as vol
from pyhon import HonConnection from pyhon import Hon
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_EMAIL, CONF_PASSWORD from homeassistant.const import CONF_EMAIL, CONF_PASSWORD
@ -28,8 +28,9 @@ CONFIG_SCHEMA = vol.Schema(
async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry): async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry):
session = aiohttp_client.async_get_clientsession(hass) session = aiohttp_client.async_get_clientsession(hass)
hon = HonConnection(entry.data["email"], entry.data["password"], session) hon = await Hon(
await hon.setup() entry.data["email"], entry.data["password"], session=session
).create()
hass.data.setdefault(DOMAIN, {}) hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][entry.unique_id] = hon hass.data[DOMAIN][entry.unique_id] = hon
hass.data[DOMAIN]["coordinators"] = {} hass.data[DOMAIN]["coordinators"] = {}

View File

@ -1,10 +1,13 @@
import logging import logging
from dataclasses import dataclass from dataclasses import dataclass
from pyhon import HonConnection from pyhon import Hon
from homeassistant.components.binary_sensor import BinarySensorEntityDescription, BinarySensorDeviceClass, \ from homeassistant.components.binary_sensor import (
BinarySensorEntity BinarySensorEntityDescription,
BinarySensorDeviceClass,
BinarySensorEntity,
)
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import callback from homeassistant.core import callback
from .const import DOMAIN from .const import DOMAIN
@ -19,12 +22,35 @@ class HonBinarySensorEntityDescriptionMixin:
@dataclass @dataclass
class HonBinarySensorEntityDescription(HonBinarySensorEntityDescriptionMixin, BinarySensorEntityDescription): class HonBinarySensorEntityDescription(
HonBinarySensorEntityDescriptionMixin, BinarySensorEntityDescription
):
pass pass
BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = {
"WM": ( "WM": (
HonBinarySensorEntityDescription(
key="attributes.lastConnEvent.category",
name="Remote Control",
device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="CONNECTED",
icon="mdi:remote",
),
HonBinarySensorEntityDescription(
key="doorLockStatus",
name="Door Lock",
device_class=BinarySensorDeviceClass.LOCK,
on_value="0",
),
HonBinarySensorEntityDescription(
key="doorStatus",
name="Door",
device_class=BinarySensorDeviceClass.DOOR,
on_value="1",
),
),
"TD": (
HonBinarySensorEntityDescription( HonBinarySensorEntityDescription(
key="attributes.lastConnEvent.category", key="attributes.lastConnEvent.category",
name="Connection", name="Connection",
@ -32,20 +58,80 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = {
on_value="CONNECTED", on_value="CONNECTED",
), ),
HonBinarySensorEntityDescription( HonBinarySensorEntityDescription(
key="doorLockStatus", key="doorStatus",
name="Door", name="Door",
device_class=BinarySensorDeviceClass.DOOR, device_class=BinarySensorDeviceClass.DOOR,
on_value="0", on_value="1",
), ),
) ),
"WD": (
HonBinarySensorEntityDescription(
key="attributes.lastConnEvent.category",
name="Remote Control",
device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="CONNECTED",
icon="mdi:remote",
),
HonBinarySensorEntityDescription(
key="startProgram.prewash",
name="Pre Wash",
),
HonBinarySensorEntityDescription(
key="extraRinse1",
name="Extra Rinse 1",
),
HonBinarySensorEntityDescription(
key="extraRinse2",
name="Extra Rinse 2",
),
HonBinarySensorEntityDescription(
key="extraRinse3",
name="Extra Rinse 3",
),
HonBinarySensorEntityDescription(
key="goodNight",
name="Good Night Mode",
),
HonBinarySensorEntityDescription(
key="acquaplus",
name="Acqua Plus",
),
HonBinarySensorEntityDescription(
key="anticrease",
name="Anti-Crease",
),
),
"OV": (
HonBinarySensorEntityDescription(
key="attributes.lastConnEvent.category",
name="Online",
device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="CONNECTED",
icon="mdi:wifi",
),
HonBinarySensorEntityDescription(
key="attributes.parameters.remoteCtrValid",
name="On",
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",
),
),
} }
async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None: async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None:
hon: HonConnection = hass.data[DOMAIN][entry.unique_id] hon: Hon = hass.data[DOMAIN][entry.unique_id]
coordinators = hass.data[DOMAIN]["coordinators"] coordinators = hass.data[DOMAIN]["coordinators"]
appliances = [] appliances = []
for device in hon.devices: for device in hon.appliances:
if device.mac_address in coordinators: if device.mac_address in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address] coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address]
else: else:
@ -56,10 +142,16 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
if descriptions := BINARY_SENSORS.get(device.appliance_type): if descriptions := BINARY_SENSORS.get(device.appliance_type):
for description in descriptions: for description in descriptions:
if not device.get(description.key): if not device.get(description.key):
_LOGGER.info("Can't setup %s", description.key) _LOGGER.warning(
"[%s] Can't setup %s", device.appliance_type, description.key
)
continue continue
appliances.extend([ appliances.extend(
HonBinarySensorEntity(hass, coordinator, entry, device, description)] [
HonBinarySensorEntity(
hass, coordinator, entry, device, description
)
]
) )
async_add_entities(appliances) async_add_entities(appliances)
@ -78,9 +170,15 @@ class HonBinarySensorEntity(HonEntity, BinarySensorEntity):
@property @property
def is_on(self) -> bool: def is_on(self) -> bool:
return self._device.get(self.entity_description.key, "") == self.entity_description.on_value return (
self._device.get(self.entity_description.key, "")
== self.entity_description.on_value
)
@callback @callback
def _handle_coordinator_update(self): def _handle_coordinator_update(self):
self._attr_native_value = self._device.get(self.entity_description.key, "") == self.entity_description.on_value self._attr_native_value = (
self._device.get(self.entity_description.key, "")
== self.entity_description.on_value
)
self.async_write_ha_state() self.async_write_ha_state()

View File

@ -1,33 +1,32 @@
from pyhon import HonConnection
from pyhon.device import HonDevice
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 pyhon import Hon
from pyhon.appliance import HonAppliance
from .const import DOMAIN from .const import DOMAIN
from .hon import HonCoordinator, HonEntity from .hon import HonCoordinator, HonEntity
BUTTONS: dict[str, tuple[ButtonEntityDescription, ...]] = { BUTTONS: dict[str, tuple[ButtonEntityDescription, ...]] = {
"WM": ( "OV": (
# ButtonEntityDescription( ButtonEntityDescription(
# key="pauseProgram", key="startProgram",
# name="Pause Program", name="Start Program",
# icon="mdi:pause", icon="mdi:power-cycle",
# ), ),
# ButtonEntityDescription( ButtonEntityDescription(
# key="resumeProgram", key="stopProgram",
# name="Resume Program", name="Stop Program",
# icon="mdi:play-pause", icon="mdi:power-off",
# ), ),
), )
} }
async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None: async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None:
hon: HonConnection = hass.data[DOMAIN][entry.unique_id] hon: Hon = hass.data[DOMAIN][entry.unique_id]
coordinators = hass.data[DOMAIN]["coordinators"] coordinators = hass.data[DOMAIN]["coordinators"]
appliances = [] appliances = []
for device in hon.devices: for device in hon.appliances:
if device.mac_address in coordinators: if device.mac_address in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address] coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address]
else: else:
@ -39,15 +38,17 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
for description in descriptions: for description in descriptions:
if not device.commands.get(description.key): if not device.commands.get(description.key):
continue continue
appliances.extend([ appliances.extend(
HonButtonEntity(hass, coordinator, entry, device, description)] [HonButtonEntity(hass, coordinator, entry, device, description)]
) )
async_add_entities(appliances) async_add_entities(appliances)
class HonButtonEntity(HonEntity, ButtonEntity): class HonButtonEntity(HonEntity, ButtonEntity):
def __init__(self, hass, coordinator, entry, device: HonDevice, description) -> None: def __init__(
self, hass, coordinator, entry, device: HonAppliance, description
) -> None:
super().__init__(hass, entry, coordinator, device) super().__init__(hass, entry, coordinator, device)
self._coordinator = coordinator self._coordinator = coordinator

View File

@ -20,8 +20,12 @@ class HonFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
async def async_step_user(self, user_input=None): async def async_step_user(self, user_input=None):
if user_input is None: if user_input is None:
return self.async_show_form(step_id="user", data_schema=vol.Schema( return self.async_show_form(
{vol.Required(CONF_EMAIL): str, vol.Required(CONF_PASSWORD): str})) step_id="user",
data_schema=vol.Schema(
{vol.Required(CONF_EMAIL): str, vol.Required(CONF_PASSWORD): str}
),
)
self._email = user_input[CONF_EMAIL] self._email = user_input[CONF_EMAIL]
self._password = user_input[CONF_PASSWORD] self._password = user_input[CONF_PASSWORD]

View File

@ -1,7 +1,7 @@
import logging import logging
from datetime import timedelta from datetime import timedelta
from pyhon.device import HonDevice from pyhon.appliance import HonAppliance
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.helpers.update_coordinator import CoordinatorEntity
@ -15,7 +15,7 @@ _LOGGER = logging.getLogger(__name__)
class HonEntity(CoordinatorEntity): class HonEntity(CoordinatorEntity):
_attr_has_entity_name = True _attr_has_entity_name = True
def __init__(self, hass, entry, coordinator, device: HonDevice) -> None: def __init__(self, hass, entry, coordinator, device: HonAppliance) -> None:
super().__init__(coordinator) super().__init__(coordinator)
self._hon = hass.data[DOMAIN][entry.unique_id] self._hon = hass.data[DOMAIN][entry.unique_id]
@ -29,16 +29,23 @@ class HonEntity(CoordinatorEntity):
return DeviceInfo( return DeviceInfo(
identifiers={(DOMAIN, self._device.mac_address)}, identifiers={(DOMAIN, self._device.mac_address)},
manufacturer=self._device.get("brand", ""), manufacturer=self._device.get("brand", ""),
name=self._device.nick_name if self._device.nick_name else self._device.model_name, name=self._device.nick_name
if self._device.nick_name
else self._device.model_name,
model=self._device.model_name, model=self._device.model_name,
sw_version=self._device.get("fwVersion", ""), sw_version=self._device.get("fwVersion", ""),
) )
class HonCoordinator(DataUpdateCoordinator): class HonCoordinator(DataUpdateCoordinator):
def __init__(self, hass, device: HonDevice): def __init__(self, hass, device: HonAppliance):
"""Initialize my coordinator.""" """Initialize my coordinator."""
super().__init__(hass, _LOGGER, name=device.mac_address, update_interval=timedelta(seconds=30)) super().__init__(
hass,
_LOGGER,
name=device.mac_address,
update_interval=timedelta(seconds=30),
)
self._device = device self._device = device
async def _async_update_data(self): async def _async_update_data(self):

View File

@ -6,7 +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.3.4"], "requirements": ["pyhOn==0.6.4"],
"version": "0.2.1" "version": "0.5.0-beta.5"
} }

View File

@ -1,6 +1,6 @@
from __future__ import annotations from __future__ import annotations
from pyhon import HonConnection from pyhon import Hon
from pyhon.parameter import HonParameterRange from pyhon.parameter import HonParameterRange
from homeassistant.components.number import ( from homeassistant.components.number import (
@ -8,7 +8,7 @@ from homeassistant.components.number import (
NumberEntityDescription, NumberEntityDescription,
) )
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import UnitOfTime from homeassistant.const import UnitOfTime, UnitOfTemperature
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.entity import EntityCategory
@ -22,30 +22,98 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = {
name="Delay Time", name="Delay Time",
icon="mdi:timer-plus", icon="mdi:timer-plus",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=UnitOfTime.MINUTES native_unit_of_measurement=UnitOfTime.MINUTES,
), ),
NumberEntityDescription( NumberEntityDescription(
key="startProgram.rinseIterations", key="startProgram.rinseIterations",
name="Rinse Iterations", name="Rinse Iterations",
icon="mdi:rotate-right", icon="mdi:rotate-right",
entity_category=EntityCategory.CONFIG entity_category=EntityCategory.CONFIG,
), ),
NumberEntityDescription( NumberEntityDescription(
key="startProgram.mainWashTime", key="startProgram.mainWashTime",
name="Main Wash Time", name="Main Wash Time",
icon="mdi:clock-start", icon="mdi:clock-start",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=UnitOfTime.MINUTES native_unit_of_measurement=UnitOfTime.MINUTES,
),
),
"TD": (
NumberEntityDescription(
key="startProgram.delayTime",
name="Delay time",
icon="mdi:timer-plus",
entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=UnitOfTime.MINUTES,
),
NumberEntityDescription(
key="startProgram.dryLevel",
name="Dry level",
entity_category=EntityCategory.CONFIG,
icon="mdi:hair-dryer",
translation_key="tumbledryerdrylevel",
),
NumberEntityDescription(
key="startProgram.tempLevel",
name="Temperature level",
entity_category=EntityCategory.CONFIG,
icon="mdi:thermometer",
translation_key="tumbledryertemplevel",
),
NumberEntityDescription(
key="startProgram.antiCreaseTime",
name="Anti-Crease time",
entity_category=EntityCategory.CONFIG,
icon="mdi:timer",
native_unit_of_measurement=UnitOfTime.MINUTES,
),
NumberEntityDescription(
key="startProgram.sterilizationStatus",
name="Sterilization status",
icon="mdi:clock-start",
entity_category=EntityCategory.CONFIG,
),
),
"WD": (
NumberEntityDescription(
key="startProgram.delayTime",
name="Delay Time",
icon="mdi:timer-plus",
entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=UnitOfTime.MINUTES,
),
),
"OV": (
NumberEntityDescription(
key="startProgram.delayTime",
name="Delay time",
icon="mdi:timer-plus",
entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=UnitOfTime.MINUTES,
),
NumberEntityDescription(
key="startProgram.tempSel",
name="Target Temperature",
entity_category=EntityCategory.CONFIG,
icon="mdi:thermometer",
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
),
NumberEntityDescription(
key="startProgram.prTime",
name="Program Duration",
entity_category=EntityCategory.CONFIG,
icon="mdi:timelapse",
native_unit_of_measurement=UnitOfTime.MINUTES,
), ),
), ),
} }
async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None: async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None:
hon: HonConnection = hass.data[DOMAIN][entry.unique_id] hon: Hon = hass.data[DOMAIN][entry.unique_id]
coordinators = hass.data[DOMAIN]["coordinators"] coordinators = hass.data[DOMAIN]["coordinators"]
appliances = [] appliances = []
for device in hon.devices: for device in hon.appliances:
if device.mac_address in coordinators: if device.mac_address in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address] coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address]
else: else:
@ -55,8 +123,10 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
if descriptions := NUMBERS.get(device.appliance_type): if descriptions := NUMBERS.get(device.appliance_type):
for description in descriptions: for description in descriptions:
appliances.extend([ if not device.settings.get(description.key):
HonNumberEntity(hass, coordinator, entry, device, description)] continue
appliances.extend(
[HonNumberEntity(hass, coordinator, entry, device, description)]
) )
async_add_entities(appliances) async_add_entities(appliances)

View File

@ -1,18 +1,22 @@
from __future__ import annotations from __future__ import annotations
from pyhon import HonConnection import logging
from pyhon.device import HonDevice
from pyhon import Hon
from pyhon.appliance import HonAppliance
from pyhon.parameter import HonParameterFixed from pyhon.parameter 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
from homeassistant.const import UnitOfTemperature, 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 .const import DOMAIN from .const import DOMAIN
from .hon import HonEntity, HonCoordinator from .hon import HonEntity, HonCoordinator
_LOGGER = logging.getLogger(__name__)
SELECTS = { SELECTS = {
"WM": ( "WM": (
SelectEntityDescription( SelectEntityDescription(
@ -20,30 +24,65 @@ SELECTS = {
name="Spin speed", name="Spin speed",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
icon="mdi:numeric", icon="mdi:numeric",
unit_of_measurement=REVOLUTIONS_PER_MINUTE unit_of_measurement=REVOLUTIONS_PER_MINUTE,
), ),
SelectEntityDescription( SelectEntityDescription(
key="startProgram.temp", key="startProgram.temp",
name="Temperature", name="Temperature",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
icon="mdi:thermometer", icon="mdi:thermometer",
unit_of_measurement=UnitOfTemperature.CELSIUS unit_of_measurement=UnitOfTemperature.CELSIUS,
), ),
SelectEntityDescription( SelectEntityDescription(
key="startProgram.program", key="startProgram.program",
name="Program", name="Program",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
translation_key="programs" translation_key="programs",
), ),
) ),
"TD": (
SelectEntityDescription(
key="startProgram.program",
name="Program",
entity_category=EntityCategory.CONFIG,
translation_key="programs",
),
SelectEntityDescription(
key="startProgram.dryTimeMM",
name="Time",
entity_category=EntityCategory.CONFIG,
icon="mdi:timer",
unit_of_measurement=UnitOfTime.MINUTES,
),
),
"WD": (
SelectEntityDescription(
key="startProgram.program",
name="Program",
entity_category=EntityCategory.CONFIG,
translation_key="programs",
),
),
"OV": (
SelectEntityDescription(
key="startProgram.program",
name="Program",
entity_category=EntityCategory.CONFIG,
),
SelectEntityDescription(
key="startProgram.preheatStatus",
name="Preheat",
entity_category=EntityCategory.CONFIG,
),
),
} }
async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None: async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None:
hon: HonConnection = hass.data[DOMAIN][entry.unique_id] hon: Hon = hass.data[DOMAIN][entry.unique_id]
coordinators = hass.data[DOMAIN]["coordinators"] coordinators = hass.data[DOMAIN]["coordinators"]
appliances = [] appliances = []
for device in hon.devices: for device in hon.appliances:
if device.mac_address in coordinators: if device.mac_address in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address] coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address]
else: else:
@ -53,16 +92,18 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
if descriptions := SELECTS.get(device.appliance_type): if descriptions := SELECTS.get(device.appliance_type):
for description in descriptions: for description in descriptions:
if not device.get(description.key): if not device.settings.get(description.key):
continue continue
appliances.extend([ appliances.extend(
HonSelectEntity(hass, coordinator, entry, device, description)] [HonSelectEntity(hass, coordinator, entry, device, description)]
) )
async_add_entities(appliances) async_add_entities(appliances)
class HonSelectEntity(HonEntity, SelectEntity): class HonSelectEntity(HonEntity, SelectEntity):
def __init__(self, hass, coordinator, entry, device: HonDevice, description) -> None: def __init__(
self, hass, coordinator, entry, device: HonAppliance, description
) -> None:
super().__init__(hass, entry, coordinator, device) super().__init__(hass, entry, coordinator, device)
self._coordinator = coordinator self._coordinator = coordinator
@ -89,7 +130,9 @@ class HonSelectEntity(HonEntity, SelectEntity):
@callback @callback
def _handle_coordinator_update(self): def _handle_coordinator_update(self):
setting = self._device.settings[self.entity_description.key] setting = self._device.settings[self.entity_description.key]
if not isinstance(self._device.settings[self.entity_description.key], HonParameterFixed): if not isinstance(
self._device.settings[self.entity_description.key], HonParameterFixed
):
self._attr_options: list[str] = setting.values self._attr_options: list[str] = setting.values
else: else:
self._attr_options = [setting.value] self._attr_options = [setting.value]

View File

@ -1,6 +1,6 @@
import logging import logging
from pyhon import HonConnection from pyhon import Hon
from homeassistant.components.sensor import ( from homeassistant.components.sensor import (
SensorEntity, SensorEntity,
@ -9,7 +9,15 @@ from homeassistant.components.sensor import (
SensorEntityDescription, SensorEntityDescription,
) )
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import UnitOfEnergy, UnitOfVolume, UnitOfMass, UnitOfPower, UnitOfTime from homeassistant.const import (
REVOLUTIONS_PER_MINUTE,
UnitOfEnergy,
UnitOfVolume,
UnitOfMass,
UnitOfPower,
UnitOfTime,
UnitOfTemperature,
)
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
@ -26,20 +34,20 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
name="Total Power", name="Total Power",
device_class=SensorDeviceClass.ENERGY, device_class=SensorDeviceClass.ENERGY,
state_class=SensorStateClass.TOTAL_INCREASING, state_class=SensorStateClass.TOTAL_INCREASING,
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
), ),
SensorEntityDescription( SensorEntityDescription(
key="totalWaterUsed", key="totalWaterUsed",
name="Total Water", name="Total Water",
device_class=SensorDeviceClass.WATER, device_class=SensorDeviceClass.WATER,
state_class=SensorStateClass.TOTAL_INCREASING, state_class=SensorStateClass.TOTAL_INCREASING,
native_unit_of_measurement=UnitOfVolume.LITERS native_unit_of_measurement=UnitOfVolume.LITERS,
), ),
SensorEntityDescription( SensorEntityDescription(
key="totalWashCycle", key="totalWashCycle",
name="Total Wash Cycle", name="Total Wash Cycle",
state_class=SensorStateClass.TOTAL_INCREASING, state_class=SensorStateClass.TOTAL_INCREASING,
icon="mdi:counter" icon="mdi:counter",
), ),
SensorEntityDescription( SensorEntityDescription(
key="currentElectricityUsed", key="currentElectricityUsed",
@ -47,13 +55,13 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.POWER, device_class=SensorDeviceClass.POWER,
native_unit_of_measurement=UnitOfPower.KILO_WATT, native_unit_of_measurement=UnitOfPower.KILO_WATT,
icon="mdi:lightning-bolt" icon="mdi:lightning-bolt",
), ),
SensorEntityDescription( SensorEntityDescription(
key="currentWaterUsed", key="currentWaterUsed",
name="Current Water Used", name="Current Water Used",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
icon="mdi:water" icon="mdi:water",
), ),
SensorEntityDescription( SensorEntityDescription(
key="startProgram.weight", key="startProgram.weight",
@ -61,19 +69,16 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=UnitOfMass.KILOGRAMS, native_unit_of_measurement=UnitOfMass.KILOGRAMS,
icon="mdi:weight-kilogram" icon="mdi:weight-kilogram",
), ),
SensorEntityDescription( SensorEntityDescription(
key="machMode", key="machMode",
name="Machine Status", name="Machine Status",
icon="mdi:information", icon="mdi:information",
translation_key="mode" translation_key="mode",
), ),
SensorEntityDescription( SensorEntityDescription(
key="errors", key="errors", name="Error", icon="mdi:math-log", translation_key="errors"
name="Error",
icon="mdi:math-log",
translation_key="errors"
), ),
SensorEntityDescription( SensorEntityDescription(
key="remainingTimeMM", key="remainingTimeMM",
@ -85,19 +90,145 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
SensorEntityDescription( SensorEntityDescription(
key="spinSpeed", key="spinSpeed",
name="Spin Speed", name="Spin Speed",
icon="mdi:speedometer",
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfTime.MINUTES,
),
),
"TD": (
SensorEntityDescription(
key="machMode",
name="Machine Status",
icon="mdi:information",
translation_key="mode",
),
SensorEntityDescription(
key="errors", name="Error", icon="mdi:math-log", translation_key="errors"
),
SensorEntityDescription(
key="remainingTimeMM",
name="Remaining Time",
icon="mdi:timer", icon="mdi:timer",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfTime.MINUTES, native_unit_of_measurement=UnitOfTime.MINUTES,
), ),
) SensorEntityDescription(
key="delayTime",
name="Start Time",
icon="mdi:clock-start",
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfTime.MINUTES,
),
SensorEntityDescription(
key="prCode",
name="Program",
icon="mdi:tumble-dryer",
translation_key="tumbledryerprogram",
),
SensorEntityDescription(
key="prPhase",
name="Program Phase",
icon="mdi:tumble-dryer",
translation_key="tumbledryerprogramphase",
),
SensorEntityDescription(
key="dryLevel",
name="Dry level",
icon="mdi:hair-dryer",
translation_key="tumbledryerdrylevel",
),
SensorEntityDescription(
key="tempLevel",
name="Temperature level",
icon="mdi:thermometer",
translation_key="tumbledryertemplevel",
),
),
"WD": (
SensorEntityDescription(
key="machMode",
name="Machine Status",
icon="mdi:information",
translation_key="mode",
),
SensorEntityDescription(
key="spinSpeed",
name="Spin Speed",
icon="mdi:fast-forward-outline",
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=REVOLUTIONS_PER_MINUTE,
),
SensorEntityDescription(
key="remainingTimeMM",
name="Remaining Time",
icon="mdi:timer",
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfTime.MINUTES,
),
SensorEntityDescription(
key="prCode",
name="Current Program",
icon="mdi:tumble-dryer",
),
SensorEntityDescription(
key="prPhase",
name="Program Phase",
icon="mdi:tumble-dryer",
),
SensorEntityDescription(
key="dryLevel",
name="Dry level",
icon="mdi:hair-dryer",
),
SensorEntityDescription(
key="dirtyLevel",
name="Dirt level",
icon="mdi:liquid-spot",
),
SensorEntityDescription(
key="steamLevel",
name="Steam level",
icon="mdi:smoke",
),
SensorEntityDescription(
key="temp",
name="Current Temperature",
icon="mdi:thermometer",
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
),
),
"OV": (
SensorEntityDescription(
key="remainingTimeMM",
name="Remaining Time",
icon="mdi:timer",
native_unit_of_measurement=UnitOfTime.MINUTES,
),
SensorEntityDescription(
key="delayTime",
name="Start Time",
icon="mdi:clock-start",
),
SensorEntityDescription(
key="temp",
name="Temperature",
icon="mdi:thermometer",
),
SensorEntityDescription(
key="tempSel",
name="Temperature Selected",
icon="mdi:thermometer",
),
),
} }
async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None: async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None:
hon: HonConnection = hass.data[DOMAIN][entry.unique_id] hon: Hon = hass.data[DOMAIN][entry.unique_id]
coordinators = hass.data[DOMAIN]["coordinators"] coordinators = hass.data[DOMAIN]["coordinators"]
appliances = [] appliances = []
for device in hon.devices: for device in hon.appliances:
if device.mac_address in coordinators: if device.mac_address in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address] coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address]
else: else:
@ -108,9 +239,12 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
if descriptions := SENSORS.get(device.appliance_type): if descriptions := SENSORS.get(device.appliance_type):
for description in descriptions: for description in descriptions:
if not device.get(description.key): if not device.get(description.key):
_LOGGER.warning(
"[%s] Can't setup %s", device.appliance_type, description.key
)
continue continue
appliances.extend([ appliances.extend(
HonSensorEntity(hass, coordinator, entry, device, description)] [HonSensorEntity(hass, coordinator, entry, device, description)]
) )
async_add_entities(appliances) async_add_entities(appliances)

View File

@ -1,15 +1,19 @@
import logging
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any 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.const import EntityCategory
from pyhon import HonConnection from pyhon import Hon
from pyhon.device import HonDevice from pyhon.appliance import HonAppliance
from .const import DOMAIN from .const import DOMAIN
from .hon import HonCoordinator, HonEntity from .hon import HonCoordinator, HonEntity
_LOGGER = logging.getLogger(__name__)
@dataclass @dataclass
class HonSwitchEntityDescriptionMixin: class HonSwitchEntityDescriptionMixin:
@ -18,8 +22,8 @@ class HonSwitchEntityDescriptionMixin:
@dataclass @dataclass
class HonSwitchEntityDescription(HonSwitchEntityDescriptionMixin, class HonSwitchEntityDescription(
SwitchEntityDescription HonSwitchEntityDescriptionMixin, SwitchEntityDescription
): ):
pass pass
@ -44,23 +48,55 @@ SWITCHES: dict[str, tuple[HonSwitchEntityDescription, ...]] = {
key="startProgram.delayStatus", key="startProgram.delayStatus",
name="Delay Status", name="Delay Status",
icon="mdi:timer-check", icon="mdi:timer-check",
entity_category=EntityCategory.CONFIG entity_category=EntityCategory.CONFIG,
), ),
HonSwitchEntityDescription( HonSwitchEntityDescription(
key="startProgram.haier_SoakPrewashSelection", key="startProgram.haier_SoakPrewashSelection",
name="Soak Prewash Selection", name="Soak Prewash Selection",
icon="mdi:tshirt-crew", icon="mdi:tshirt-crew",
entity_category=EntityCategory.CONFIG entity_category=EntityCategory.CONFIG,
),
),
"TD": (
HonSwitchEntityDescription(
key="active",
name="Tumble Dryer",
icon="mdi:tumble-dryer",
turn_on_key="startProgram",
turn_off_key="stopProgram",
),
HonSwitchEntityDescription(
key="pause",
name="Pause Tumble Dryer",
icon="mdi:pause",
turn_on_key="pauseProgram",
turn_off_key="resumeProgram",
),
),
"WD": (
HonSwitchEntityDescription(
key="active",
name="Washing Machine",
icon="mdi:washing-machine",
turn_on_key="startProgram",
turn_off_key="stopProgram",
),
HonSwitchEntityDescription(
key="pause",
name="Pause Washing Machine",
icon="mdi:pause",
turn_on_key="pauseProgram",
turn_off_key="resumeProgram",
), ),
), ),
} }
async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None: async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None:
hon: HonConnection = hass.data[DOMAIN][entry.unique_id] hon: Hon = hass.data[DOMAIN][entry.unique_id]
coordinators = hass.data[DOMAIN]["coordinators"] coordinators = hass.data[DOMAIN]["coordinators"]
appliances = [] appliances = []
for device in hon.devices: for device in hon.appliances:
if device.mac_address in coordinators: if device.mac_address in coordinators:
coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address] coordinator = hass.data[DOMAIN]["coordinators"][device.mac_address]
else: else:
@ -70,9 +106,16 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
if descriptions := SWITCHES.get(device.appliance_type): if descriptions := SWITCHES.get(device.appliance_type):
for description in descriptions: for description in descriptions:
if device.get(description.key) is not None or device.commands.get(description.key) is not None: if (
appliances.extend([ device.get(description.key) is not None
HonSwitchEntity(hass, coordinator, entry, device, description)] or device.commands.get(description.key) is not None
):
appliances.extend(
[HonSwitchEntity(hass, coordinator, entry, device, description)]
)
else:
_LOGGER.warning(
"[%s] Can't setup %s", device.appliance_type, description.key
) )
async_add_entities(appliances) async_add_entities(appliances)
@ -81,7 +124,14 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
class HonSwitchEntity(HonEntity, SwitchEntity): class HonSwitchEntity(HonEntity, SwitchEntity):
entity_description: HonSwitchEntityDescription entity_description: HonSwitchEntityDescription
def __init__(self, hass, coordinator, entry, device: HonDevice, description: HonSwitchEntityDescription) -> None: def __init__(
self,
hass,
coordinator,
entry,
device: HonAppliance,
description: HonSwitchEntityDescription,
) -> None:
super().__init__(hass, entry, coordinator, device) super().__init__(hass, entry, coordinator, device)
self._coordinator = coordinator self._coordinator = coordinator
self._device = device self._device = device
@ -90,7 +140,9 @@ class HonSwitchEntity(HonEntity, SwitchEntity):
def available(self) -> bool: def available(self) -> bool:
if self.entity_category == EntityCategory.CONFIG: if self.entity_category == EntityCategory.CONFIG:
return self._device.settings[self.entity_description.key].typology != "fixed" return (
self._device.settings[self.entity_description.key].typology != "fixed"
)
return True return True
@property @property
@ -98,7 +150,11 @@ class HonSwitchEntity(HonEntity, SwitchEntity):
"""Return True if entity is on.""" """Return True if entity is on."""
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]
return setting.value == "1" or hasattr(setting, "min") and setting.value != setting.min return (
setting.value == "1"
or hasattr(setting, "min")
and setting.value != setting.min
)
return self._device.get(self.entity_description.key, False) return self._device.get(self.entity_description.key, False)
async def async_turn_on(self, **kwargs: Any) -> None: async def async_turn_on(self, **kwargs: Any) -> None:
@ -116,5 +172,3 @@ class HonSwitchEntity(HonEntity, SwitchEntity):
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

@ -0,0 +1,410 @@
{
"config": {
"step": {
"user": {
"description": "Моля, въведете вашите данни за достъп до hOn",
"data": {
"email": "Email Адрес",
"password": "Парола"
}
}
}
},
"entity": {
"sensor": {
"mode": {
"state": {
"0": "Изключен",
"1": "Готов",
"2": "Работи",
"3": "На пауза",
"5": "Scheduled",
"6": "Грешка",
"7": "Завършен"
}
},
"errors": {
"state": {
"00": "Няма грешки",
"100000000000": "E2: Провери дали вратата е затворена",
"8000000000000": "E4: Провери подаването на вода"
}
},
"tumbledryerprogram": {
"state": {
"0": "Стандартна",
"62": "Памук",
"63": "Синтетика",
"64": "Смесен тип",
"66": "Чаршафи",
"71": "Пердета",
"72": "Спорт",
"74": "i-time",
"75": "Олекотени завивки",
"76": "Вълна",
"78": "i-Refresh",
"83": "Хавлиена кърпа",
"85": "Бързо Сушене",
"92": "Деликатно пране",
"103": "Отдалечен"
}
},
"tumbledryerprogramphase": {
"state": {
"0": "Изчаване",
"2": "Сушене",
"3": "Охлажане",
"11": "11"
}
},
"tumbledryertemplevel": {
"state": {
"1": "Хладен въздух",
"2": "Ниска температура L-1",
"3": "Средна температура L-2",
"4": "Висока температура L-3"
}
},
"tumbledryerdrylevel": {
"state": {
"3": "Готови за съхранение",
"12": "Готови за гладене H-1",
"13": "Готови за съхранение H-2",
"14": "Екстра сухо H-3"
}
}
},
"select": {
"programs": {
"state": {
"20_degrees_coloured_cottons": "20° Colored and Cottons",
"20_degrees_new_energy_label": "20°C",
"active_steam": "Steam",
"active_wash": "Active Wash",
"active_wash_steam": "Active Wash + Steam",
"allergy_care": "Allergy Care",
"allergy_care_pro": "Allergy Care Pro",
"all_in_one_49": "All in One 49'",
"all_in_one_59": "All in One 59'",
"all_in_one_59_steam": "Active Wash + Steam",
"autocare": "Autocare",
"autoclean": "Drum Cleaning",
"baby_60": "All Baby 60°C",
"care_14": "Rapid Care 14'",
"care_30": "Rapid Care 30'",
"care_44": "Rapid Care 44'",
"checkup": "Check-Up",
"colour_59": "Colored 59'",
"colour_59_steam": "Colored 59' + Steam",
"cottons": "Cotton",
"cottons_prewash": "Cottons + Prewash",
"cottons_steam": "Cotton + Steam",
"cotton_care_59": "Cotton Care 59'",
"delicate_59": "Delicate 59'",
"delicate_silk": "Delicate and Silk",
"delicate_silk_steam": "Delicate and Silk + Steam",
"delicati_59": "Delicate 59'",
"delicati_59_steam": "Delicate 59' + Steam",
"drain_spin": "Drain + Spin",
"easy_iron": "Easy Iron",
"eco_40_60_new_energy_label": "Eco 40-60",
"extra_care": "Extra Care",
"fitness": "Fitness Care",
"fitness_care": "Fitness Care",
"fresh_care": "Fresh Care",
"fresh_care_steam": "Fresh Care + Steam",
"handwash_wool": "Hand Wash + Wool",
"high_dry": "High Heat Dry",
"hqd_20_degrees": "Cotton 20℃",
"hqd_allergy": "Allergy Care",
"hqd_autoclean": "Автоматично почистване",
"hqd_babycare": "Бебе",
"hqd_baby_care": "Бебе",
"hqd_bath_towel": "Хавлиени кърпи",
"hqd_bed_sheets": "Чаршафи",
"hqd_checkup": "Check-Up",
"hqd_bulky": "Обемисти",
"hqd_casual": "Ежедневни",
"hqd_cold_wind_30": "Студен бриз 30 мин",
"hqd_cold_wind_timing": "Студен бриз за време",
"hqd_cotton": "Памук",
"hqd_cottons": "Памук",
"hqd_curtain": "Пердета",
"hqd_delicate": "Деликатни",
"hqd_delicate_cradle": "Деликатни",
"hqd_diaper": "Бебешки пелени",
"hqd_dry": "Cotton Dry",
"hqd_dry_synthetics": "Low Heat Dry",
"hqd_duvet": "Олекотени завивки",
"hqd_eco_40_60_degrees": "Eco 40-60",
"hqd_feather": "Пълнеж от пера(пух)",
"hqd_handwash_wool": "Wool",
"hqd_hot_wind_timing": "Горещ въздух за време",
"hqd_hygienic": "Здравословна",
"hqd_i_refresh": "i-Refresh",
"hqd_i_refresh_pro": "i-Refresh Pro",
"hqd_jacket": "Якета",
"hqd_jeans": "Дънки",
"hqd_luxury": "Луксозно",
"hqd_mix": "Смесен тип",
"hqd_night_dry": "Сушене през ноща",
"hqd_outdoor": "Дрехи за открито",
"hqd_precious_cure": "Precious cure",
"hqd_quick_15": "Бързо 15 мин",
"hqd_quick_20": "Бързо 20 мин",
"hqd_quick_30": "Бързо 30 мин",
"hqd_quick_dry": "Бързо",
"hqd_quick_wash_57": "Quick Wash 57'",
"hqd_quilt": "Юргани",
"hqd_rapid_wash_and_dry": "Wash and dry",
"hqd_refresh": "Освежаване",
"hqd_rinse": "Rinses",
"hqd_school_uniform": "Ученически униформи",
"hqd_shirt": "Ризи",
"hqd_shirts": "Ризи",
"hqd_shoes": "Обувки",
"hqd_silk": "Коприна",
"hqd_smart": "Smart A.I.",
"hqd_spin": "Spin",
"hqd_sport": "Спорт",
"hqd_sports": "Спорт",
"hqd_synthetics": "Синтетика",
"hqd_super_fast": "Супер бързо 39 мин",
"hqd_synthetic_and_coloured": "Synthetics",
"hqd_timer": "Таймер",
"hqd_towel": "Хавлиени кърпи",
"hqd_underwear": "Бельо",
"hqd_warm_up": "Затопляне",
"hqd_wool": "Вълна",
"hqd_working_suit": "Работно облекло",
"hygiene_59": "Hygiene Plus 59'",
"hygiene_60": "Hygiene 60°C",
"hygiene_plus_59": "Hygiene Plus 59'",
"hygiene_plus_59_min": "Hygiene Plus 59'",
"hygiene_pro_4_min": "Hygiene Pro 49'",
"hygiene_pro_49_min": "Hygiene Pro 49'",
"hygiene_pro_steam": "Hygiene Pro + Steam",
"intensive_40": "Intensive 40°C",
"intensive_40_steam": "Intensive 40°C + Steam",
"iot_checkup": "Check-Up",
"iot_dry_air_refresh": "Air Refresh",
"iot_dry_anti_mites": "Anti-mite",
"iot_dry_baby": "Бебе",
"iot_dry_backpacks": "Раници",
"iot_dry_bathrobe": "Халати за баня",
"iot_dry_bed_linen": "Спално бельо",
"iot_dry_cotton": "Памук",
"iot_dry_cotton_dry": "Памук",
"iot_dry_cuddly_toys": "Плюшени играчки",
"iot_dry_curtains": "Пердета",
"iot_dry_dehumidifier": "Humidity Remover",
"iot_dry_delicates": "Деликатни",
"iot_dry_delicates_antiallergy": "Delicates Anti-allergy",
"iot_dry_delicate_tablecloths": "Delicate Tablecloths",
"iot_dry_denim_jeans": "Дънки",
"iot_dry_down_jacket": "Пухени якета",
"iot_dry_duvet": "Олекотени завивки",
"iot_dry_easy_iron_cotton": "Easy Iron - Cotton",
"iot_dry_easy_iron_synthetics": "Easy Iron - Synthetics",
"iot_dry_gym_fit": "Фитнес",
"iot_dry_lingerie": "Деликано бельо",
"iot_dry_mixed": "Смесен тип",
"iot_dry_mixed_dry": "Смесен тип",
"iot_dry_rapid_30": "Бързо 30 мин",
"iot_dry_rapid_59": "Бързо 59 мин",
"iot_dry_rapid_60_min_delicates": "Rapid 60' - Delicates",
"iot_dry_shirts": "Ризи",
"iot_dry_swimsuits_and_bikinis": "Бански",
"iot_dry_synthetics": "Синтетика",
"iot_dry_synthetic_dry": "Synthetic Dry",
"iot_dry_tablecloths": "Покривки",
"iot_dry_technical_fabrics": "Технически тъкани",
"iot_dry_warm_embrace": "Warm Embrace",
"iot_dry_wool": "Вълна",
"iot_dry_wool_dry": "Вълна",
"iot_wash_and_dry": "Wash and dry",
"iot_wash_anti_mites": "Anti-mites",
"iot_wash_anti_odor": "Anti-odour",
"iot_wash_ariel_clean_cycle": "Ariel Ultimate Clean",
"iot_wash_ariel_cold_cycle": "Ariel Cold Clean",
"iot_wash_ariel_fresh_cycle": "Ariel Fresh Clean",
"iot_wash_baby_sanitizer": "Sanitizer",
"iot_wash_baby_sanitizer_steam": "Sanitiser + Steam",
"iot_wash_backpacks": "Backpacks",
"iot_wash_backpacks_zelig": "Backpacks",
"iot_wash_bathrobe": "Bathrobes and Towels",
"iot_wash_bathrobe_steam": "Bathrobe and Towels + Steam",
"iot_wash_bed_linen": "Bed Linen",
"iot_wash_bed_linen_steam": "Bed Linen + Steam",
"iot_wash_bed_linen_zelig": "Bed Linens",
"iot_wash_big_single_load": "Big single load",
"iot_wash_bleaching": "Bleaching",
"iot_wash_blood_stains": "Bloodstains",
"iot_wash_cashmere": "Cashmere",
"iot_wash_chocolate_stains": "Chocolate stains",
"iot_wash_cold_wash": "Cold Wash",
"iot_wash_colored": "Colored",
"iot_wash_colored_anti_stain": "Colored Anti-stain",
"iot_wash_colored_delicate": "Colored Delicate",
"iot_wash_coloured": "Colored",
"iot_wash_coloured_bed_linen": "Colored Bed Linen",
"iot_wash_coloured_bed_linen_steam": "Coloured Bed Linen + Steam",
"iot_wash_coloured_curtains": "Colored Curtains",
"iot_wash_coloured_shirts": "Colored Shirts",
"iot_wash_coloured_shirts_steam": "Colored Shirts + Steam",
"iot_wash_coloured_steam": "Colored + Steam",
"iot_wash_coloured_tableclothes": "Colored Tableclothes",
"iot_wash_coloured_tableclothes_steam": "Coloured Tablecloths + Steam",
"iot_wash_cotton": "Cotton",
"iot_wash_cotton_steam": "Cotton + Steam",
"iot_wash_cuddly_toys": "Cuddly Toys",
"iot_wash_curtains": "Curtains",
"iot_wash_curtains_steam": "Curtains + Steam",
"iot_wash_curtains_zelig": "Curtains",
"iot_wash_dark": "Darks",
"iot_wash_darks_and_coloured_44": "Darks and Colored 44'",
"iot_wash_darks_and_coloured_59": "Darks and Colored 59'",
"iot_wash_darks_and_coloured_xl": "Darks and Colored XL",
"iot_wash_dark_steam": "Darks + Steam",
"iot_wash_dash_clean_cycle": "Dash Ultimate Clean",
"iot_wash_dash_cold_cycle": "Dash Cold Clean",
"iot_wash_dash_fresh_cycle": "Dash Fresh Clean",
"iot_wash_delicate": "Delicates",
"iot_wash_delicate_antiallergy": "Delicate Anti-Allergy",
"iot_wash_delicate_antiallergy_steam": "Delicate Anti-Allergy + Steam",
"iot_wash_delicate_antiallergy_zelig": "Delicate Anti-Allergy",
"iot_wash_delicate_colors": "Delicate Colors",
"iot_wash_delicate_colors_steam": "Delicate Colors + Steam",
"iot_wash_delicate_dark": "Delicate Darks",
"iot_wash_delicate_steam": "Delicates + Steam",
"iot_wash_delicate_tablecloths": "Delicate Tablecloths",
"iot_wash_delicate_tablecloths_steam": "Delicate Tablecloths + Steam",
"iot_wash_delicate_whites": "Delicate Whites",
"iot_wash_denim_jeans": "Denim - Jeans",
"iot_wash_diving_suits": "Diving Suits",
"iot_wash_diving_suits_zelig": "Diving Suits",
"iot_wash_down_jackets": "Down Jackets",
"iot_wash_down_jackets_zelig": "Down Jackets",
"iot_wash_duvet": "Duvet",
"iot_wash_fruit_stains": "Fruit stains",
"iot_wash_gym_fit": "Gym Fit - Fitness",
"iot_wash_handwash": "Handwash",
"iot_wash_handwash_colored": "Handwash Colored",
"iot_wash_handwash_dark": "Handwash Darks",
"iot_wash_lingerie": "Lingerie",
"iot_wash_masks_refresh": "Masks Refresh",
"iot_wash_masks_sanification": "Masks Sanitization",
"iot_wash_masks_sanification_steam": "Mask Sanitisation + Steam",
"iot_wash_mats": "Mats",
"iot_wash_men_s_trousers": "Trousers",
"iot_wash_mixed": "Mixed",
"iot_wash_mixed_steam": "Mixed + Steam",
"iot_wash_mix_and_coloured_44": "Mix and Colored 44'",
"iot_wash_mix_and_coloured_59": "Mix and Colored 59'",
"iot_wash_mix_and_coloured_xl": "Mix and colored XL",
"iot_wash_new_clothes": "New Clothes",
"iot_wash_perfect_white": "Perfect White",
"iot_wash_perfect_white_steam": "Perfect White + Steam",
"iot_wash_pets": "Pet Accessories",
"iot_wash_pets_hair_removal": "Pets Hair Removal",
"iot_wash_pets_odours_stains_removal": "Pets Odours and Stains Removal",
"iot_wash_pets_steam": "Pet Accessories + Steam",
"iot_wash_playsuits": "Playsuits",
"iot_wash_playsuits_steam": "Playsuits + Steam",
"iot_wash_quick_drum_cleaner": "Quick drum cleaner",
"iot_wash_rapid_14": "Rapid 14",
"iot_wash_rapid_30": "Rapid 30",
"iot_wash_rapid_44": "Rapid 44'",
"iot_wash_rapid_59": "Rapid 59'",
"iot_wash_rapid_59_steam": "Rapid 59' + Steam",
"iot_wash_refresh_14_min": "Refresh 14'",
"iot_wash_resistant_colored": "Resistant Colored",
"iot_wash_resistant_dark": "Resistant Darks",
"iot_wash_resistant_whites": "Resistant Whites",
"iot_wash_rinse": "Rinses",
"iot_wash_shirts": "Shirts",
"iot_wash_shirts_steam": "Shirts + Steam",
"iot_wash_silk": "Silk",
"iot_wash_ski_suit": "Ski Suit",
"iot_wash_ski_suit_zelig": "Ski Suit",
"iot_wash_spin": "Spin",
"iot_wash_sport": "Sport",
"iot_wash_sport_anti_odor": "Anti-odour Sportswear",
"iot_wash_sport_anti_odor_zelig": "Anti-odour Sportswear",
"iot_wash_stains_remover": "Stain Remover",
"iot_wash_swimsuits_and_bikinis": "Swimsuits and Bikinis",
"iot_wash_synthetic": "Synthetics",
"iot_wash_synthetic_steam": "Synthetics + Steam",
"iot_wash_tablecloths": "Tablecloths",
"iot_wash_tablecloths_steam": "Tablecloths + Steam",
"iot_wash_technical_fabrics": "Technical Fabrics",
"iot_wash_technical_fabrics_zelig": "Technical Fabrics",
"iot_wash_technical_jackets": "Technical Jackets",
"iot_wash_technical_jackets_zelig": "Technical Jackets",
"iot_wash_trainers": "Trainers",
"iot_wash_whites": "Whites",
"iot_wash_whites_44": "Whites 44'",
"iot_wash_whites_59": "Whites 59'",
"iot_wash_whites_xl": "Whites XL",
"iot_wash_wine_stains": "Wine Stains",
"iot_wash_wool": "Wool",
"jeans": "Jeans",
"jeans_60": "Jeans",
"low_dry": "Low Heat Dry",
"mixed": "Mixed",
"mixed_and_colored_59": "Mixed and Colored 59'",
"mixed_steam": "Mixed + Steam",
"mix_and_colour_59": "Mixed and Colored 59'",
"mix_and_colour_59_steam": "Mixed and Coloured 59' + Steam",
"night_and_day": "Night and Day",
"night_wash": "Night Wash",
"perfect_59": "Perfect 59'",
"perfect_cotton_59": "Perfect Cotton 59'",
"perfect_cotton_59_steam": "Perfect Cotton 59' + Steam",
"perfect_whites_59": "Perfect White 59'",
"rapid_14_min": "Rapid 14'",
"rapid_30_min": "Rapid 30'",
"rapid_44_min": "Rapid 44'",
"rapid_a_class_60": "Rapid 59' A Class",
"rapid_a_class_60_steam": "Rapid 59' A Class + Steam",
"rapid_wash_and_dry_59_min": "Wash and Dry 59'",
"resistant_cotton": "Resistant Cotton",
"resistant_cotton_steam": "Resistant Cotton + Steam",
"rinse": "Rinse",
"shirts_steam": "Shirts + Steam",
"silent_night": "Silent Night",
"single_item": "Single Item",
"single_item_steam": "Single Item + Steam",
"smart_wash": "Smart Wash",
"soft_care": "Soft Care",
"soft_care_steam": "Soft Care + Steam",
"soft_care_steam_title": "Soft Care + Steam",
"special_39": "Special 39'",
"special_39_full_load": "Special 39'",
"special_39_full_load_steam": "Special 39' + Steam",
"special_49": "Special 49'",
"sport_39": "Sport 39'",
"sport_plus_29": "Sport Plus 29'",
"sport_plus_39": "Sport Plus 39'",
"steam_39": "Steam 39'",
"steam_care_pro": "Steam Care Pro",
"steam_care_pro_cotton": "Steam Care Pro - Cottons",
"steam_care_pro_delicates": "Steam Care Pro - Delicates",
"steam_care_pro_synthetic": "Steam Care Pro - Synthetics",
"steam_hygiene_plus": "Hygiene Plus + Steam",
"synthetics": "Synthetics",
"synthetic_and_coloured": "Synthetic and Colored",
"synthetic_and_coloured_steam": "Synthetic and Coloured + Steam",
"tailored_resistant_cotton": "Tailored Resistant Cotton",
"tailored_synthetic_and_coloured": "Tailored Synthetic Colored",
"total_care": "Total Care",
"tumbling": "Tumbling",
"wool": "Wool",
"wool_and_delicates_49": "Wool and Delicates 49'",
"wool_dry": "Wool Dry",
"wool_soft_care": "Wool and Soft Car"
}
}
}
}
}

View File

@ -29,292 +29,380 @@
"100000000000": "E2: Check if the door is closed", "100000000000": "E2: Check if the door is closed",
"8000000000000": "E4: Check the water supply" "8000000000000": "E4: Check the water supply"
} }
},
"tumbledryerprogram": {
"state": {
"0": "Default",
"62": "Cotton",
"63": "Synthetics",
"64": "Mix",
"66": "Bed Sheets",
"71": "Curtains",
"72": "Sports",
"74": "i-time",
"75": "Duvet",
"76": "Wool",
"78": "i-Refresh",
"83": "Towel",
"85": "Quick Dry",
"92": "Delicate",
"103": "Remote"
}
},
"tumbledryerprogramphase": {
"state": {
"0": "Waiting",
"2": "Drying",
"3": "Cooldown",
"11": "11"
}
},
"tumbledryertemplevel": {
"state": {
"1": "Cool",
"2": "Low temperature L-1",
"3": "Middle temperature L-2",
"4": "High temperature L-3"
}
},
"tumbledryerdrylevel": {
"state": {
"3": "Cupboard dry",
"12": "Ready to Iron H-1",
"13": "Ready to Store H-2",
"14": "Extra Dry H-3"
}
} }
}, },
"select": { "select": {
"programs": { "programs": {
"state": { "state": {
"PROGRAMS.WM_WD.20_DEGREES_COLOURED_COTTONS": "20° Colored and Cottons", "20_degrees_coloured_cottons": "20° Colored and Cottons",
"PROGRAMS.WM_WD.20_DEGREES_NEW_ENERGY_LABEL": "20°C", "20_degrees_new_energy_label": "20°C",
"PROGRAMS.WM_WD.ACTIVE_STEAM": "Steam", "active_steam": "Steam",
"PROGRAMS.WM_WD.ACTIVE_WASH": "Active Wash", "active_wash": "Active Wash",
"PROGRAMS.WM_WD.ACTIVE_WASH_STEAM": "Active Wash + Steam", "active_wash_steam": "Active Wash + Steam",
"PROGRAMS.WM_WD.ALLERGY_CARE": "Allergy Care", "allergy_care": "Allergy Care",
"PROGRAMS.WM_WD.ALLERGY_CARE_PRO": "Allergy Care Pro", "allergy_care_pro": "Allergy Care Pro",
"PROGRAMS.WM_WD.ALL_IN_ONE_49": "All in One 49'", "all_in_one_49": "All in One 49'",
"PROGRAMS.WM_WD.ALL_IN_ONE_59": "All in One 59'", "all_in_one_59": "All in One 59'",
"PROGRAMS.WM_WD.ALL_IN_ONE_59_STEAM": "Active Wash + Steam", "all_in_one_59_steam": "Active Wash + Steam",
"PROGRAMS.WM_WD.AUTOCARE": "Autocare", "autocare": "Autocare",
"PROGRAMS.WM_WD.AUTOCLEAN": "Drum Cleaning", "autoclean": "Drum Cleaning",
"PROGRAMS.WM_WD.BABY_60": "All Baby 60°C", "baby_60": "All Baby 60°C",
"PROGRAMS.WM_WD.CARE_14": "Rapid Care 14'", "care_14": "Rapid Care 14'",
"PROGRAMS.WM_WD.CARE_30": "Rapid Care 30'", "care_30": "Rapid Care 30'",
"PROGRAMS.WM_WD.CARE_44": "Rapid Care 44'", "care_44": "Rapid Care 44'",
"PROGRAMS.WM_WD.CHECKUP": "Check-Up", "checkup": "Check-Up",
"PROGRAMS.WM_WD.COLOUR_59": "Colored 59'", "colour_59": "Colored 59'",
"PROGRAMS.WM_WD.COLOUR_59_STEAM": "Colored 59' + Steam", "colour_59_steam": "Colored 59' + Steam",
"PROGRAMS.WM_WD.COTTONS": "Cotton", "cottons": "Cotton",
"PROGRAMS.WM_WD.COTTONS_PREWASH": "Cottons + Prewash", "cottons_prewash": "Cottons + Prewash",
"PROGRAMS.WM_WD.COTTONS_STEAM": "Cotton + Steam", "cottons_steam": "Cotton + Steam",
"PROGRAMS.WM_WD.COTTON_CARE_59": "Cotton Care 59'", "cotton_care_59": "Cotton Care 59'",
"PROGRAMS.WM_WD.DELICATE_59": "Delicate 59'", "delicate_59": "Delicate 59'",
"PROGRAMS.WM_WD.DELICATE_SILK": "Delicate and Silk", "delicate_silk": "Delicate and Silk",
"PROGRAMS.WM_WD.DELICATE_SILK_STEAM": "Delicate and Silk + Steam", "delicate_silk_steam": "Delicate and Silk + Steam",
"PROGRAMS.WM_WD.DELICATI_59": "Delicate 59'", "delicati_59": "Delicate 59'",
"PROGRAMS.WM_WD.DELICATI_59_STEAM": "Delicate 59' + Steam", "delicati_59_steam": "Delicate 59' + Steam",
"PROGRAMS.WM_WD.DRAIN_SPIN": "Drain + Spin", "drain_spin": "Drain + Spin",
"PROGRAMS.WM_WD.EASY_IRON": "Easy Iron", "easy_iron": "Easy Iron",
"PROGRAMS.WM_WD.ECO_40_60_NEW_ENERGY_LABEL": "Eco 40-60", "eco_40_60_new_energy_label": "Eco 40-60",
"PROGRAMS.WM_WD.EXTRA_CARE": "Extra Care", "extra_care": "Extra Care",
"PROGRAMS.WM_WD.FITNESS": "Fitness Care", "fitness": "Fitness Care",
"PROGRAMS.WM_WD.FITNESS_CARE": "Fitness Care", "fitness_care": "Fitness Care",
"PROGRAMS.WM_WD.FRESH_CARE": "Fresh Care", "fresh_care": "Fresh Care",
"PROGRAMS.WM_WD.FRESH_CARE_STEAM": "Fresh Care + Steam", "fresh_care_steam": "Fresh Care + Steam",
"PROGRAMS.WM_WD.HANDWASH_WOOL": "Hand Wash + Wool", "handwash_wool": "Hand Wash + Wool",
"PROGRAMS.WM_WD.HIGH_DRY": "High Heat Dry", "high_dry": "High Heat Dry",
"PROGRAMS.WM_WD.HQD_20_DEGREES": "Cotton 20℃", "hqd_20_degrees": "Cotton 20℃",
"PROGRAMS.WM_WD.HQD_ALLERGY": "Allergy Care", "hqd_allergy": "Allergy Care",
"PROGRAMS.WM_WD.HQD_AUTOCLEAN": "Drum Cleaning", "hqd_autoclean": "Drum Cleaning",
"PROGRAMS.WM_WD.HQD_BABYCARE": "Baby Care", "hqd_babycare": "Baby Care",
"PROGRAMS.WM_WD.HQD_CHECKUP": "Check-Up", "hqd_baby_care": "Baby care",
"PROGRAMS.WM_WD.HQD_COTTONS": "Cotton", "hqd_bath_towel": "Bath towel",
"PROGRAMS.WM_WD.HQD_DELICATE": "Delicate", "hqd_bed_sheets": "Bed sheets",
"PROGRAMS.WM_WD.HQD_DELICATE_CRADLE": "Delicate", "hqd_bulky": "Bulky",
"PROGRAMS.WM_WD.HQD_DRY": "Cotton Dry", "hqd_casual": "Casual",
"PROGRAMS.WM_WD.HQD_DRY_SYNTHETICS": "Low Heat Dry", "hqd_checkup": "Check-Up",
"PROGRAMS.WM_WD.HQD_DUVET": "Duvet", "hqd_cold_wind_30": "Cold wind 30'",
"PROGRAMS.WM_WD.HQD_ECO_40_60_DEGREES": "Eco 40-60", "hqd_cold_wind_timing": "Cold wind timing",
"PROGRAMS.WM_WD.HQD_HANDWASH_WOOL": "Wool", "hqd_cotton": "Cotton",
"PROGRAMS.WM_WD.HQD_I_REFRESH": "i-Refresh", "hqd_cottons": "Cotton",
"PROGRAMS.WM_WD.HQD_MIX": "Mix", "hqd_curtain": "Curtain",
"PROGRAMS.WM_WD.HQD_QUICK_15": "Quick 15'", "hqd_delicate": "Delicate",
"PROGRAMS.WM_WD.HQD_QUICK_WASH_57": "Quick Wash 57'", "hqd_delicate_cradle": "Delicate",
"PROGRAMS.WM_WD.HQD_RAPID_WASH_AND_DRY": "Wash and dry", "hqd_diaper": "Diaper",
"PROGRAMS.WM_WD.HQD_REFRESH": "Refresh", "hqd_dry": "Cotton Dry",
"PROGRAMS.WM_WD.HQD_RINSE": "Rinses", "hqd_dry_synthetics": "Low Heat Dry",
"PROGRAMS.WM_WD.HQD_SHIRTS": "Shirts", "hqd_duvet": "Duvet",
"PROGRAMS.WM_WD.HQD_SMART": "Smart A.I.", "hqd_eco_40_60_degrees": "Eco 40-60",
"PROGRAMS.WM_WD.HQD_SPIN": "Spin", "hqd_feather": "Feather",
"PROGRAMS.WM_WD.HQD_SPORT": "Sport", "hqd_handwash_wool": "Wool",
"PROGRAMS.WM_WD.HQD_SUPER_FAST": "Super Fast 39'", "hqd_hot_wind_timing": "Hot wind timing",
"PROGRAMS.WM_WD.HQD_SYNTHETIC_AND_COLOURED": "Synthetics", "hqd_hygienic": "Hygienic",
"PROGRAMS.WM_WD.HYGIENE_59": "Hygiene Plus 59'", "hqd_i_refresh": "i-Refresh",
"PROGRAMS.WM_WD.HYGIENE_60": "Hygiene 60°C", "hqd_i_refresh_pro": "i-Refresh Pro",
"PROGRAMS.WM_WD.HYGIENE_PLUS_59": "Hygiene Plus 59'", "hqd_jacket": "Jacket",
"PROGRAMS.WM_WD.HYGIENE_PLUS_59_MIN": "Hygiene Plus 59'", "hqd_jeans": "Jeans",
"PROGRAMS.WM_WD.HYGIENE_PRO_4_MIN": "Hygiene Pro 49'", "hqd_luxury": "Luxury",
"PROGRAMS.WM_WD.HYGIENE_PRO_49_MIN": "Hygiene Pro 49'", "hqd_mix": "Mix",
"PROGRAMS.WM_WD.HYGIENE_PRO_STEAM": "Hygiene Pro + Steam", "hqd_night_dry": "Night dry",
"PROGRAMS.WM_WD.INTENSIVE_40": "Intensive 40°C", "hqd_outdoor": "Outdoor",
"PROGRAMS.WM_WD.INTENSIVE_40_STEAM": "Intensive 40°C + Steam", "hqd_precious_cure": "Precious cure",
"PROGRAMS.WM_WD.IOT_CHECKUP": "Check-Up", "hqd_quick_15": "Quick 15'",
"PROGRAMS.WM_WD.IOT_DRY_AIR_REFRESH": "Air Refresh", "hqd_quick_20": "Quick 20'",
"PROGRAMS.WM_WD.IOT_DRY_ANTI_MITES": "Anti-mite", "hqd_quick_30": "Quick 30'",
"PROGRAMS.WM_WD.IOT_DRY_BABY": "Baby", "hqd_quick_dry": "Quick dry",
"PROGRAMS.WM_WD.IOT_DRY_BACKPACKS": "Backpacks", "hqd_quick_wash_57": "Quick Wash 57'",
"PROGRAMS.WM_WD.IOT_DRY_BATHROBE": "Bathrobes", "hqd_quilt": "Quilt",
"PROGRAMS.WM_WD.IOT_DRY_BED_LINEN": "Bed Linen", "hqd_rapid_wash_and_dry": "Wash and dry",
"PROGRAMS.WM_WD.IOT_DRY_COTTON_DRY": "Cotton Dry", "hqd_refresh": "Refresh",
"PROGRAMS.WM_WD.IOT_DRY_CUDDLY_TOYS": "Cuddly Toys", "hqd_rinse": "Rinses",
"PROGRAMS.WM_WD.IOT_DRY_CURTAINS": "Curtains", "hqd_school_uniform": "School uniform",
"PROGRAMS.WM_WD.IOT_DRY_DEHUMIDIFIER": "Humidity Remover", "hqd_shirt": "Shirt",
"PROGRAMS.WM_WD.IOT_DRY_DELICATES_ANTIALLERGY": "Delicates Anti-allergy", "hqd_shirts": "Shirts",
"PROGRAMS.WM_WD.IOT_DRY_DELICATE_TABLECLOTHS": "Delicate Tablecloths", "hqd_shoes": "Shoes",
"PROGRAMS.WM_WD.IOT_DRY_DENIM_JEANS": "Denim - Jeans", "hqd_silk": "Silk",
"PROGRAMS.WM_WD.IOT_DRY_EASY_IRON_COTTON": "Easy Iron - Cotton", "hqd_smart": "Smart A.I.",
"PROGRAMS.WM_WD.IOT_DRY_EASY_IRON_SYNTHETICS": "Easy Iron - Synthetics", "hqd_spin": "Spin",
"PROGRAMS.WM_WD.IOT_DRY_GYM_FIT": "Gym fit - Fitness", "hqd_sport": "Sport",
"PROGRAMS.WM_WD.IOT_DRY_LINGERIE": "Lingerie", "hqd_sports": "Sports",
"PROGRAMS.WM_WD.IOT_DRY_MIXED_DRY": "Mixed Dry", "hqd_super_fast": "Super Fast 39'",
"PROGRAMS.WM_WD.IOT_DRY_RAPID_60_MIN_DELICATES": "Rapid 60' - Delicates", "hqd_synthetic_and_coloured": "Synthetics",
"PROGRAMS.WM_WD.IOT_DRY_SHIRTS": "Shirts", "hqd_synthetics": "Synthetics",
"PROGRAMS.WM_WD.IOT_DRY_SWIMSUITS_AND_BIKINIS": "Swimsuits and Bikinis", "hqd_timer": "Timer",
"PROGRAMS.WM_WD.IOT_DRY_SYNTHETICS": "Synthetic Dry", "hqd_towel": "Towel",
"PROGRAMS.WM_WD.IOT_DRY_SYNTHETIC_DRY": "Synthetic Dry", "hqd_underwear": "Underwear",
"PROGRAMS.WM_WD.IOT_DRY_TABLECLOTHS": "Tablecloths", "hqd_warm_up": "Warm up",
"PROGRAMS.WM_WD.IOT_DRY_TECHNICAL_FABRICS": "Technical Fabrics", "hqd_wool": "Wool",
"PROGRAMS.WM_WD.IOT_DRY_WARM_EMBRACE": "Warm Embrace", "hqd_working_suit": "Working suit",
"PROGRAMS.WM_WD.IOT_DRY_WOOL_DRY": "Wool Dry", "hygiene_59": "Hygiene Plus 59'",
"PROGRAMS.WM_WD.IOT_WASH_AND_DRY": "Wash and dry", "hygiene_60": "Hygiene 60°C",
"PROGRAMS.WM_WD.IOT_WASH_ANTI_MITES": "Anti-mites", "hygiene_plus_59": "Hygiene Plus 59'",
"PROGRAMS.WM_WD.IOT_WASH_ANTI_ODOR": "Anti-odour", "hygiene_plus_59_min": "Hygiene Plus 59'",
"PROGRAMS.WM_WD.IOT_WASH_ARIEL_CLEAN_CYCLE": "Ariel Ultimate Clean", "hygiene_pro_4_min": "Hygiene Pro 49'",
"PROGRAMS.WM_WD.IOT_WASH_ARIEL_COLD_CYCLE": "Ariel Cold Clean", "hygiene_pro_49_min": "Hygiene Pro 49'",
"PROGRAMS.WM_WD.IOT_WASH_ARIEL_FRESH_CYCLE": "Ariel Fresh Clean", "hygiene_pro_steam": "Hygiene Pro + Steam",
"PROGRAMS.WM_WD.IOT_WASH_BABY_SANITIZER": "Sanitizer", "intensive_40": "Intensive 40°C",
"PROGRAMS.WM_WD.IOT_WASH_BABY_SANITIZER_STEAM": "Sanitiser + Steam", "intensive_40_steam": "Intensive 40°C + Steam",
"PROGRAMS.WM_WD.IOT_WASH_BACKPACKS": "Backpacks", "iot_checkup": "Check-Up",
"PROGRAMS.WM_WD.IOT_WASH_BACKPACKS_ZELIG": "Backpacks", "iot_dry_air_refresh": "Air Refresh",
"PROGRAMS.WM_WD.IOT_WASH_BATHROBE": "Bathrobes and Towels", "iot_dry_anti_mites": "Anti-mite",
"PROGRAMS.WM_WD.IOT_WASH_BATHROBE_STEAM": "Bathrobe and Towels + Steam", "iot_dry_baby": "Baby",
"PROGRAMS.WM_WD.IOT_WASH_BED_LINEN": "Bed Linen", "iot_dry_backpacks": "Backpacks",
"PROGRAMS.WM_WD.IOT_WASH_BED_LINEN_STEAM": "Bed Linen + Steam", "iot_dry_bathrobe": "Bathrobes",
"PROGRAMS.WM_WD.IOT_WASH_BED_LINEN_ZELIG": "Bed Linens", "iot_dry_bed_linen": "Bed Linen",
"PROGRAMS.WM_WD.IOT_WASH_BIG_SINGLE_LOAD": "Big single load", "iot_dry_cotton_dry": "Cotton Dry",
"PROGRAMS.WM_WD.IOT_WASH_BLEACHING": "Bleaching", "iot_dry_cotton": "Cotton",
"PROGRAMS.WM_WD.IOT_WASH_BLOOD_STAINS": "Bloodstains", "iot_dry_cuddly_toys": "Cuddly Toys",
"PROGRAMS.WM_WD.IOT_WASH_CASHMERE": "Cashmere", "iot_dry_curtains": "Curtains",
"PROGRAMS.WM_WD.IOT_WASH_CHOCOLATE_STAINS": "Chocolate stains", "iot_dry_dehumidifier": "Humidity Remover",
"PROGRAMS.WM_WD.IOT_WASH_COLD_WASH": "Cold Wash", "iot_dry_delicates": "Delicates",
"PROGRAMS.WM_WD.IOT_WASH_COLORED": "Colored", "iot_dry_delicates_antiallergy": "Delicates Anti-allergy",
"PROGRAMS.WM_WD.IOT_WASH_COLORED_ANTI_STAIN": "Colored Anti-stain", "iot_dry_delicate_tablecloths": "Delicate Tablecloths",
"PROGRAMS.WM_WD.IOT_WASH_COLORED_DELICATE": "Colored Delicate", "iot_dry_denim_jeans": "Denim - Jeans",
"PROGRAMS.WM_WD.IOT_WASH_COLOURED": "Colored", "iot_dry_down_jacket": "Down jacket",
"PROGRAMS.WM_WD.IOT_WASH_COLOURED_BED_LINEN": "Colored Bed Linen", "iot_dry_duvet": "Duvet",
"PROGRAMS.WM_WD.IOT_WASH_COLOURED_BED_LINEN_STEAM": "Coloured Bed Linen + Steam", "iot_dry_easy_iron_cotton": "Easy Iron - Cotton",
"PROGRAMS.WM_WD.IOT_WASH_COLOURED_CURTAINS": "Colored Curtains", "iot_dry_easy_iron_synthetics": "Easy Iron - Synthetics",
"PROGRAMS.WM_WD.IOT_WASH_COLOURED_SHIRTS": "Colored Shirts", "iot_dry_gym_fit": "Gym fit - Fitness",
"PROGRAMS.WM_WD.IOT_WASH_COLOURED_SHIRTS_STEAM": "Colored Shirts + Steam", "iot_dry_lingerie": "Lingerie",
"PROGRAMS.WM_WD.IOT_WASH_COLOURED_STEAM": "Colored + Steam", "iot_dry_mixed": "Mixed",
"PROGRAMS.WM_WD.IOT_WASH_COLOURED_TABLECLOTHES": "Colored Tableclothes", "iot_dry_mixed_dry": "Mixed Dry",
"PROGRAMS.WM_WD.IOT_WASH_COLOURED_TABLECLOTHES_STEAM": "Coloured Tablecloths + Steam", "iot_dry_rapid_30": "Rapid 30'",
"PROGRAMS.WM_WD.IOT_WASH_COTTON": "Cotton", "iot_dry_rapid_59": "Rapid 59'",
"PROGRAMS.WM_WD.IOT_WASH_COTTON_STEAM": "Cotton + Steam", "iot_dry_rapid_60_min_delicates": "Rapid 60' - Delicates",
"PROGRAMS.WM_WD.IOT_WASH_CUDDLY_TOYS": "Cuddly Toys", "iot_dry_shirts": "Shirts",
"PROGRAMS.WM_WD.IOT_WASH_CURTAINS": "Curtains", "iot_dry_swimsuits_and_bikinis": "Swimsuits and Bikinis",
"PROGRAMS.WM_WD.IOT_WASH_CURTAINS_STEAM": "Curtains + Steam", "iot_dry_synthetics": "Synthetic Dry",
"PROGRAMS.WM_WD.IOT_WASH_CURTAINS_ZELIG": "Curtains", "iot_dry_synthetic_dry": "Synthetic Dry",
"PROGRAMS.WM_WD.IOT_WASH_DARK": "Darks", "iot_dry_tablecloths": "Tablecloths",
"PROGRAMS.WM_WD.IOT_WASH_DARKS_AND_COLOURED_44": "Darks and Colored 44'", "iot_dry_technical_fabrics": "Technical Fabrics",
"PROGRAMS.WM_WD.IOT_WASH_DARKS_AND_COLOURED_59": "Darks and Colored 59'", "iot_dry_warm_embrace": "Warm Embrace",
"PROGRAMS.WM_WD.IOT_WASH_DARKS_AND_COLOURED_XL": "Darks and Colored XL", "iot_dry_wool": "Wool",
"PROGRAMS.WM_WD.IOT_WASH_DARK_STEAM": "Darks + Steam", "iot_dry_wool_dry": "Wool Dry",
"PROGRAMS.WM_WD.IOT_WASH_DASH_CLEAN_CYCLE": "Dash Ultimate Clean", "iot_wash_and_dry": "Wash and dry",
"PROGRAMS.WM_WD.IOT_WASH_DASH_COLD_CYCLE": "Dash Cold Clean", "iot_wash_anti_mites": "Anti-mites",
"PROGRAMS.WM_WD.IOT_WASH_DASH_FRESH_CYCLE": "Dash Fresh Clean", "iot_wash_anti_odor": "Anti-odour",
"PROGRAMS.WM_WD.IOT_WASH_DELICATE": "Delicates", "iot_wash_ariel_clean_cycle": "Ariel Ultimate Clean",
"PROGRAMS.WM_WD.IOT_WASH_DELICATE_ANTIALLERGY": "Delicate Anti-Allergy", "iot_wash_ariel_cold_cycle": "Ariel Cold Clean",
"PROGRAMS.WM_WD.IOT_WASH_DELICATE_ANTIALLERGY_STEAM": "Delicate Anti-Allergy + Steam", "iot_wash_ariel_fresh_cycle": "Ariel Fresh Clean",
"PROGRAMS.WM_WD.IOT_WASH_DELICATE_ANTIALLERGY_ZELIG": "Delicate Anti-Allergy", "iot_wash_baby_sanitizer": "Sanitizer",
"PROGRAMS.WM_WD.IOT_WASH_DELICATE_COLORS": "Delicate Colors", "iot_wash_baby_sanitizer_steam": "Sanitiser + Steam",
"PROGRAMS.WM_WD.IOT_WASH_DELICATE_COLORS_STEAM": "Delicate Colors + Steam", "iot_wash_backpacks": "Backpacks",
"PROGRAMS.WM_WD.IOT_WASH_DELICATE_DARK": "Delicate Darks", "iot_wash_backpacks_zelig": "Backpacks",
"PROGRAMS.WM_WD.IOT_WASH_DELICATE_STEAM": "Delicates + Steam", "iot_wash_bathrobe": "Bathrobes and Towels",
"PROGRAMS.WM_WD.IOT_WASH_DELICATE_TABLECLOTHS": "Delicate Tablecloths", "iot_wash_bathrobe_steam": "Bathrobe and Towels + Steam",
"PROGRAMS.WM_WD.IOT_WASH_DELICATE_TABLECLOTHS_STEAM": "Delicate Tablecloths + Steam", "iot_wash_bed_linen": "Bed Linen",
"PROGRAMS.WM_WD.IOT_WASH_DELICATE_WHITES": "Delicate Whites", "iot_wash_bed_linen_steam": "Bed Linen + Steam",
"PROGRAMS.WM_WD.IOT_WASH_DENIM_JEANS": "Denim - Jeans", "iot_wash_bed_linen_zelig": "Bed Linens",
"PROGRAMS.WM_WD.IOT_WASH_DIVING_SUITS": "Diving Suits", "iot_wash_big_single_load": "Big single load",
"PROGRAMS.WM_WD.IOT_WASH_DIVING_SUITS_ZELIG": "Diving Suits", "iot_wash_bleaching": "Bleaching",
"PROGRAMS.WM_WD.IOT_WASH_DOWN_JACKETS": "Down Jackets", "iot_wash_blood_stains": "Bloodstains",
"PROGRAMS.WM_WD.IOT_WASH_DOWN_JACKETS_ZELIG": "Down Jackets", "iot_wash_cashmere": "Cashmere",
"PROGRAMS.WM_WD.IOT_WASH_DUVET": "Duvet", "iot_wash_chocolate_stains": "Chocolate stains",
"PROGRAMS.WM_WD.IOT_WASH_FRUIT_STAINS": "Fruit stains", "iot_wash_cold_wash": "Cold Wash",
"PROGRAMS.WM_WD.IOT_WASH_GYM_FIT": "Gym Fit - Fitness", "iot_wash_colored": "Colored",
"PROGRAMS.WM_WD.IOT_WASH_HANDWASH": "Handwash", "iot_wash_colored_anti_stain": "Colored Anti-stain",
"PROGRAMS.WM_WD.IOT_WASH_HANDWASH_COLORED": "Handwash Colored", "iot_wash_colored_delicate": "Colored Delicate",
"PROGRAMS.WM_WD.IOT_WASH_HANDWASH_DARK": "Handwash Darks", "iot_wash_coloured": "Colored",
"PROGRAMS.WM_WD.IOT_WASH_LINGERIE": "Lingerie", "iot_wash_coloured_bed_linen": "Colored Bed Linen",
"PROGRAMS.WM_WD.IOT_WASH_MASKS_REFRESH": "Masks Refresh", "iot_wash_coloured_bed_linen_steam": "Coloured Bed Linen + Steam",
"PROGRAMS.WM_WD.IOT_WASH_MASKS_SANIFICATION": "Masks Sanitization", "iot_wash_coloured_curtains": "Colored Curtains",
"PROGRAMS.WM_WD.IOT_WASH_MASKS_SANIFICATION_STEAM": "Mask Sanitisation + Steam", "iot_wash_coloured_shirts": "Colored Shirts",
"PROGRAMS.WM_WD.IOT_WASH_MATS": "Mats", "iot_wash_coloured_shirts_steam": "Colored Shirts + Steam",
"PROGRAMS.WM_WD.IOT_WASH_MEN_S_TROUSERS": "Trousers", "iot_wash_coloured_steam": "Colored + Steam",
"PROGRAMS.WM_WD.IOT_WASH_MIXED": "Mixed", "iot_wash_coloured_tableclothes": "Colored Tableclothes",
"PROGRAMS.WM_WD.IOT_WASH_MIXED_STEAM": "Mixed + Steam", "iot_wash_coloured_tableclothes_steam": "Coloured Tablecloths + Steam",
"PROGRAMS.WM_WD.IOT_WASH_MIX_AND_COLOURED_44": "Mix and Colored 44'", "iot_wash_cotton": "Cotton",
"PROGRAMS.WM_WD.IOT_WASH_MIX_AND_COLOURED_59": "Mix and Colored 59'", "iot_wash_cotton_steam": "Cotton + Steam",
"PROGRAMS.WM_WD.IOT_WASH_MIX_AND_COLOURED_XL": "Mix and colored XL", "iot_wash_cuddly_toys": "Cuddly Toys",
"PROGRAMS.WM_WD.IOT_WASH_NEW_CLOTHES": "New Clothes", "iot_wash_curtains": "Curtains",
"PROGRAMS.WM_WD.IOT_WASH_PERFECT_WHITE": "Perfect White", "iot_wash_curtains_steam": "Curtains + Steam",
"PROGRAMS.WM_WD.IOT_WASH_PERFECT_WHITE_STEAM": "Perfect White + Steam", "iot_wash_curtains_zelig": "Curtains",
"PROGRAMS.WM_WD.IOT_WASH_PETS": "Pet Accessories", "iot_wash_dark": "Darks",
"PROGRAMS.WM_WD.IOT_WASH_PETS_HAIR_REMOVAL": "Pets Hair Removal", "iot_wash_darks_and_coloured_44": "Darks and Colored 44'",
"PROGRAMS.WM_WD.IOT_WASH_PETS_ODOURS_STAINS_REMOVAL": "Pets Odours and Stains Removal", "iot_wash_darks_and_coloured_59": "Darks and Colored 59'",
"PROGRAMS.WM_WD.IOT_WASH_PETS_STEAM": "Pet Accessories + Steam", "iot_wash_darks_and_coloured_xl": "Darks and Colored XL",
"PROGRAMS.WM_WD.IOT_WASH_PLAYSUITS": "Playsuits", "iot_wash_dark_steam": "Darks + Steam",
"PROGRAMS.WM_WD.IOT_WASH_PLAYSUITS_STEAM": "Playsuits + Steam", "iot_wash_dash_clean_cycle": "Dash Ultimate Clean",
"PROGRAMS.WM_WD.IOT_WASH_QUICK_DRUM_CLEANER": "Quick drum cleaner", "iot_wash_dash_cold_cycle": "Dash Cold Clean",
"PROGRAMS.WM_WD.IOT_WASH_RAPID_14": "Rapid 14", "iot_wash_dash_fresh_cycle": "Dash Fresh Clean",
"PROGRAMS.WM_WD.IOT_WASH_RAPID_30": "Rapid 30", "iot_wash_delicate": "Delicates",
"PROGRAMS.WM_WD.IOT_WASH_RAPID_44": "Rapid 44'", "iot_wash_delicate_antiallergy": "Delicate Anti-Allergy",
"PROGRAMS.WM_WD.IOT_WASH_RAPID_59": "Rapid 59'", "iot_wash_delicate_antiallergy_steam": "Delicate Anti-Allergy + Steam",
"PROGRAMS.WM_WD.IOT_WASH_RAPID_59_STEAM": "Rapid 59' + Steam", "iot_wash_delicate_antiallergy_zelig": "Delicate Anti-Allergy",
"PROGRAMS.WM_WD.IOT_WASH_REFRESH_14_MIN": "Refresh 14'", "iot_wash_delicate_colors": "Delicate Colors",
"PROGRAMS.WM_WD.IOT_WASH_RESISTANT_COLORED": "Resistant Colored", "iot_wash_delicate_colors_steam": "Delicate Colors + Steam",
"PROGRAMS.WM_WD.IOT_WASH_RESISTANT_DARK": "Resistant Darks", "iot_wash_delicate_dark": "Delicate Darks",
"PROGRAMS.WM_WD.IOT_WASH_RESISTANT_WHITES": "Resistant Whites", "iot_wash_delicate_steam": "Delicates + Steam",
"PROGRAMS.WM_WD.IOT_WASH_RINSE": "Rinses", "iot_wash_delicate_tablecloths": "Delicate Tablecloths",
"PROGRAMS.WM_WD.IOT_WASH_SHIRTS": "Shirts", "iot_wash_delicate_tablecloths_steam": "Delicate Tablecloths + Steam",
"PROGRAMS.WM_WD.IOT_WASH_SHIRTS_STEAM": "Shirts + Steam", "iot_wash_delicate_whites": "Delicate Whites",
"PROGRAMS.WM_WD.IOT_WASH_SILK": "Silk", "iot_wash_denim_jeans": "Denim - Jeans",
"PROGRAMS.WM_WD.IOT_WASH_SKI_SUIT": "Ski Suit", "iot_wash_diving_suits": "Diving Suits",
"PROGRAMS.WM_WD.IOT_WASH_SKI_SUIT_ZELIG": "Ski Suit", "iot_wash_diving_suits_zelig": "Diving Suits",
"PROGRAMS.WM_WD.IOT_WASH_SPIN": "Spin", "iot_wash_down_jackets": "Down Jackets",
"PROGRAMS.WM_WD.IOT_WASH_SPORT": "Sport", "iot_wash_down_jackets_zelig": "Down Jackets",
"PROGRAMS.WM_WD.IOT_WASH_SPORT_ANTI_ODOR": "Anti-odour Sportswear", "iot_wash_duvet": "Duvet",
"PROGRAMS.WM_WD.IOT_WASH_SPORT_ANTI_ODOR_ZELIG": "Anti-odour Sportswear", "iot_wash_fruit_stains": "Fruit stains",
"PROGRAMS.WM_WD.IOT_WASH_STAINS_REMOVER": "Stain Remover", "iot_wash_gym_fit": "Gym Fit - Fitness",
"PROGRAMS.WM_WD.IOT_WASH_SWIMSUITS_AND_BIKINIS": "Swimsuits and Bikinis", "iot_wash_handwash": "Handwash",
"PROGRAMS.WM_WD.IOT_WASH_SYNTHETIC": "Synthetics", "iot_wash_handwash_colored": "Handwash Colored",
"PROGRAMS.WM_WD.IOT_WASH_SYNTHETIC_STEAM": "Synthetics + Steam", "iot_wash_handwash_dark": "Handwash Darks",
"PROGRAMS.WM_WD.IOT_WASH_TABLECLOTHS": "Tablecloths", "iot_wash_lingerie": "Lingerie",
"PROGRAMS.WM_WD.IOT_WASH_TABLECLOTHS_STEAM": "Tablecloths + Steam", "iot_wash_masks_refresh": "Masks Refresh",
"PROGRAMS.WM_WD.IOT_WASH_TECHNICAL_FABRICS": "Technical Fabrics", "iot_wash_masks_sanification": "Masks Sanitization",
"PROGRAMS.WM_WD.IOT_WASH_TECHNICAL_FABRICS_ZELIG": "Technical Fabrics", "iot_wash_masks_sanification_steam": "Mask Sanitisation + Steam",
"PROGRAMS.WM_WD.IOT_WASH_TECHNICAL_JACKETS": "Technical Jackets", "iot_wash_mats": "Mats",
"PROGRAMS.WM_WD.IOT_WASH_TECHNICAL_JACKETS_ZELIG": "Technical Jackets", "iot_wash_men_s_trousers": "Trousers",
"PROGRAMS.WM_WD.IOT_WASH_TRAINERS": "Trainers", "iot_wash_mixed": "Mixed",
"PROGRAMS.WM_WD.IOT_WASH_WHITES": "Whites", "iot_wash_mixed_steam": "Mixed + Steam",
"PROGRAMS.WM_WD.IOT_WASH_WHITES_44": "Whites 44'", "iot_wash_mix_and_coloured_44": "Mix and Colored 44'",
"PROGRAMS.WM_WD.IOT_WASH_WHITES_59": "Whites 59'", "iot_wash_mix_and_coloured_59": "Mix and Colored 59'",
"PROGRAMS.WM_WD.IOT_WASH_WHITES_XL": "Whites XL", "iot_wash_mix_and_coloured_xl": "Mix and colored XL",
"PROGRAMS.WM_WD.IOT_WASH_WINE_STAINS": "Wine Stains", "iot_wash_new_clothes": "New Clothes",
"PROGRAMS.WM_WD.IOT_WASH_WOOL": "Wool", "iot_wash_perfect_white": "Perfect White",
"PROGRAMS.WM_WD.JEANS": "Jeans", "iot_wash_perfect_white_steam": "Perfect White + Steam",
"PROGRAMS.WM_WD.JEANS_60": "Jeans", "iot_wash_pets": "Pet Accessories",
"PROGRAMS.WM_WD.LOW_DRY": "Low Heat Dry", "iot_wash_pets_hair_removal": "Pets Hair Removal",
"PROGRAMS.WM_WD.MIXED": "Mixed", "iot_wash_pets_odours_stains_removal": "Pets Odours and Stains Removal",
"PROGRAMS.WM_WD.MIXED_AND_COLORED_59": "Mixed and Colored 59'", "iot_wash_pets_steam": "Pet Accessories + Steam",
"PROGRAMS.WM_WD.MIXED_STEAM": "Mixed + Steam", "iot_wash_playsuits": "Playsuits",
"PROGRAMS.WM_WD.MIX_AND_COLOUR_59": "Mixed and Colored 59'", "iot_wash_playsuits_steam": "Playsuits + Steam",
"PROGRAMS.WM_WD.MIX_AND_COLOUR_59_STEAM": "Mixed and Coloured 59' + Steam", "iot_wash_quick_drum_cleaner": "Quick drum cleaner",
"PROGRAMS.WM_WD.NIGHT_AND_DAY": "Night and Day", "iot_wash_rapid_14": "Rapid 14",
"PROGRAMS.WM_WD.NIGHT_WASH": "Night Wash", "iot_wash_rapid_30": "Rapid 30",
"PROGRAMS.WM_WD.PERFECT_59": "Perfect 59'", "iot_wash_rapid_44": "Rapid 44'",
"PROGRAMS.WM_WD.PERFECT_COTTON_59": "Perfect Cotton 59'", "iot_wash_rapid_59": "Rapid 59'",
"PROGRAMS.WM_WD.PERFECT_COTTON_59_STEAM": "Perfect Cotton 59' + Steam", "iot_wash_rapid_59_steam": "Rapid 59' + Steam",
"PROGRAMS.WM_WD.PERFECT_WHITES_59": "Perfect White 59'", "iot_wash_refresh_14_min": "Refresh 14'",
"PROGRAMS.WM_WD.RAPID_14_MIN": "Rapid 14'", "iot_wash_resistant_colored": "Resistant Colored",
"PROGRAMS.WM_WD.RAPID_30_MIN": "Rapid 30'", "iot_wash_resistant_dark": "Resistant Darks",
"PROGRAMS.WM_WD.RAPID_44_MIN": "Rapid 44'", "iot_wash_resistant_whites": "Resistant Whites",
"PROGRAMS.WM_WD.RAPID_A_CLASS_60": "Rapid 59' A Class", "iot_wash_rinse": "Rinses",
"PROGRAMS.WM_WD.RAPID_A_CLASS_60_STEAM": "Rapid 59' A Class + Steam", "iot_wash_shirts": "Shirts",
"PROGRAMS.WM_WD.RAPID_WASH_AND_DRY_59_MIN": "Wash and Dry 59'", "iot_wash_shirts_steam": "Shirts + Steam",
"PROGRAMS.WM_WD.RESISTANT_COTTON": "Resistant Cotton", "iot_wash_silk": "Silk",
"PROGRAMS.WM_WD.RESISTANT_COTTON_STEAM": "Resistant Cotton + Steam", "iot_wash_ski_suit": "Ski Suit",
"PROGRAMS.WM_WD.RINSE": "Rinse", "iot_wash_ski_suit_zelig": "Ski Suit",
"PROGRAMS.WM_WD.SHIRTS_STEAM": "Shirts + Steam", "iot_wash_spin": "Spin",
"PROGRAMS.WM_WD.SILENT_NIGHT": "Silent Night", "iot_wash_sport": "Sport",
"PROGRAMS.WM_WD.SINGLE_ITEM": "Single Item", "iot_wash_sport_anti_odor": "Anti-odour Sportswear",
"PROGRAMS.WM_WD.SINGLE_ITEM_STEAM": "Single Item + Steam", "iot_wash_sport_anti_odor_zelig": "Anti-odour Sportswear",
"PROGRAMS.WM_WD.SMART_WASH": "Smart Wash", "iot_wash_stains_remover": "Stain Remover",
"PROGRAMS.WM_WD.SOFT_CARE": "Soft Care", "iot_wash_swimsuits_and_bikinis": "Swimsuits and Bikinis",
"PROGRAMS.WM_WD.SOFT_CARE_STEAM_TITLE": "Soft Care + Steam", "iot_wash_synthetic": "Synthetics",
"PROGRAMS.WM_WD.SPECIAL_39": "Special 39'", "iot_wash_synthetic_steam": "Synthetics + Steam",
"PROGRAMS.WM_WD.SPECIAL_39_FULL_LOAD": "Special 39'", "iot_wash_tablecloths": "Tablecloths",
"PROGRAMS.WM_WD.SPECIAL_39_FULL_LOAD_STEAM": "Special 39' + Steam", "iot_wash_tablecloths_steam": "Tablecloths + Steam",
"PROGRAMS.WM_WD.SPECIAL_49": "Special 49'", "iot_wash_technical_fabrics": "Technical Fabrics",
"PROGRAMS.WM_WD.SPORT_39": "Sport 39'", "iot_wash_technical_fabrics_zelig": "Technical Fabrics",
"PROGRAMS.WM_WD.SPORT_PLUS_29": "Sport Plus 29'", "iot_wash_technical_jackets": "Technical Jackets",
"PROGRAMS.WM_WD.SPORT_PLUS_39": "Sport Plus 39'", "iot_wash_technical_jackets_zelig": "Technical Jackets",
"PROGRAMS.WM_WD.STEAM_39": "Steam 39'", "iot_wash_trainers": "Trainers",
"PROGRAMS.WM_WD.STEAM_CARE_PRO": "Steam Care Pro", "iot_wash_whites": "Whites",
"PROGRAMS.WM_WD.STEAM_CARE_PRO_COTTON": "Steam Care Pro - Cottons", "iot_wash_whites_44": "Whites 44'",
"PROGRAMS.WM_WD.STEAM_CARE_PRO_DELICATES": "Steam Care Pro - Delicates", "iot_wash_whites_59": "Whites 59'",
"PROGRAMS.WM_WD.STEAM_CARE_PRO_SYNTHETIC": "Steam Care Pro - Synthetics", "iot_wash_whites_xl": "Whites XL",
"PROGRAMS.WM_WD.STEAM_HYGIENE_PLUS": "Hygiene Plus + Steam", "iot_wash_wine_stains": "Wine Stains",
"PROGRAMS.WM_WD.SYNTHETICS": "Synthetics", "iot_wash_wool": "Wool",
"PROGRAMS.WM_WD.SYNTHETIC_AND_COLOURED": "Synthetic and Colored", "jeans": "Jeans",
"PROGRAMS.WM_WD.SYNTHETIC_AND_COLOURED_STEAM": "Synthetic and Coloured + Steam", "jeans_60": "Jeans",
"PROGRAMS.WM_WD.TAILORED_RESISTANT_COTTON": "Tailored Resistant Cotton", "low_dry": "Low Heat Dry",
"PROGRAMS.WM_WD.TAILORED_SYNTHETIC_AND_COLOURED": "Tailored Synthetic Colored", "mixed": "Mixed",
"PROGRAMS.WM_WD.TOTAL_CARE": "Total Care", "mixed_and_colored_59": "Mixed and Colored 59'",
"PROGRAMS.WM_WD.TUMBLING": "Tumbling", "mixed_steam": "Mixed + Steam",
"PROGRAMS.WM_WD.WOOL": "Wool", "mix_and_colour_59": "Mixed and Colored 59'",
"PROGRAMS.WM_WD.WOOL_AND_DELICATES_49": "Wool and Delicates 49'", "mix_and_colour_59_steam": "Mixed and Coloured 59' + Steam",
"PROGRAMS.WM_WD.WOOL_DRY": "Wool Dry", "night_and_day": "Night and Day",
"PROGRAMS.WM_WD.WOOL_SOFT_CARE": "Wool and Soft Car" "night_wash": "Night Wash",
"perfect_59": "Perfect 59'",
"perfect_cotton_59": "Perfect Cotton 59'",
"perfect_cotton_59_steam": "Perfect Cotton 59' + Steam",
"perfect_whites_59": "Perfect White 59'",
"rapid_14_min": "Rapid 14'",
"rapid_30_min": "Rapid 30'",
"rapid_44_min": "Rapid 44'",
"rapid_a_class_60": "Rapid 59' A Class",
"rapid_a_class_60_steam": "Rapid 59' A Class + Steam",
"rapid_wash_and_dry_59_min": "Wash and Dry 59'",
"resistant_cotton": "Resistant Cotton",
"resistant_cotton_steam": "Resistant Cotton + Steam",
"rinse": "Rinse",
"shirts_steam": "Shirts + Steam",
"silent_night": "Silent Night",
"single_item": "Single Item",
"single_item_steam": "Single Item + Steam",
"smart_wash": "Smart Wash",
"soft_care": "Soft Care",
"soft_care_steam": "Soft Care + Steam",
"soft_care_steam_title": "Soft Care + Steam",
"special_39": "Special 39'",
"special_39_full_load": "Special 39'",
"special_39_full_load_steam": "Special 39' + Steam",
"special_49": "Special 49'",
"sport_39": "Sport 39'",
"sport_plus_29": "Sport Plus 29'",
"sport_plus_39": "Sport Plus 39'",
"steam_39": "Steam 39'",
"steam_care_pro": "Steam Care Pro",
"steam_care_pro_cotton": "Steam Care Pro - Cottons",
"steam_care_pro_delicates": "Steam Care Pro - Delicates",
"steam_care_pro_synthetic": "Steam Care Pro - Synthetics",
"steam_hygiene_plus": "Hygiene Plus + Steam",
"synthetics": "Synthetics",
"synthetic_and_coloured": "Synthetic and Colored",
"synthetic_and_coloured_steam": "Synthetic and Coloured + Steam",
"tailored_resistant_cotton": "Tailored Resistant Cotton",
"tailored_synthetic_and_coloured": "Tailored Synthetic Colored",
"total_care": "Total Care",
"tumbling": "Tumbling",
"wool": "Wool",
"wool_and_delicates_49": "Wool and Delicates 49'",
"wool_dry": "Wool Dry",
"wool_soft_care": "Wool and Soft Car"
} }
} }
} }

View File

@ -1,5 +1,4 @@
{ {
"name": "Haier hOn", "name": "Haier hOn",
"render_readme": true,
"homeassistant": "2023.2.0" "homeassistant": "2023.2.0"
} }

36
info.md Normal file
View File

@ -0,0 +1,36 @@
# Haier hOn
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/Andre0512/hon?color=green)](https://github.com/Andre0512/hon/releases/latest)
![GitHub](https://img.shields.io/github/license/Andre0512/hon?color=red)
[![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/)
Support for home appliances of Haier's mobile app hOn.
## Supported Appliances
- Tumble Dryer
- Washer Dryer
- Washing Machine
- Oven
## Tested Appliances
- Haier WD90-B14TEAM5
- Haier HD80-A3959
- Haier HWO60SM2F3XH
- Hoover H-WASH 500
## Configuration
**Method 1**: [![Open your Home Assistant instance and start setting up a new integration.](https://my.home-assistant.io/badges/config_flow_start.svg)](https://my.home-assistant.io/redirect/config_flow_start/?domain=hon)
**Method 2**: Settings > Devices & Services > Add Integration > **Haier hOn**
_If the integration is not in the list, you need to clear the browser cache._
## Contribute
Want to help us to support more appliances?
Or add more sensors?
Or help with translating?
Or beautify some icons or captions?
Check out the [project on GitHub](https://github.com/Andre0512/hon), every contribution is welcome!