Compare commits

...

20 Commits

Author SHA1 Message Date
11a3d39f2c Bump version 2023-06-16 00:05:48 +02:00
ae985cb0d9 Fix set select entity #70 2023-06-15 23:53:37 +02:00
c1e6f9547c Update issue templates 2023-06-12 12:28:39 +02:00
b1448ddfd8 Update readme 2023-06-12 01:37:07 +02:00
dfa5735bc2 Readable internal names for some selects 2023-06-12 00:20:38 +02:00
52c3a861de Use readable names for options #68 2023-06-11 22:34:45 +02:00
d3503af158 Bump version 2023-06-10 07:13:07 +02:00
d81b1ae712 Add td phase 8, #64 2023-06-10 07:00:57 +02:00
eb5ba43707 Add wine cellar 2023-06-10 06:44:19 +02:00
efcac321b8 Bump version 2023-06-09 06:04:05 +02:00
79b43b8695 Use fan entity for wind speed 2023-06-09 05:56:52 +02:00
5bc3120000 Bump version 2023-06-08 22:07:56 +02:00
0f9f0dee4c Fix issues when changing climate mode #52 2023-06-08 21:46:36 +02:00
80b3741f2f Reduce lagging update 2023-06-08 20:01:55 +02:00
c433714a94 Refactor and update for lagging climate 2023-06-08 19:59:43 +02:00
228cf3cf73 Bump version 2023-06-07 02:33:53 +02:00
1a50e8112d Update readme, fix typo 2023-05-30 05:33:11 +02:00
57ecd7c3a5 Adding HO integration (#56)
* Update button.py

* Update number.py

* Update sensor.py
2023-05-30 05:22:02 +02:00
2fe8ace9f5 Add program name sensor 2023-05-29 19:07:52 +02:00
6e9981c9ab Add climate entity for oven 2023-05-28 17:38:56 +02:00
37 changed files with 19218 additions and 7820 deletions

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

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

View File

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

116
README.md
View File

@ -4,7 +4,7 @@
[![PyPI](https://img.shields.io/pypi/v/pyhon?label=pyhOn)](https://github.com/Andre0512/pyhOn)
[![GitHub](https://img.shields.io/github/license/Andre0512/hon?color=red)](https://github.com/Andre0512/hon/blob/main/LICENSE)
[![GitHub all releases](https://img.shields.io/github/downloads/Andre0512/hon/total?color=blue)](https://tooomm.github.io/github-release-stats/?username=Andre0512&repository=hon)
Home Assistant integration for [Haier's mobile app hOn](https://hon-smarthome.com/).
Home Assistant integration for [Haier's mobile app hOn](https://hon-smarthome.com/) based on [pyhOn](https://github.com/Andre0512/pyhon).
## Supported Appliances
- [Washing Machine](https://github.com/Andre0512/hon#washing-machine)
@ -12,9 +12,11 @@ Home Assistant integration for [Haier's mobile app hOn](https://hon-smarthome.co
- [Washer Dryer](https://github.com/Andre0512/hon#washer-dryer)
- [Oven](https://github.com/Andre0512/hon#oven)
- [Dish Washer](https://github.com/Andre0512/hon#dish-washer)
- [Air conditioner](https://github.com/Andre0512/hon#air-conditioner)
- [Fridge](https://github.com/Andre0512/hon#fridge)
- [Hob](https://github.com/Andre0512/hon#hob) [BETA]
- [Air conditioner](https://github.com/Andre0512/hon#air-conditioner) [BETA]
- [Fridge](https://github.com/Andre0512/hon#fridge) [BETA]
- [Hood](https://github.com/Andre0512/hon#hood) [BETA]
- [Wine Cellar](https://github.com/Andre0512/hon#wine-cellar) [BETA]
## 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)
@ -32,6 +34,22 @@ _Restart Home Assistant_
**Method 2**: Settings > Devices & Services > Add Integration > **Haier hOn**
_If the integration is not in the list, you need to clear the browser cache._
## Supported Models
Support has been confirmed for these models, but many more will work. Please add already supported devices [with this form to complete the list](https://forms.gle/bTSD8qFotdZFytbf8).
| | **Haier** | **Hoover** | **Candy** |
|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
| **Washing Machine** | HW90-B14TEAM5 <br/> HW100-B14959U1 | H-WASH 500 <br/> H7W4 48MBC-S | CO4 107T1/2-07 <br/> RO44 1286DWMC4-07 <br/> HW 68AMC/1-80 <br/> HWPD 69AMBC/1-S |
| **Tumble Dryer** | HD80-A3959 | H-DRY 500 <br/> H9A3TCBEXS-S <br/> HLE C10DCE-80 <br/> NDE H10A2TCE-80 <br/> NDE H9A2TSBEXS-S <br/> NDPHY10A2TCBEXSS | BCTDH7A1TE <br/> CSOE C10DE-80 <br/> ROE H9A3TCEX-S |
| **Washer Dryer** | HWD100-B14979 | HWPS4954DAMR-11 | RPW41066BWMR/1-S |
| **Oven** | HWO60SM2F3XH | HSOT3161WG | |
| **Dish Washer** | XIB 3B2SFS-80 <br/> XIB 6B2D3FB | HFB 6B2S3FX | |
| **Air conditioner** | AD105S2SM3FA <br/> AS20HPL1HRA <br/> AS25PBAHRA <br/> AS25S2SF1FA-WH <br/> AS25TADHRA-2 <br/> AS35S2SF2FA-3 <br/> AS35TADHRA-2 <br/> AS35TAMHRA-C | | |
| **Fridge** | HFW7720ENMB | | CCE4T620EWU |
| **Hob** | HA2MTSJ68MC | | CIS633SCTTWIFI |
| **Hood** | HADG6DS46BWIFI | | |
| **Wine Cellar** | HWS247FDU1 | | |
## Supported Languages
Translation of internal names like programs are available for all languages which are official supported by the hOn app:
* 🇨🇳 Chinese
@ -58,39 +76,6 @@ Translation of internal names like programs are available for all languages whic
### Washing Machine
![washing_machine.png](assets/washing_machine.png)
## Supported Models
Support has been confirmed for these models, but many more will work. Please add already supported devices [with this form to complete the list](https://forms.gle/bTSD8qFotdZFytbf8).
- Haier AD105S2SM3FA
- Haier AS25PBAHRA
- Haier AS25TADHRA-2
- Haier AS35TADHRA-2
- Haier EG9012B19SU1JD
- Haier HD80-A3959
- Haier HW90-B14TEAM5
- Haier HW100-B14959U1
- Haier HWD100-B14979
- Haier HWO60SM2F3XH
- Haier XIB 3B2SFS-80
- Haier XIB 6B2D3FB
- Candy BCTDH7A1TE
- Candy CIS633SCTTWIFI
- Candy CSOE C10DE-80
- Candy ROE H9A3TCEX-S
- Candy RPW41066BWMR/1-S
- Hoover H-WASH 500
- Hoover H-DRY 500
- Hoover H7W4 48MBC-S
- Hoover H9A3TCBEXS-S
- Hoover HFB 6B2S3FX
- Hoover HLE C10DCE-80
- Hoover HSOT3161WG
- Hoover HW 68AMC/1-80
- Hoover HWPD 69AMBC/1-S
- Hoover HWPS4954DAMR-11
- Hoover NDE H10A2TCE-80
- Hoover NDE H9A2TSBEXS-S
- Hoover NDPHY10A2TCBEXSS
## Contribute
Any kind of contribution is welcome!
### Read out device data
@ -180,8 +165,10 @@ For every device exists a hidden button which can be used to log all infos of yo
| Filter Replacement | | `binary_sensor` | `filterChangeStatusLocal` |
| In Air Temperature Outdoor | `thermometer` | `sensor` | `tempInAirOutdoor` |
| Indoor Temperature | `thermometer` | `sensor` | `tempIndoor` |
| Machine Status | `information` | `sensor` | `machMode` |
| Outdoor Temperature | `thermometer` | `sensor` | `tempOutdoor` |
| Program | | `select` | `startProgram.program` |
| Program | `play` | `sensor` | `programName` |
| Selected Temperature | `thermometer` | `sensor` | `tempSel` |
### Dish washer
@ -217,11 +204,39 @@ For every device exists a hidden button which can be used to log all infos of yo
| Door | | `binary_sensor` | `doorStatus` |
| Error | `math-log` | `sensor` | `errors` |
| Machine Status | `information` | `sensor` | `machMode` |
| Program | `play` | `sensor` | `programName` |
| Program Phase | `washing-machine` | `sensor` | `prPhase` |
| Remaining Time | `timer` | `sensor` | `remainingTimeMM` |
| Rinse Aid | `spray-bottle` | `binary_sensor` | `rinseAidStatus` |
| Salt | `shaker-outline` | `binary_sensor` | `saltStatus` |
### Hood
#### Controls
| Name | Icon | Entity | Key |
| --- | --- | --- | --- |
| Start Program | `hvac` | `button` | `startProgram` |
| Stop Program | `hvac-off` | `button` | `stopProgram` |
| Wind Speed | | `fan` | `settings.windSpeed` |
#### Configs
| Name | Icon | Entity | Key |
| --- | --- | --- | --- |
| Light status | `lightbulb` | `number` | `startProgram.lightStatus` |
#### Sensors
| Name | Icon | Entity | Key |
| --- | --- | --- | --- |
| Delay time | `clock-start` | `sensor` | `delayTime` |
| Delay time status | `clock-start` | `sensor` | `delayTimeStatus` |
| Errors | `alert-circle` | `sensor` | `errors` |
| Filter Cleaning Alarm Status | | `sensor` | `filterCleaningAlarmStatus` |
| Filter Cleaning Status | | `sensor` | `filterCleaningStatus` |
| Last Work Time | `clock-start` | `sensor` | `lastWorkTime` |
| Light Status | `lightbulb` | `sensor` | `lightStatus` |
| Mach Mode | | `sensor` | `machMode` |
| On / Off Status | `lightbulb` | `sensor` | `onOffStatus` |
| Quick Delay Time Status | | `sensor` | `quickDelayTimeStatus` |
| RGB Light Color | `lightbulb` | `sensor` | `rgbLightColors` |
| RGB Light Status | `lightbulb` | `sensor` | `rgbLightStatus` |
### Hob
#### Controls
| Name | Icon | Entity | Key |
@ -243,6 +258,7 @@ For every device exists a hidden button which can be used to log all infos of yo
| On | `power-cycle` | `binary_sensor` | `attributes.parameters.onOffStatus` |
| Pan Status | `pot-mix` | `binary_sensor` | `panStatus` |
| Power | `lightning-bolt` | `sensor` | `power` |
| Program | `play` | `sensor` | `programName` |
| Remaining Time | `timer` | `sensor` | `remainingTimeMM` |
| Temperature | `thermometer` | `sensor` | `temp` |
@ -251,6 +267,7 @@ For every device exists a hidden button which can be used to log all infos of yo
| Name | Icon | Entity | Key |
| --- | --- | --- | --- |
| Oven | `toaster-oven` | `switch` | `startProgram` / `stopProgram` |
| Oven | `thermometer` | `climate` | `settings.tempSel` |
#### Configs
| Name | Icon | Entity | Key |
| --- | --- | --- | --- |
@ -264,6 +281,7 @@ For every device exists a hidden button which can be used to log all infos of yo
| --- | --- | --- | --- |
| Connection | `wifi` | `binary_sensor` | `attributes.lastConnEvent.category` |
| On | `power-cycle` | `binary_sensor` | `attributes.parameters.onOffStatus` |
| Program | `play` | `sensor` | `programName` |
| Remaining Time | `timer` | `sensor` | `remainingTimeMM` |
| Start Time | `clock-start` | `sensor` | `delayTime` |
| Temperature | `thermometer` | `sensor` | `temp` |
@ -334,13 +352,34 @@ For every device exists a hidden button which can be used to log all infos of yo
| Dry level | `hair-dryer` | `sensor` | `dryLevel` |
| Error | `math-log` | `sensor` | `errors` |
| Machine Status | `information` | `sensor` | `machMode` |
| Program | `tumble-dryer` | `sensor` | `programName` |
| Program | `play` | `sensor` | `programName` |
| Program Phase | `washing-machine` | `sensor` | `prPhase` |
| Remaining Time | `timer` | `sensor` | `remainingTimeMM` |
| Start Time | `clock-start` | `sensor` | `delayTime` |
| Steam level | `smoke` | `sensor` | `steamLevel` |
| Temperature level | `thermometer` | `sensor` | `tempLevel` |
### Wine Cellar
#### Controls
| Name | Icon | Entity | Key |
| --- | --- | --- | --- |
| Light | `lightbulb` | `switch` | `lightStatus` |
| Sabbath Mode | `palm-tree` | `switch` | `sabbathStatus` |
| Wine Cellar | `thermometer` | `climate` | `settings.tempSel` |
| Wine Cellar | `thermometer` | `climate` | `settings.tempSelZ2` |
#### Sensors
| Name | Icon | Entity | Key |
| --- | --- | --- | --- |
| Error | `math-log` | `sensor` | `errors` |
| Humidity | `water-percent` | `sensor` | `humidityZ1` |
| Humidity 2 | `water-percent` | `sensor` | `humidityZ2` |
| Program | `play` | `sensor` | `programName` |
| Room Temperature | `home-thermometer-outline` | `sensor` | `tempEnv` |
| Selected Temperature | `thermometer` | `sensor` | `tempSel` |
| Selected Temperature 2 | `thermometer` | `sensor` | `tempSelZ2` |
| Temperature | `thermometer` | `sensor` | `temp` |
| Temperature 2 | `thermometer` | `sensor` | `tempZ2` |
### Washer dryer
#### Controls
| Name | Icon | Entity | Key |
@ -404,7 +443,7 @@ For every device exists a hidden button which can be used to log all infos of yo
| Good Night Mode | | `binary_sensor` | `goodNight` |
| Machine Status | `information` | `sensor` | `machMode` |
| Pre Wash | | `binary_sensor` | `startProgram.prewash` |
| Program | `tumble-dryer` | `sensor` | `programName` |
| Program | `play` | `sensor` | `programName` |
| Program Phase | `washing-machine` | `sensor` | `prPhase` |
| Remaining Time | `timer` | `sensor` | `remainingTimeMM` |
| Remote Control | `remote` | `binary_sensor` | `attributes.lastConnEvent.category` |
@ -467,6 +506,7 @@ For every device exists a hidden button which can be used to log all infos of yo
| Good Night Mode | | `binary_sensor` | `goodNight` |
| Machine Status | `information` | `sensor` | `machMode` |
| Pre Wash | | `binary_sensor` | `startProgram.prewash` |
| Program | `play` | `sensor` | `programName` |
| Program Phase | `washing-machine` | `sensor` | `prPhase` |
| Remaining Time | `timer` | `sensor` | `remainingTimeMM` |
| Remote Control | `remote` | `binary_sensor` | `attributes.lastConnEvent.category` |

View File

@ -271,9 +271,10 @@ class HonBinarySensorEntity(HonEntity, BinarySensorEntity):
)
@callback
def _handle_coordinator_update(self):
def _handle_coordinator_update(self, update=True) -> None:
self._attr_native_value = (
self._device.get(self.entity_description.key, "")
== self.entity_description.on_value
)
self.async_write_ha_state()
if update:
self.async_write_ha_state()

View File

@ -35,6 +35,20 @@ BUTTONS: dict[str, tuple[ButtonEntityDescription, ...]] = {
translation_key="stop_program",
),
),
"HO": (
ButtonEntityDescription(
key="startProgram",
name="Start Program",
icon="mdi:hvac",
translation_key="start_program",
),
ButtonEntityDescription(
key="stopProgram",
name="Stop Program",
icon="mdi:hvac-off",
translation_key="stop_program",
),
),
}

View File

@ -17,11 +17,9 @@ from homeassistant.components.climate.const import (
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
ATTR_TEMPERATURE,
PRECISION_WHOLE,
TEMP_CELSIUS,
)
from homeassistant.core import callback
from pyhon import helper
from pyhon.appliance import HonAppliance
from .const import HON_HVAC_MODE, HON_FAN, HON_HVAC_PROGRAM, DOMAIN
@ -36,8 +34,8 @@ class HonACClimateEntityDescription(ClimateEntityDescription):
@dataclass
class HonREFClimateEntityDescription(ClimateEntityDescription):
pass
class HonClimateEntityDescription(ClimateEntityDescription):
mode: HVACMode = "auto"
CLIMATES = {
@ -50,19 +48,46 @@ CLIMATES = {
),
),
"REF": (
HonREFClimateEntityDescription(
HonClimateEntityDescription(
key="settings.tempSelZ1",
mode=HVACMode.COOL,
name="Fridge",
icon="mdi:thermometer",
translation_key="fridge",
),
HonREFClimateEntityDescription(
HonClimateEntityDescription(
key="settings.tempSelZ2",
mode=HVACMode.COOL,
name="Freezer",
icon="mdi:snowflake-thermometer",
translation_key="freezer",
),
),
"OV": (
HonClimateEntityDescription(
key="settings.tempSel",
mode=HVACMode.HEAT,
name="Oven",
icon="mdi:thermometer",
translation_key="oven",
),
),
"WC": (
HonClimateEntityDescription(
key="settings.tempSel",
mode=HVACMode.COOL,
name="Wine Cellar",
icon="mdi:thermometer",
translation_key="wine",
),
HonClimateEntityDescription(
key="settings.tempSelZ2",
mode=HVACMode.COOL,
name="Wine Cellar",
icon="mdi:thermometer",
translation_key="wine",
),
),
}
@ -74,10 +99,10 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
if description.key not in list(device.commands):
continue
entity = HonACClimateEntity(hass, entry, device, description)
elif isinstance(description, HonREFClimateEntityDescription):
elif isinstance(description, HonClimateEntityDescription):
if description.key not in device.available_settings:
continue
entity = HonREFClimateEntity(hass, entry, device, description)
entity = HonClimateEntity(hass, entry, device, description)
else:
continue
await entity.coordinator.async_config_entry_first_refresh()
@ -90,16 +115,16 @@ class HonACClimateEntity(HonEntity, ClimateEntity):
super().__init__(hass, entry, device, description)
self._attr_temperature_unit = TEMP_CELSIUS
self._attr_target_temperature_step = PRECISION_WHOLE
self._attr_target_temperature_step = device.settings["settings.tempSel"].step
self._attr_max_temp = device.settings["settings.tempSel"].max
self._attr_min_temp = device.settings["settings.tempSel"].min
self._attr_hvac_modes = [HVACMode.OFF] + [
HON_HVAC_MODE[mode] for mode in device.settings["settings.machMode"].values
]
self._attr_fan_modes = [FAN_OFF] + [
HON_FAN[mode] for mode in device.settings["settings.windSpeed"].values
]
self._attr_hvac_modes = [HVACMode.OFF]
for mode in device.settings["settings.machMode"].values:
self._attr_hvac_modes.append(HON_HVAC_MODE[mode])
self._attr_fan_modes = [FAN_OFF]
for mode in device.settings["settings.windSpeed"].values:
self._attr_fan_modes.append(HON_FAN[mode])
self._attr_swing_modes = [
SWING_OFF,
SWING_VERTICAL,
@ -114,29 +139,69 @@ class HonACClimateEntity(HonEntity, ClimateEntity):
self._handle_coordinator_update(update=False)
async def async_set_hvac_mode(self, hvac_mode):
if self._device.get("onOffStatus") == "0":
self._attr_hvac_mode = HVACMode.OFF
else:
self._attr_hvac_mode = HON_HVAC_MODE[self._device.get("machMode")]
if hvac_mode == HVACMode.OFF:
await self._device.commands["stopProgram"].send()
else:
self._device.settings["startProgram.program"].value = HON_HVAC_PROGRAM[
hvac_mode
]
await self._device.commands["startProgram"].send()
self._attr_hvac_mode = hvac_mode
@property
def target_temperature(self) -> int | None:
"""Return the temperature we try to reach."""
return int(float(self._device.get("tempSel")))
@property
def current_temperature(self) -> float | None:
"""Return the current temperature."""
return float(self._device.get("tempIndoor"))
async def async_set_temperature(self, **kwargs):
if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None:
return False
self._device.settings["settings.tempSel"].value = str(int(temperature))
await self._device.commands["settings"].send()
self.async_write_ha_state()
@property
def hvac_mode(self) -> HVACMode | str | None:
if self._device.get("onOffStatus") == "0":
return HVACMode.OFF
else:
return HON_HVAC_MODE[self._device.get("machMode")]
async def async_set_hvac_mode(self, hvac_mode):
self._attr_hvac_mode = hvac_mode
if hvac_mode == HVACMode.OFF:
command = "stopProgram"
else:
mode = HON_HVAC_PROGRAM[hvac_mode]
self._device.settings["startProgram.program"].value = mode
command = "startProgram"
await self._device.commands[command].send()
self._device.sync_command(command, "settings")
self.async_write_ha_state()
@property
def fan_mode(self) -> str | None:
"""Return the fan setting."""
return HON_FAN[self._device.get("windSpeed")]
async def async_set_fan_mode(self, fan_mode):
mode_number = list(HON_FAN.values()).index(fan_mode)
self._device.settings["settings.windSpeed"].value = list(HON_FAN.keys())[
mode_number
]
mode = list(HON_FAN.keys())[mode_number]
self._device.settings["settings.windSpeed"].value = mode
self._attr_fan_mode = fan_mode
await self._device.commands["settings"].send()
self.async_write_ha_state()
@property
def swing_mode(self) -> str | None:
"""Return the swing setting."""
horizontal = self._device.get("windDirectionHorizontal")
vertical = self._device.get("windDirectionVertical")
if horizontal == "7" and vertical == "8":
return SWING_BOTH
elif horizontal == "7":
return SWING_HORIZONTAL
elif vertical == "8":
return SWING_VERTICAL
else:
return SWING_OFF
async def async_set_swing_mode(self, swing_mode):
horizontal = self._device.settings["settings.windDirectionHorizontal"]
vertical = self._device.settings["settings.windDirectionVertical"]
@ -152,72 +217,59 @@ class HonACClimateEntity(HonEntity, ClimateEntity):
await self._device.commands["settings"].send()
self.async_write_ha_state()
async def async_set_temperature(self, **kwargs):
if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None:
return False
self._device.settings["settings.tempSel"].value = str(int(temperature))
await self._device.commands["settings"].send()
self.async_write_ha_state()
@callback
def _handle_coordinator_update(self, update=True) -> None:
self._attr_target_temperature = int(float(self._device.get("tempSel")))
self._attr_current_temperature = float(self._device.get("tempIndoor"))
if self._device.get("onOffStatus") == "0":
self._attr_hvac_mode = HVACMode.OFF
else:
self._attr_hvac_mode = HON_HVAC_MODE[self._device.get("machMode")]
self._attr_fan_mode = HON_FAN[self._device.get("windSpeed")]
horizontal = self._device.get("windDirectionHorizontal")
vertical = self._device.get("windDirectionVertical")
if horizontal == "7" and vertical == "8":
self._attr_swing_mode = SWING_BOTH
elif horizontal == "7":
self._attr_swing_mode = SWING_HORIZONTAL
elif vertical == "8":
self._attr_swing_mode = SWING_VERTICAL
else:
self._attr_swing_mode = SWING_OFF
self._attr_target_temperature = self.target_temperature
self._attr_current_temperature = self.current_temperature
self._attr_hvac_mode = self.hvac_mode
self._attr_fan_mode = self.fan_mode
self._attr_swing_mode = self.swing_mode
if update:
self.async_write_ha_state()
class HonREFClimateEntity(HonEntity, ClimateEntity):
class HonClimateEntity(HonEntity, ClimateEntity):
entity_description: HonClimateEntityDescription
def __init__(self, hass, entry, device: HonAppliance, description) -> None:
super().__init__(hass, entry, device, description)
self._attr_temperature_unit = TEMP_CELSIUS
self._attr_target_temperature_step = PRECISION_WHOLE
self._attr_max_temp = device.settings[description.key].max
self._attr_min_temp = device.settings[description.key].min
self._set_temperature_bound()
self._attr_hvac_modes = [HVACMode.COOL]
self._attr_supported_features = (
ClimateEntityFeature.TARGET_TEMPERATURE | ClimateEntityFeature.PRESET_MODE
)
self._handle_coordinator_update(update=False)
self._attr_hvac_modes = [description.mode]
if "stopProgram" in device.commands:
self._attr_hvac_modes += [HVACMode.OFF]
modes = []
else:
modes = ["no_mode"]
modes = ["no_mode"]
for mode, data in device.commands["startProgram"].categories.items():
if mode not in data.parameters["program"].values:
continue
if zone := data.parameters.get("zone"):
if self.entity_description.name.lower() in zone.values:
modes.append(mode)
else:
modes.append(mode)
self._attr_preset_modes = modes
@property
def target_temperature(self) -> int | None:
"""Return the temperature we try to reach."""
return int(self._device.get(self.entity_description.key))
self._handle_coordinator_update(update=False)
@property
def current_temperature(self) -> int | None:
def target_temperature(self) -> float | None:
"""Return the temperature we try to reach."""
return float(self._device.get(self.entity_description.key))
@property
def current_temperature(self) -> float | None:
"""Return the current temperature."""
temp_key = self.entity_description.key.split(".")[-1].replace("Sel", "")
return int(self._device.get(temp_key))
return float(self._device.get(temp_key))
async def async_set_temperature(self, **kwargs):
if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None:
@ -226,35 +278,59 @@ class HonREFClimateEntity(HonEntity, ClimateEntity):
await self._device.commands["settings"].send()
self.async_write_ha_state()
@property
def hvac_mode(self) -> HVACMode | str | None:
if self._device.get("onOffStatus") == "0":
return HVACMode.OFF
else:
return self.entity_description.mode
async def async_set_hvac_mode(self, hvac_mode):
if len(self.hvac_modes) <= 1:
return
if hvac_mode == HVACMode.OFF:
await self._device.commands["stopProgram"].send()
else:
await self._device.commands["startProgram"].send()
self._attr_hvac_mode = hvac_mode
self.async_write_ha_state()
@property
def preset_mode(self) -> str | None:
"""Return the current Preset for this channel."""
return self._device.get(f"mode{self.entity_description.key[-2:]}", "no_mode")
if self._device.get("onOffStatus") is not None:
return self._device.get("programName", "")
else:
return self._device.get(
f"mode{self.entity_description.key[-2:]}", "no_mode"
)
async def async_set_preset_mode(self, preset_mode: str) -> None:
"""Set the new preset mode."""
if preset_mode == "no_mode":
self._device.sync_command("stopProgram", "settings")
await self.coordinator.async_refresh()
await self._device.commands["stopProgram"].send()
else:
self._device.settings["startProgram.program"].value = preset_mode
self._device.settings[
"startProgram.zone"
].value = self.entity_description.name.lower()
self._device.sync_command("startProgram", "settings")
await self.coordinator.async_refresh()
await self._device.commands["startProgram"].send()
command = "stopProgram" if preset_mode == "no_mode" else "startProgram"
if program := self._device.settings.get(f"{command}.program"):
program.value = preset_mode
if zone := self._device.settings.get(f"{command}.zone"):
zone.value = self.entity_description.name.lower()
self._device.sync_command(command, "settings")
self._set_temperature_bound()
await self.coordinator.async_refresh()
await self._device.commands[command].send()
self._attr_preset_mode = preset_mode
self.async_write_ha_state()
def _set_temperature_bound(self):
self._attr_target_temperature_step = self._device.settings[
self.entity_description.key
].step
self._attr_max_temp = self._device.settings[self.entity_description.key].max
self._attr_min_temp = self._device.settings[self.entity_description.key].min
@callback
def _handle_coordinator_update(self, update=True) -> None:
self._attr_target_temperature = int(
float(self._device.get(self.entity_description.key))
)
temp_key = self.entity_description.key.split(".")[-1].replace("Sel", "")
self._attr_current_temperature = int(self._device.get(temp_key))
self._attr_hvac_mode = HVACMode.COOL
self._attr_target_temperature = self.target_temperature
self._attr_current_temperature = self.current_temperature
self._attr_hvac_mode = self.hvac_mode
self._attr_preset_mode = self.preset_mode
if update:
self.async_write_ha_state()

View File

@ -7,6 +7,7 @@ from homeassistant.components.climate import (
)
DOMAIN = "hon"
UPDATE_INTERVAL = 10
PLATFORMS = [
"sensor",
@ -16,6 +17,7 @@ PLATFORMS = [
"button",
"binary_sensor",
"climate",
"fan",
]
HON_HVAC_MODE = {
@ -68,256 +70,121 @@ LANGUAGES = [
]
WASHING_PR_PHASE = {
"0": "WASHING_CMD&CTRL.PHASE_READY.TITLE",
"1": "WASHING_CMD&CTRL.PHASE_WASHING.TITLE",
"2": "WASHING_CMD&CTRL.PHASE_WASHING.TITLE",
"3": "WASHING_CMD&CTRL.PHASE_SPIN.TITLE",
"4": "WASHING_CMD&CTRL.PHASE_RINSE.TITLE",
"5": "WASHING_CMD&CTRL.PHASE_RINSE.TITLE",
"6": "WASHING_CMD&CTRL.PHASE_RINSE.TITLE",
"7": "WASHING_CMD&CTRL.PHASE_DRYING.TITLE",
"9": "WASHING_CMD&CTRL.PHASE_STEAM.TITLE",
"10": "WASHING_CMD&CTRL.PHASE_READY.TITLE",
"11": "WASHING_CMD&CTRL.PHASE_SPIN.TITLE",
"12": "WASHING_CMD&CTRL.PHASE_WEIGHTING.TITLE",
"13": "WASHING_CMD&CTRL.PHASE_WEIGHTING.TITLE",
"14": "WASHING_CMD&CTRL.PHASE_WASHING.TITLE",
"15": "WASHING_CMD&CTRL.PHASE_WASHING.TITLE",
"16": "WASHING_CMD&CTRL.PHASE_WASHING.TITLE",
"17": "WASHING_CMD&CTRL.PHASE_RINSE.TITLE",
"18": "WASHING_CMD&CTRL.PHASE_RINSE.TITLE",
"19": "WASHING_CMD&CTRL.PHASE_SCHEDULED.TITLE",
"20": "WASHING_CMD&CTRL.PHASE_TUMBLING.TITLE",
"24": "WASHING_CMD&CTRL.PHASE_REFRESH.TITLE",
"25": "WASHING_CMD&CTRL.PHASE_WASHING.TITLE",
"26": "WASHING_CMD&CTRL.PHASE_HEATING.TITLE",
"27": "WASHING_CMD&CTRL.PHASE_WASHING.TITLE",
"0": "ready",
"1": "washing",
"2": "washing",
"3": "spin",
"4": "rinse",
"5": "rinse",
"6": "rinse",
"7": "drying",
"9": "steam",
"10": "ready",
"11": "spin",
"12": "weighting",
"13": "weighting",
"14": "washing",
"15": "washing",
"16": "washing",
"17": "rinse",
"18": "rinse",
"19": "scheduled",
"20": "tumbling",
"24": "refresh",
"25": "washing",
"26": "heating",
"27": "washing",
}
MACH_MODE = {
"0": "WASHING_CMD&CTRL.PHASE_READY.TITLE", # NO_STATE
"1": "WASHING_CMD&CTRL.PHASE_READY.TITLE", # SELECTION_MODE
"2": "WASHING_CMD&CTRL.PHASE_RUNNING.TITLE", # EXECUTION_MODE
"3": "WASHING_CMD&CTRL.PHASE_PAUSE.TITLE", # PAUSE_MODE
"4": "WASHING_CMD&CTRL.PHASE_SCHEDULED.TITLE", # DELAY_START_SELECTION_MODE
"5": "WASHING_CMD&CTRL.PHASE_SCHEDULED.TITLE", # DELAY_START_EXECUTION_MODE
"6": "WASHING_CMD&CTRL.PHASE_ERROR.TITLE", # ERROR_MODE
"7": "WASHING_CMD&CTRL.PHASE_READY.TITLE", # END_MODE
"8": "Test", # TEST_MODE
"9": "GLOBALS.APPLIANCE_STATUS.ENDING_PROGRAM", # STOP_MODE
"0": "ready", # NO_STATE
"1": "ready", # SELECTION_MODE
"2": "running", # EXECUTION_MODE
"3": "pause", # PAUSE_MODE
"4": "scheduled", # DELAY_START_SELECTION_MODE
"5": "scheduled", # DELAY_START_EXECUTION_MODE
"6": "error", # ERROR_MODE
"7": "ready", # END_MODE
"8": "test", # TEST_MODE
"9": "ending", # STOP_MODE
}
TUMBLE_DRYER_PR_PHASE = {
"0": "WASHING_CMD&CTRL.PHASE_READY.TITLE",
"1": "TD_CMD&CTRL.STATUS_PHASE.PHASE_HEAT_STROKE",
"2": "WASHING_CMD&CTRL.PHASE_DRYING.TITLE",
"3": "TD_CMD&CTRL.STATUS_PHASE.PHASE_COOLDOWN",
"11": "WASHING_CMD&CTRL.PHASE_READY.TITLE",
"13": "TD_CMD&CTRL.STATUS_PHASE.PHASE_COOLDOWN",
"14": "TD_CMD&CTRL.STATUS_PHASE.PHASE_HEAT_STROKE",
"15": "TD_CMD&CTRL.STATUS_PHASE.PHASE_HEAT_STROKE",
"16": "TD_CMD&CTRL.STATUS_PHASE.PHASE_COOLDOWN",
"0": "ready",
"1": "heat_stroke",
"2": "drying",
"3": "cooldown",
"8": "unknown",
"11": "ready",
"12": "unknown",
"13": "cooldown",
"14": "heat_stroke",
"15": "heat_stroke",
"16": "cooldown",
"17": "unknown",
"18": "WASHING_CMD&CTRL.PHASE_TUMBLING.DASHBOARD_TITLE",
"19": "WASHING_CMD&CTRL.PHASE_DRYING.TITLE",
"20": "WASHING_CMD&CTRL.PHASE_DRYING.TITLE",
"18": "tumbling",
"19": "drying",
"20": "drying",
}
DIRTY_LEVEL = {
"1": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.LITTLE",
"2": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.NORMAL",
"3": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.VERY",
"0": "unknown",
"1": "little",
"2": "normal",
"3": "very",
}
STEAM_LEVEL = {
"0": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.NO_STEAM",
"1": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_FABRICS.COTTON_TITLE",
"2": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_FABRICS.DELICATE_TITLE",
"3": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_FABRICS.SYNTHETIC_TITLE",
"0": "no_steam",
"1": "cotton",
"2": "delicate",
"3": "synthetic",
}
DISHWASHER_PR_PHASE = {
"0": "WASHING_CMD&CTRL.PHASE_READY.TITLE",
"1": "WASHING_CMD&CTRL.PHASE_PREWASH.TITLE",
"2": "WASHING_CMD&CTRL.PHASE_WASHING.TITLE",
"3": "WASHING_CMD&CTRL.PHASE_RINSE.TITLE",
"4": "WASHING_CMD&CTRL.PHASE_DRYING.TITLE",
"5": "WASHING_CMD&CTRL.PHASE_READY.TITLE",
"6": "WASHING_CMD&CTRL.PHASE_HOT_RINSE.TITLE",
"0": "ready",
"1": "prewash",
"2": "washing",
"3": "rinse",
"4": "drying",
"5": "ready",
"6": "hot_rinse",
}
TUMBLE_DRYER_DRY_LEVEL = {
"0": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.NO_DRY",
"1": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.IRON_DRY",
"2": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_DRYING.NO_DRY_IRON_TITLE",
"3": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_DRYING.CUPBOARD_DRY_TITLE",
"4": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_DRYING.EXTRA_DRY_TITLE",
"11": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.NO_DRY",
"12": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.IRON_DRY",
"13": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_DRYING.CUPBOARD_DRY_TITLE",
"14": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_DRYING.READY_TO_WEAR_TITLE",
"15": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_DRYING.EXTRA_DRY_TITLE",
"0": "no_dry",
"1": "iron_dry",
"2": "no_dry_iron",
"3": "cupboard_dry",
"4": "extra_dry",
"11": "no_dry",
"12": "iron_dry",
"13": "cupboard_dry",
"14": "ready_to_wear",
"15": "extra_dry",
}
AC_MACH_MODE = {
"0": "PROGRAMS.AC.IOT_AUTO",
"1": "PROGRAMS.AC.IOT_COOL",
"2": "PROGRAMS.AC.IOT_COOL",
"3": "PROGRAMS.AC.IOT_DRY",
"4": "PROGRAMS.AC.IOT_HEAT",
"5": "PROGRAMS.AC.IOT_FAN",
"6": "PROGRAMS.AC.IOT_FAN",
"0": "auto",
"1": "cool",
"2": "cool",
"3": "dry",
"4": "heat",
"5": "fan",
"6": "fan",
}
AC_FAN_MODE = {
"1": "AC.PROGRAM_CARD.WIND_SPEED_HIGH",
"2": "AC.PROGRAM_CARD.WIND_SPEED_MID",
"3": "AC.PROGRAM_CARD.WIND_SPEED_LOW",
"4": "AC.PROGRAM_CARD.WIND_SPEED_AUTO",
"5": "AC.PROGRAM_CARD.WIND_SPEED_AUTO",
"1": "high",
"2": "mid",
"3": "low",
"4": "auto",
"5": "auto",
}
AC_HUMAN_SENSE = {
"0": "AC.PROGRAM_DETAIL.TOUCH_OFF",
"1": "AC.PROGRAM_DETAIL.AVOID_TOUCH",
"2": "AC.PROGRAM_DETAIL.FOLLOW_TOUCH",
"0": "touch_off",
"1": "avoid_touch",
"2": "follow_touch",
"3": "unknown",
}
REF_ZONES = {
"fridge": "REF.ZONES.FRIDGE",
"freezer": "REF.ZONES.FREEZER",
"vtroom1": "REF.ZONES.MY_ZONE_1",
"fridge_freezer": ["REF.ZONES.FRIDGE", " & ", "REF.ZONES.FREEZER"],
}
PROGRAMS_TD = [
"active_dry",
"allergy_care",
"all_in_one",
"antiallergy",
"anti_odours",
"auto_care",
"baby",
"bed_quilt",
"care_30",
"care_45",
"care_59",
"coloured",
"daily_45_min",
"daily_perfect_59_min",
"darks_and_coloured",
"delicates",
"duvet",
"eco",
"ecospeed_cottons",
"ecospeed_delicates",
"ecospeed_mixed",
"extra_hygiene",
"fitness",
"fresh_care",
"genius",
"hqd_baby_care",
"hqd_bath_towel",
"hqd_bed_sheets",
"hqd_bulky",
"hqd_casual",
"hqd_cold_wind_30",
"hqd_cold_wind_timing",
"hqd_cotton",
"hqd_curtain",
"hqd_delicate",
"hqd_diaper",
"hqd_duvet",
"hqd_feather",
"hqd_hot_wind_timing",
"hqd_hygienic",
"hqd_i_refresh",
"hqd_i_refresh_pro",
"hqd_jacket",
"hqd_jeans",
"hqd_luxury",
"hqd_mix",
"hqd_night_dry",
"hqd_outdoor",
"hqd_precious_cure",
"hqd_quick_20",
"hqd_quick_30",
"hqd_quick_dry",
"hqd_quilt",
"hqd_refresh",
"hqd_school_uniform",
"hqd_shirt",
"hqd_shoes",
"hqd_silk",
"hqd_sports",
"hqd_synthetics",
"hqd_timer",
"hqd_towel",
"hqd_underwear",
"hqd_warm_up",
"hqd_wool",
"hqd_working_suit",
"hygiene",
"iot_checkup",
"iot_dry_anti_mites",
"iot_dry_baby",
"iot_dry_backpacks",
"iot_dry_bathrobe",
"iot_dry_bed_linen",
"iot_dry_bed_quilt",
"iot_dry_cotton",
"iot_dry_cuddly_toys",
"iot_dry_curtains",
"iot_dry_dehumidifier",
"iot_dry_delicates",
"iot_dry_delicate_tablecloths",
"iot_dry_denim_jeans",
"iot_dry_down_jacket",
"iot_dry_duvet",
"iot_dry_easy_iron_cotton",
"iot_dry_easy_iron_synthetics",
"iot_dry_gym_fit",
"iot_dry_lingerie",
"iot_dry_mixed",
"iot_dry_playsuits",
"iot_dry_rapid_30",
"iot_dry_rapid_59",
"iot_dry_refresh",
"iot_dry_regenerates_waterproof",
"iot_dry_relax_creases",
"iot_dry_shirts",
"iot_dry_small_load",
"iot_dry_swimsuits_and_bikinis",
"iot_dry_synthetics",
"iot_dry_synthetic_dry",
"iot_dry_tablecloths",
"iot_dry_technical_fabrics",
"iot_dry_warm_embrace",
"iot_dry_wool",
"jeans",
"mix_and_dry",
"pets",
"pre_iron",
"rapid_30",
"rapid_45",
"rapid_59",
"refresh",
"relax_creases",
"saving_30_min",
"shirts",
"shoes",
"small_load",
"soft_care",
"sport_plus",
"super_easy_iron_misti",
"super_easy_iron_xxl",
"super_fast_cottons",
"super_fast_delicates",
"synthetics",
"total_care",
"trainers",
"ultra_care",
"waterproof_revitalize",
"whites",
"wool",
"woolmark",
"xxl_load",
"zoom_59",
]

View File

@ -0,0 +1,122 @@
import logging
import math
from dataclasses import dataclass
from typing import Any
from homeassistant.components.fan import (
FanEntityDescription,
FanEntity,
FanEntityFeature,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import callback
from homeassistant.util.percentage import (
percentage_to_ranged_value,
ranged_value_to_percentage,
)
from pyhon.appliance import HonAppliance
from pyhon.parameter.range import HonParameterRange
from .const import DOMAIN
from .hon import HonEntity
_LOGGER = logging.getLogger(__name__)
@dataclass
class HonFanEntityDescription(FanEntityDescription):
pass
FANS = {
"HO": (
HonFanEntityDescription(
key="settings.windSpeed",
name="Wind Speed",
translation_key="air_extraction",
),
),
}
async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> None:
entities = []
for device in hass.data[DOMAIN][entry.unique_id].appliances:
for description in FANS.get(device.appliance_type, []):
if isinstance(description, HonFanEntityDescription):
if description.key not in device.available_settings or not device.get(
description.key.split(".")[-1]
):
continue
entity = HonFanEntity(hass, entry, device, description)
else:
continue
await entity.coordinator.async_config_entry_first_refresh()
entities.append(entity)
async_add_entities(entities)
class HonFanEntity(HonEntity, FanEntity):
entity_description: HonFanEntityDescription
def __init__(self, hass, entry, device: HonAppliance, description) -> None:
self._attr_supported_features = FanEntityFeature.SET_SPEED
self._wind_speed: HonParameterRange = device.settings.get(description.key)
self._speed_range = (
int(self._wind_speed.values[1]),
int(self._wind_speed.values[-1]),
)
self._command, self._parameter = description.key.split(".")
super().__init__(hass, entry, device, description)
self._handle_coordinator_update(update=False)
@property
def percentage(self) -> int | None:
"""Return the current speed."""
value = int(self._device.get(self._parameter, "0"))
return ranged_value_to_percentage(self._speed_range, value)
@property
def speed_count(self) -> int:
"""Return the number of speeds the fan supports."""
return len(self._wind_speed.values[1:])
async def async_set_percentage(self, percentage: int) -> None:
"""Set the speed percentage of the fan."""
mode = math.ceil(percentage_to_ranged_value(self._speed_range, percentage))
self._device.settings[self.entity_description.key].value = mode
await self._device.commands[self._command].send()
self.async_write_ha_state()
@property
def is_on(self) -> bool | None:
"""Return true if device is on."""
mode = math.ceil(percentage_to_ranged_value(self._speed_range, self.percentage))
return mode > self._wind_speed.min
async def async_turn_on(
self,
percentage: int | None = None,
preset_mode: str | None = None,
**kwargs: Any,
) -> None:
"""Turn the entity on."""
if percentage is None:
percentage = ranged_value_to_percentage(
self._speed_range, int(self._wind_speed.values[1])
)
await self.async_set_percentage(percentage)
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn the entity off."""
self._device.settings[self.entity_description.key].value = 0
await self._device.commands[self._command].send()
self.async_write_ha_state()
@callback
def _handle_coordinator_update(self, update=True) -> None:
self._wind_speed = self._device.settings.get(self.entity_description.key)
self._attr_percentage = self.percentage
if update:
self.async_write_ha_state()

View File

@ -1,12 +1,13 @@
import logging
from datetime import timedelta
from homeassistant.core import callback
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from pyhon.appliance import HonAppliance
from .const import DOMAIN
from .const import DOMAIN, UPDATE_INTERVAL
_LOGGER = logging.getLogger(__name__)
@ -21,13 +22,14 @@ class HonEntity(CoordinatorEntity):
self._hon = hass.data[DOMAIN][entry.unique_id]
self._hass = hass
self._coordinator = coordinator
self._device = device
self._device: HonAppliance = device
if description is not None:
self.entity_description = description
self._attr_unique_id = f"{self._device.unique_id}{description.key}"
else:
self._attr_unique_id = self._device.unique_id
self._handle_coordinator_update(update=False)
@property
def device_info(self):
@ -41,6 +43,11 @@ class HonEntity(CoordinatorEntity):
sw_version=self._device.get("fwVersion", ""),
)
@callback
def _handle_coordinator_update(self, update: bool = True) -> None:
if update:
self.async_write_ha_state()
class HonCoordinator(DataUpdateCoordinator):
def __init__(self, hass, device: HonAppliance):
@ -49,7 +56,7 @@ class HonCoordinator(DataUpdateCoordinator):
hass,
_LOGGER,
name=device.unique_id,
update_interval=timedelta(seconds=30),
update_interval=timedelta(seconds=UPDATE_INTERVAL),
)
self._device = device

View File

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

View File

@ -9,7 +9,7 @@ from homeassistant.components.number import (
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import UnitOfTime, UnitOfTemperature
from homeassistant.core import callback
from homeassistant.helpers.entity import EntityCategory, Entity
from homeassistant.helpers.entity import EntityCategory
from pyhon.parameter.range import HonParameterRange
from .const import DOMAIN
@ -162,6 +162,14 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = {
translation_key="freezer_temp_sel",
),
),
"HO": (
HonNumberEntityDescription(
key="startProgram.lightStatus",
name="Light status",
icon="mdi:lightbulb",
entity_category=EntityCategory.CONFIG,
),
),
}
NUMBERS["WD"] = unique_entities(NUMBERS["WM"], NUMBERS["TD"])
@ -209,14 +217,15 @@ class HonNumberEntity(HonEntity, NumberEntity):
await self.coordinator.async_refresh()
@callback
def _handle_coordinator_update(self):
def _handle_coordinator_update(self, update=True) -> None:
setting = self._device.settings[self.entity_description.key]
if isinstance(setting, HonParameterRange):
self._attr_native_max_value = setting.max
self._attr_native_min_value = setting.min
self._attr_native_step = setting.step
self._attr_native_value = setting.value
self.async_write_ha_state()
if update:
self.async_write_ha_state()
@property
def available(self) -> bool:

View File

@ -2,15 +2,16 @@ from __future__ import annotations
import logging
from dataclasses import dataclass
from typing import Dict, List
from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import UnitOfTemperature, UnitOfTime, REVOLUTIONS_PER_MINUTE
from homeassistant.core import callback
from homeassistant.helpers.entity import EntityCategory, Entity
from homeassistant.helpers.entity import EntityCategory
from pyhon.appliance import HonAppliance
from pyhon.parameter.fixed import HonParameterFixed
from . import const
from .const import DOMAIN
from .hon import HonEntity, unique_entities
@ -19,12 +20,13 @@ _LOGGER = logging.getLogger(__name__)
@dataclass
class HonSelectEntityDescription(SelectEntityDescription):
pass
option_list: Dict[str, str] = None
@dataclass
class HonConfigSelectEntityDescription(SelectEntityDescription):
entity_category: EntityCategory = EntityCategory.CONFIG
option_list: Dict[str, str] = None
SELECTS = {
@ -67,6 +69,7 @@ SELECTS = {
name="Dry level",
icon="mdi:hair-dryer",
translation_key="dry_levels",
option_list=const.TUMBLE_DRYER_DRY_LEVEL,
),
),
"OV": (
@ -115,6 +118,7 @@ SELECTS = {
name="Eco Pilot",
icon="mdi:run",
translation_key="eco_pilot",
option_list=const.AC_HUMAN_SENSE,
),
),
"REF": (
@ -158,38 +162,51 @@ class HonSelectEntity(HonEntity, SelectEntity):
def __init__(self, hass, entry, device: HonAppliance, description) -> None:
super().__init__(hass, entry, device, description)
if not (setting := self._device.settings.get(description.key)):
self._attr_options: list[str] = []
elif not isinstance(setting, HonParameterFixed):
self._attr_options: list[str] = setting.values
else:
self._attr_options: list[str] = [setting.value]
@property
def current_option(self) -> str | None:
value = self._device.settings.get(self.entity_description.key)
if value is None or value.value not in self._attr_options:
if not (setting := self._device.settings.get(self.entity_description.key)):
return None
return value.value
value = setting.value
if self.entity_description.option_list:
value = self.entity_description.option_list.get(str(value), value)
if value not in self._attr_options:
return None
return value
async def async_select_option(self, option: str) -> None:
self._device.settings[self.entity_description.key].value = option
setting = self._device.settings[self.entity_description.key]
if (options := self.entity_description.option_list) is not None:
setting.value = next(
(k for k, v in options.items() if k in setting.values and v == option),
option,
)
else:
setting.value = option
command = self.entity_description.key.split(".")[0]
await self._device.commands[command].send()
await self.coordinator.async_refresh()
@callback
def _handle_coordinator_update(self):
def _handle_coordinator_update(self, update=True) -> None:
setting = self._device.settings.get(self.entity_description.key)
if setting is None:
self._attr_available = False
self._attr_options: list[str] = []
self._attr_native_value = None
self._attr_options: List[str] = []
value = None
else:
self._attr_available = True
self._attr_options: list[str] = setting.values
self._attr_native_value = setting.value
self.async_write_ha_state()
self._attr_options: List[str] = setting.values
value = str(setting.value)
if self.entity_description.option_list is not None:
self._attr_options = [
self.entity_description.option_list.get(k, k)
for k in self._attr_options
]
if value is not None:
value = self.entity_description.option_list.get(value, value)
self._attr_native_value = value
if update:
self.async_write_ha_state()
@property
def available(self) -> bool:
@ -205,7 +222,14 @@ class HonConfigSelectEntity(HonSelectEntity):
entity_description: HonConfigSelectEntityDescription
async def async_select_option(self, option: str) -> None:
self._device.settings[self.entity_description.key].value = option
setting = self._device.settings[self.entity_description.key]
if (options := self.entity_description.option_list) is not None:
setting.value = next(
(k for k, v in options.items() if k in setting.values and v == option),
option,
)
else:
setting.value = option
await self.coordinator.async_refresh()
@property

View File

@ -1,5 +1,6 @@
import logging
from dataclasses import dataclass
from typing import Dict
from homeassistant.components.sensor import (
SensorEntity,
@ -20,7 +21,7 @@ from homeassistant.const import (
)
from homeassistant.core import callback
from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.typing import StateType
from . import const
from .const import DOMAIN
from .hon import HonEntity, unique_entities
@ -31,11 +32,12 @@ _LOGGER = logging.getLogger(__name__)
@dataclass
class HonConfigSensorEntityDescription(SensorEntityDescription):
entity_category: EntityCategory = EntityCategory.CONFIG
option_list: Dict[str, str] = None
@dataclass
class HonSensorEntityDescription(SensorEntityDescription):
pass
option_list: Dict[str, str] = None
SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
@ -46,7 +48,7 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
icon="mdi:washing-machine",
device_class=SensorDeviceClass.ENUM,
translation_key="program_phases_wm",
options=list(const.WASHING_PR_PHASE),
option_list=const.WASHING_PR_PHASE,
),
HonSensorEntityDescription(
key="totalElectricityUsed",
@ -101,7 +103,7 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
icon="mdi:information",
device_class=SensorDeviceClass.ENUM,
translation_key="washing_modes",
options=list(const.MACH_MODE),
option_list=const.MACH_MODE,
),
HonSensorEntityDescription(
key="errors", name="Error", icon="mdi:math-log", translation_key="errors"
@ -153,7 +155,9 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
key="dirtyLevel",
name="Dirt level",
icon="mdi:liquid-spot",
device_class=SensorDeviceClass.ENUM,
translation_key="dirt_level",
option_list=const.DIRTY_LEVEL,
),
HonConfigSensorEntityDescription(
key="startProgram.suggestedLoadW",
@ -171,6 +175,13 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
translation_key="temperature",
),
HonSensorEntityDescription(
key="programName",
name="Program",
icon="mdi:play",
device_class=SensorDeviceClass.ENUM,
translation_key="programs_wm",
),
),
"TD": (
HonSensorEntityDescription(
@ -179,7 +190,7 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
icon="mdi:information",
device_class=SensorDeviceClass.ENUM,
translation_key="washing_modes",
options=list(const.MACH_MODE),
option_list=const.MACH_MODE,
),
HonSensorEntityDescription(
key="errors", name="Error", icon="mdi:math-log", translation_key="errors"
@ -203,10 +214,9 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
HonSensorEntityDescription(
key="programName",
name="Program",
icon="mdi:tumble-dryer",
icon="mdi:play",
device_class=SensorDeviceClass.ENUM,
translation_key="programs_td",
options=const.PROGRAMS_TD,
),
HonSensorEntityDescription(
key="prPhase",
@ -214,7 +224,7 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
icon="mdi:washing-machine",
device_class=SensorDeviceClass.ENUM,
translation_key="program_phases_td",
options=list(const.TUMBLE_DRYER_PR_PHASE),
option_list=const.TUMBLE_DRYER_PR_PHASE,
),
HonSensorEntityDescription(
key="dryLevel",
@ -222,7 +232,7 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
icon="mdi:hair-dryer",
device_class=SensorDeviceClass.ENUM,
translation_key="dry_levels",
options=list(const.TUMBLE_DRYER_DRY_LEVEL),
option_list=const.TUMBLE_DRYER_DRY_LEVEL,
),
HonSensorEntityDescription(
key="tempLevel",
@ -248,14 +258,18 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
HonConfigSensorEntityDescription(
key="startProgram.steamLevel",
name="Steam level",
device_class=SensorDeviceClass.ENUM,
icon="mdi:smoke",
translation_key="steam_level",
option_list=const.STEAM_LEVEL,
),
HonSensorEntityDescription(
key="steamLevel",
name="Steam level",
icon="mdi:smoke",
device_class=SensorDeviceClass.ENUM,
translation_key="steam_level",
option_list=const.STEAM_LEVEL,
),
HonConfigSensorEntityDescription(
key="steamType",
@ -291,6 +305,13 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
icon="mdi:thermometer",
translation_key="target_temperature",
),
HonSensorEntityDescription(
key="programName",
name="Program",
icon="mdi:play",
device_class=SensorDeviceClass.ENUM,
translation_key="programs_ov",
),
),
"IH": (
HonSensorEntityDescription(
@ -318,6 +339,13 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
state_class=SensorStateClass.MEASUREMENT,
translation_key="power",
),
HonSensorEntityDescription(
key="programName",
name="Program",
icon="mdi:play",
device_class=SensorDeviceClass.ENUM,
translation_key="programs_ih",
),
),
"DW": (
HonConfigSensorEntityDescription(
@ -370,7 +398,7 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
icon="mdi:information",
device_class=SensorDeviceClass.ENUM,
translation_key="washing_modes",
options=list(const.MACH_MODE),
option_list=const.MACH_MODE,
),
HonSensorEntityDescription(
key="errors", name="Error", icon="mdi:math-log", translation_key="errors"
@ -389,7 +417,14 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
icon="mdi:washing-machine",
device_class=SensorDeviceClass.ENUM,
translation_key="program_phases_dw",
options=list(const.DISHWASHER_PR_PHASE),
option_list=const.DISHWASHER_PR_PHASE,
),
HonSensorEntityDescription(
key="programName",
name="Program",
icon="mdi:play",
device_class=SensorDeviceClass.ENUM,
translation_key="programs_dw",
),
),
"AC": (
@ -456,6 +491,22 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
translation_key="target_temperature",
),
HonSensorEntityDescription(
key="programName",
name="Program",
icon="mdi:play",
device_class=SensorDeviceClass.ENUM,
translation_key="programs_ac",
),
HonSensorEntityDescription(
key="machMode",
name="Machine Status",
icon="mdi:information",
device_class=SensorDeviceClass.ENUM,
translation_key="mach_modes_ac",
option_list=const.AC_MACH_MODE,
),
),
"REF": (
@ -499,6 +550,139 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
key="errors", name="Error", icon="mdi:math-log", translation_key="errors"
),
),
"HO": (
HonSensorEntityDescription(
key="delayTime",
name="Delay time",
icon="mdi:clock-start",
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfTime.MINUTES,
),
HonSensorEntityDescription(
key="delayTimeStatus",
name="Delay time status",
icon="mdi:clock-start",
),
HonSensorEntityDescription(
key="errors",
name="Errors",
icon="mdi:alert-circle",
),
HonSensorEntityDescription(
key="filterCleaningAlarmStatus",
name="Filter Cleaning Alarm Status",
),
HonSensorEntityDescription(
key="filterCleaningStatus",
name="Filter Cleaning Status",
),
HonSensorEntityDescription(
key="lastWorkTime",
name="Last Work Time",
icon="mdi:clock-start",
),
HonSensorEntityDescription(
key="lightStatus",
name="Light Status",
icon="mdi:lightbulb",
),
HonSensorEntityDescription(
key="machMode",
name="Mach Mode",
),
HonSensorEntityDescription(
key="onOffStatus",
name="On / Off Status",
icon="mdi:lightbulb",
),
HonSensorEntityDescription(
key="quickDelayTimeStatus",
name="Quick Delay Time Status",
),
HonSensorEntityDescription(
key="rgbLightColors",
name="RGB Light Color",
icon="mdi:lightbulb",
),
HonSensorEntityDescription(
key="rgbLightStatus",
name="RGB Light Status",
icon="mdi:lightbulb",
),
),
"WC": (
HonSensorEntityDescription(
key="errors", name="Error", icon="mdi:math-log", translation_key="errors"
),
HonSensorEntityDescription(
key="humidityZ1",
name="Humidity",
icon="mdi:water-percent",
device_class=SensorDeviceClass.HUMIDITY,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
translation_key="humidity",
),
HonSensorEntityDescription(
key="humidityZ2",
name="Humidity 2",
icon="mdi:water-percent",
device_class=SensorDeviceClass.HUMIDITY,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
translation_key="humidity",
),
HonSensorEntityDescription(
key="temp",
name="Temperature",
icon="mdi:thermometer",
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
translation_key="temperature",
),
HonSensorEntityDescription(
key="tempEnv",
name="Room Temperature",
icon="mdi:home-thermometer-outline",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
translation_key="room_temperature",
),
HonSensorEntityDescription(
key="tempSel",
name="Selected Temperature",
icon="mdi:thermometer",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
translation_key="target_temperature",
),
HonSensorEntityDescription(
key="tempSelZ2",
name="Selected Temperature 2",
icon="mdi:thermometer",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
translation_key="target_temperature",
),
HonSensorEntityDescription(
key="tempZ2",
name="Temperature 2",
icon="mdi:thermometer",
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
translation_key="temperature",
),
HonSensorEntityDescription(
key="programName",
name="Program",
icon="mdi:play",
device_class=SensorDeviceClass.ENUM,
translation_key="programs_wc",
),
),
}
SENSORS["WD"] = unique_entities(SENSORS["WM"], SENSORS["TD"])
@ -527,27 +711,40 @@ class HonSensorEntity(HonEntity, SensorEntity):
entity_description: HonSensorEntityDescription
@callback
def _handle_coordinator_update(self):
def _handle_coordinator_update(self, update=True) -> None:
value = self._device.get(self.entity_description.key, "")
if self.entity_description.key == "programName":
self._attr_options = self._device.settings.get(
"startProgram.program"
).values + ["No Program"]
elif self.entity_description.option_list is not None:
self._attr_options = list(self.entity_description.option_list.values())
value = self.entity_description.option_list.get(value, value)
if not value and self.entity_description.state_class is not None:
self._attr_native_value = 0
self._attr_native_value = value
self.async_write_ha_state()
if update:
self.async_write_ha_state()
class HonConfigSensorEntity(HonEntity, SensorEntity):
entity_description: HonConfigSensorEntityDescription
@callback
def _handle_coordinator_update(self):
def _handle_coordinator_update(self, update=True) -> None:
value = self._device.settings.get(self.entity_description.key, None)
if self.entity_description.state_class is not None:
if value and value.value:
self._attr_native_value = (
value = (
float(value.value) if "." in str(value.value) else int(value.value)
)
else:
self._attr_native_value = 0
value = 0
else:
self._attr_native_value = value.value
self.async_write_ha_state()
value = value.value
if self.entity_description.option_list is not None and not value == 0:
self._attr_options = list(self.entity_description.option_list.values())
value = self.entity_description.option_list.get(value, value)
self._attr_native_value = value
if update:
self.async_write_ha_state()

View File

@ -1,5 +1,6 @@
import logging
from dataclasses import dataclass
from datetime import datetime, timedelta
from typing import Any
from homeassistant.components.switch import SwitchEntityDescription, SwitchEntity
@ -321,6 +322,17 @@ SWITCHES: dict[str, tuple[HonSwitchEntityDescription, ...]] = {
translation_key="holiday_mode",
),
),
"WC": (
HonSwitchEntityDescription(
key="sabbathStatus",
name="Sabbath Mode",
icon="mdi:palm-tree",
translation_key="holiday_mode",
),
HonSwitchEntityDescription(
key="lightStatus", name="Light", icon="mdi:lightbulb"
),
),
}
SWITCHES["WD"] = unique_entities(SWITCHES["WD"], SWITCHES["WM"])
@ -394,10 +406,11 @@ class HonSwitchEntity(HonEntity, SwitchEntity):
)
@callback
def _handle_coordinator_update(self):
def _handle_coordinator_update(self, update=True) -> None:
value = self._device.get(self.entity_description.key, "0")
self._attr_state = value == "1"
self.async_write_ha_state()
if update:
self.async_write_ha_state()
class HonControlSwitchEntity(HonEntity, SwitchEntity):
@ -410,9 +423,13 @@ class HonControlSwitchEntity(HonEntity, SwitchEntity):
async def async_turn_on(self, **kwargs: Any) -> None:
await self._device.commands[self.entity_description.turn_on_key].send()
self._device.attributes[self.entity_description.key] = True
self.async_write_ha_state()
async def async_turn_off(self, **kwargs: Any) -> None:
await self._device.commands[self.entity_description.turn_off_key].send()
self._device.attributes[self.entity_description.key] = False
self.async_write_ha_state()
@property
def available(self) -> bool:
@ -423,6 +440,18 @@ class HonControlSwitchEntity(HonEntity, SwitchEntity):
and self._device.get("attributes.lastConnEvent.category") != "DISCONNECTED"
)
@property
def extra_state_attributes(self) -> dict[str, Any]:
"""Return the optional state attributes."""
result = {}
if remaining_time := int(self._device.get("remainingTimeMM", 0)):
delay_time = int(self._device.get("delayTime", 0))
result["start_time"] = datetime.now() + timedelta(minutes=delay_time)
result["end_time"] = datetime.now() + timedelta(
minutes=delay_time + remaining_time
)
return result
class HonConfigSwitchEntity(HonEntity, SwitchEntity):
entity_description: HonConfigSwitchEntityDescription
@ -454,7 +483,8 @@ class HonConfigSwitchEntity(HonEntity, SwitchEntity):
await self.coordinator.async_refresh()
@callback
def _handle_coordinator_update(self):
def _handle_coordinator_update(self, update=True) -> None:
value = self._device.settings.get(self.entity_description.key, "0")
self._attr_state = value == "1"
self.async_write_ha_state()
if update:
self.async_write_ha_state()

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3,206 +3,79 @@
"sensor": {
"washing_modes": {
"state": {
"0": "מוּכָן",
"1": "מוּכָן",
"3": "הַפסָקָה",
"4": "מתוזמן",
"5": "מתוזמן",
"6": "שְׁגִיאָה",
"7": "מוּכָן",
"2": "התוכנית פועלת",
"8": "Test",
"9": "Stopping cycle…"
"ready": "מוּכָן",
"running": "התוכנית פועלת",
"pause": "הַפסָקָה",
"scheduled": "מתוזמן",
"error": "שְׁגִיאָה",
"test": "Test",
"ending": "Stopping cycle…"
}
},
"mach_modes_ac": {
"state": {
"auto": "Auto",
"cool": "Cool",
"dry": "Dry",
"heat": "Heat",
"fan": "Fan"
}
},
"program_phases_wm": {
"state": {
"0": "מוּכָן",
"1": "לִשְׁטוֹף",
"2": "לִשְׁטוֹף",
"3": "Spin",
"4": "לִשְׁטוֹף",
"5": "לִשְׁטוֹף",
"6": "לִשְׁטוֹף",
"7": "יִבּוּשׁ",
"9": "קִיטוֹר",
"10": "מוּכָן",
"11": "Spin",
"12": "Weighing ",
"13": "Weighing ",
"14": "לִשְׁטוֹף",
"15": "לִשְׁטוֹף",
"16": "לִשְׁטוֹף",
"17": "לִשְׁטוֹף",
"18": "לִשְׁטוֹף",
"19": "מתוזמן",
"20": "שמור על טריות",
"24": "Refresh",
"25": "לִשְׁטוֹף",
"26": "Heating",
"27": "לִשְׁטוֹף"
"ready": "מוּכָן",
"spin": "Spin",
"rinse": "לִשְׁטוֹף",
"drying": "יִבּוּשׁ",
"steam": "קִיטוֹר",
"weighting": "Weighing ",
"scheduled": "מתוזמן",
"tumbling": "שמור על טריות",
"refresh": "Refresh",
"heating": "Heating",
"washing": "לִשְׁטוֹף"
},
"name": "שלב"
},
"program_phases_td": {
"state": {
"0": "מוּכָן",
"1": "Drying",
"2": "יִבּוּשׁ",
"3": "Cooldown",
"13": "Cooldown",
"14": "Drying",
"15": "Drying",
"16": "Cooldown",
"18": "Keep Fresh",
"19": "יִבּוּשׁ",
"20": "יִבּוּשׁ",
"11": "מוּכָן",
"17": "unknown"
"ready": "מוּכָן",
"heat_stroke": "Drying",
"drying": "יִבּוּשׁ",
"cooldown": "Cooldown",
"unknown": "unknown",
"tumbling": "Keep Fresh"
},
"name": "שלב"
},
"program_phases_dw": {
"state": {
"0": "מוּכָן",
"1": "Prewash",
"2": "לִשְׁטוֹף",
"3": "לִשְׁטוֹף",
"4": "יִבּוּשׁ",
"5": "מוּכָן",
"6": "Hot rinse"
"ready": "מוּכָן",
"prewash": "Prewash",
"washing": "לִשְׁטוֹף",
"rinse": "לִשְׁטוֹף",
"drying": "יִבּוּשׁ",
"hot_rinse": "Hot rinse"
},
"name": "שלב"
},
"dry_levels": {
"state": {
"0": "ללא ייבוש",
"1": "בַּרזֶל",
"2": "לא לייבש ברזל",
"3": "ארון יבש",
"4": "יבש במיוחד",
"12": "בַּרזֶל",
"13": "ארון יבש",
"14": "Ready to wear",
"15": "יבש במיוחד",
"11": "ללא ייבוש"
"no_dry": "ללא ייבוש",
"iron_dry": "בַּרזֶל",
"no_dry_iron": "לא לייבש ברזל",
"cupboard_dry": "ארון יבש",
"extra_dry": "יבש במיוחד",
"ready_to_wear": "Ready to wear"
},
"name": "רמת ייבוש"
},
"anti_crease": {
"name": "Anticrease"
},
"power": {
"name": "Power level"
},
"remaining_time": {
"name": "זמן שנותר"
},
"temperature": {
"name": "Temperature"
},
"water_efficiency": {
"name": "Water efficiency"
},
"water_saving": {
"name": "Water savings"
},
"duration": {
"name": "מֶשֶׁך"
},
"target_temperature": {
"name": "Target temperature"
},
"spin_speed": {
"name": "סיבוב"
},
"steam_leve": {
"name": "מפלס קיטור"
},
"dirt_level": {
"name": "רמת עפר"
},
"delay_time": {
"name": "Delay Start"
},
"dry_time": {
"name": "זמן ייבוש"
},
"suggested_load": {
"name": "יכולת עומס"
},
"energy_label": {
"name": "חסכון באנרגיה"
},
"det_dust": {
"name": "Powder detergent"
},
"det_liquid": {
"name": "Liquid detergent"
},
"errors": {
"name": "Error"
},
"programs": {
"name": "Current program"
},
"cycles_total": {
"name": "מחזורים Total"
},
"energy_total": {
"name": "Energy Consumption Total"
},
"water_total": {
"name": "Water efficiency Total"
},
"energy_current": {
"name": "Energy Consumption Current"
},
"water_current": {
"name": "Water efficiency Current"
},
"mach_modes_ac": {
"programs_ac": {
"state": {
"0": "Auto",
"1": "Cool",
"2": "Cool",
"3": "Dry",
"4": "Heat",
"5": "Fan",
"6": "Fan"
}
"iot_simple_start": "התחל עכשיו"
},
"name": "Program"
},
"programs_td": {
"state": {
"genius": "Genius",
"hqd_bath_towel": "Bath towel",
"hqd_bulky": "Bulky",
"hqd_cold_wind_30": "Cold wind 30 minutes",
"hqd_cold_wind_timing": "Cold wind",
"hqd_hot_wind_timing": "Hot wind",
"hqd_luxury": "Luxury",
"hqd_night_dry": "Night dry",
"hqd_refresh": "Refresh",
"hqd_timer": "תוזמן",
"hqd_warm_up": "Warm up",
"hqd_working_suit": "Working suit",
"iot_dry_synthetic_dry": "סינתטי יבש"
}
},
"room_temperature": {
"name": "Room temperature"
},
"humidity": {
"name": "Humidity"
},
"freezer_temp": {
"name": "Freezer temperature"
},
"fridge_temp": {
"name": "Fridge temperature"
}
},
"select": {
"programs_dw": {
"state": {
"gentle_wash": "Gentle wash",
@ -258,7 +131,7 @@
"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": "שטיפה פעילה",
"all_in_one_59_steam": "All in One 59 '",
"autocare": "טיפול אוטומטי",
"autoclean": "ניקוי אוטומטי",
"baby_60": "BABY_60",
@ -288,7 +161,7 @@
"iot_active_steam": "קִיטוֹר",
"iot_active_wash_steam": "שטיפה פעילה",
"iot_allergy_care_pro": "Allergy Care Pro",
"iot_all_in_one_59_steam": "שטיפה פעילה",
"iot_all_in_one_59_steam": "All in One 59 '",
"iot_checkup": "בְּדִיקָה",
"iot_delicati_59_steam": "DELICATI_59",
"iot_dry_air_refresh": "רענון אוויר",
@ -445,51 +318,388 @@
},
"name": "Program"
},
"dry_levels": {
"programs_ref": {
"state": {
"0": "ללא ייבוש",
"1": "בַּרזֶל",
"2": "לא לייבש ברזל",
"3": "ארון יבש",
"4": "יבש במיוחד",
"12": "בַּרזֶל",
"13": "ארון יבש",
"14": "Ready to wear",
"15": "יבש במיוחד",
"11": "ללא ייבוש"
"chiller": "Quick cool",
"cold_drinks": "Soft chill",
"fruit_and_veg": "Fruit & Veg",
"keep_fresh": "0° Fresh",
"sea_food": "Ready to cook meal",
"soft_frozen": "Soft freezing",
"tea": "Cold drinks or Beverages"
},
"name": "רמת ייבוש"
"name": "Program"
},
"spin_speed": {
"name": "סיבוב"
},
"temperature": {
"name": "Temperature"
"programs_wc": {
"state": {}
},
"dry_time": {
"name": "זמן ייבוש"
},
"power": {
"name": "Power level"
},
"remaining_time": {
"name": "זמן שנותר"
},
"temperature": {
"name": "Temperature"
},
"water_efficiency": {
"name": "Water efficiency"
},
"water_saving": {
"name": "Water savings"
},
"duration": {
"name": "מֶשֶׁך"
},
"target_temperature": {
"name": "Target temperature"
},
"spin_speed": {
"name": "סיבוב"
},
"steam_leve": {
"name": "מפלס קיטור"
},
"dirt_level": {
"name": "רמת עפר"
},
"delay_time": {
"name": "Delay Start"
},
"suggested_load": {
"name": "יכולת עומס"
},
"energy_label": {
"name": "חסכון באנרגיה"
},
"det_dust": {
"name": "Powder detergent"
},
"det_liquid": {
"name": "Liquid detergent"
},
"errors": {
"name": "Error"
},
"programs": {
"name": "Current program"
},
"room_temperature": {
"name": "Room temperature"
},
"humidity": {
"name": "Humidity"
},
"cycles_total": {
"name": "מחזורים Total"
},
"energy_total": {
"name": "Energy Consumption Total"
},
"water_total": {
"name": "Water efficiency Total"
},
"energy_current": {
"name": "Energy Consumption Current"
},
"water_current": {
"name": "Water efficiency Current"
},
"freezer_temp": {
"name": "Freezer temperature"
},
"fridge_temp": {
"name": "Fridge temperature"
}
},
"select": {
"dry_levels": {
"state": {
"no_dry": "ללא ייבוש",
"iron_dry": "בַּרזֶל",
"no_dry_iron": "לא לייבש ברזל",
"cupboard_dry": "ארון יבש",
"extra_dry": "יבש במיוחד",
"ready_to_wear": "Ready to wear"
},
"name": "רמת ייבוש"
},
"eco_pilot": {
"state": {
"0": "Off",
"1": "Avoid touch",
"2": "Follow"
"touch_off": "Off",
"avoid_touch": "Avoid touch",
"follow_touch": "Follow",
"unknown": "unknown"
},
"name": "Eco pilot"
},
"fan_mode": {
"state": {
"1": "High",
"2": "Medium ",
"3": "Low",
"4": "Auto",
"5": "Auto"
"high": "High",
"mid": "Medium ",
"low": "Low",
"auto": "Auto"
}
},
"ref_zones": {
"state": {
"fridge": "Fridge",
"freezer": "Freezer",
"vtroom1": "My Zone",
"fridge_freezer": "Fridge & Freezer"
},
"name": "Zone"
},
"programs_ac": {
"state": {
"iot_simple_start": "התחל עכשיו"
}
},
"name": "Program"
},
"programs_dw": {
"state": {
"gentle_wash": "Gentle wash",
"iot_checkup": "בְּדִיקָה",
"iot_dreft_quick_cycle": "Dreft Quick",
"iot_fairy_quick_cycle": "Fairy Quick",
"iot_jar_quick_cycle": "Jar Quick",
"iot_yes_quick_cycle": "Yes Quick",
"smart_ai": "Smart AI",
"smart_ai_soil": "Smart AI"
},
"name": "Program"
},
"programs_ih": {
"state": {
"iot_special_grilled_vegetables": "Grilled vegetables"
},
"name": "Program"
},
"programs_ov": {
"state": {
"iot_h20_clean": "h2O clean",
"pizza": "Pizza",
"tailor_bake": "Tailor bake"
},
"name": "Program"
},
"programs_td": {
"state": {
"genius": "Genius",
"hqd_bath_towel": "Bath towel",
"hqd_bulky": "Bulky",
"hqd_cold_wind_30": "Cold wind 30 minutes",
"hqd_cold_wind_timing": "Cold wind",
"hqd_hot_wind_timing": "Hot wind",
"hqd_luxury": "Luxury",
"hqd_night_dry": "Night dry",
"hqd_refresh": "Refresh",
"hqd_timer": "תוזמן",
"hqd_warm_up": "Warm up",
"hqd_working_suit": "Working suit",
"iot_dry_synthetic_dry": "סינתטי יבש"
},
"name": "Program"
},
"programs_wm": {
"state": {
"20_degrees_new_energy_label": "20 מעלות צלזיוס",
"active_steam": "קִיטוֹר",
"active_wash": "שטיפה פעילה",
"active_wash_steam": "שטיפה פעילה",
"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": "All in One 59 '",
"autocare": "טיפול אוטומטי",
"autoclean": "ניקוי אוטומטי",
"baby_60": "BABY_60",
"care_14": "טיפול מהיר 14 '",
"care_30": "טיפול מהיר 30 '",
"care_44": "טיפול מהיר 44 '",
"checkup": "בְּדִיקָה",
"cottons": "כותנה",
"cottons_prewash": "כותנה + כביסה מוקדמת",
"cotton_care_59": "Cotton Care 59 Min",
"delicate_59": "עדין 59 '",
"delicati_59": "DELICATI_59",
"delicati_59_steam": "DELICATI_59",
"drain_spin": "ניקוז + סיבוב",
"easy_iron": "גיהוץ קל",
"eco_40_60_new_energy_label": "אקו 40-60",
"extra_care": "אכפתיות מוגברת",
"fitness": "טיפול בכושר",
"fitness_care": "טיפול בכושר",
"fresh_care": "טיפול טרי",
"fresh_care_steam": "טיפול טרי",
"handwash_wool": "שטיפת ידיים + צמר",
"high_dry": "יבש בחום גבוה",
"hqd_dry_synthetics": "יבש בחום נמוך",
"hygiene_60": "היגיינה 60 מעלות צלזיוס",
"intensive_40": "40°C אינטנסיביים",
"iot_active_steam": "קִיטוֹר",
"iot_active_wash_steam": "שטיפה פעילה",
"iot_allergy_care_pro": "Allergy Care Pro",
"iot_all_in_one_59_steam": "All in One 59 '",
"iot_checkup": "בְּדִיקָה",
"iot_delicati_59_steam": "DELICATI_59",
"iot_dry_air_refresh": "רענון אוויר",
"iot_dry_anti_mites": "נגד קרדית",
"iot_dry_baby": "תִינוֹק",
"iot_dry_backpacks": "תיקי גב",
"iot_dry_bathrobe": "חלוקי רחצה",
"iot_dry_bed_linen": "מצעים",
"iot_dry_cotton_dry": "כותנה יבשה",
"iot_dry_cuddly_toys": "צעצועי חיבוק",
"iot_dry_curtains": "וילונות",
"iot_dry_dehumidifier": "מסיר לחות",
"iot_dry_delicates_antiallergy": "עדין נגד אלרגיה",
"iot_dry_delicate_tablecloths": "מפות עדינות",
"iot_dry_denim_jeans": "ג'ינס",
"iot_dry_easy_iron_cotton": "ברזל קל - כותנה",
"iot_dry_easy_iron_synthetics": "קל ברזל - סינתטיים",
"iot_dry_gym_fit": "כושר כושר - כושר",
"iot_dry_lingerie": "לִבנֵי נָשִׁים",
"iot_dry_mixed_dry": "מעורבב יבש",
"iot_dry_rapid_60_min_delicates": "מהיר 60 '- עדינים",
"iot_dry_shirts": "חולצות",
"iot_dry_swimsuits_and_bikinis": "בגדי ים וביקיני",
"iot_dry_synthetics": "סינתטי יבש",
"iot_dry_synthetic_dry": "סינתטי יבש",
"iot_dry_tablecloths": "מפות שולחן",
"iot_dry_technical_fabrics": "בדים טכניים",
"iot_dry_warm_embrace": "חיבוק חם",
"iot_dry_wool_dry": "צמר יבש",
"iot_easy_iron": "גיהוץ קל",
"iot_fresh_care_steam": "טיפול טרי",
"iot_synthetic_and_coloured_steam": "סינטטי וצבעוני",
"iot_wash_anti_mites": "נגד קרדית",
"iot_wash_anti_odor": "נגד ריח",
"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": "חיטוי לתינוקות",
"iot_wash_backpacks": "תיקי גב",
"iot_wash_bathrobe": "חלוקי רחצה ובדים נקבוביים",
"iot_wash_bed_linen": "מצעים",
"iot_wash_bed_linen_zelig": "מצעים",
"iot_wash_bleaching": "הַלבָּנָה",
"iot_wash_blood_stains": "כתמי דם",
"iot_wash_cashmere": "קשמיר",
"iot_wash_chocolate_stains": "כתמי שוקולד",
"iot_wash_cold_wash": "שטיפה קרה",
"iot_wash_colored": "צבעוני",
"iot_wash_colored_anti_stain": "נגד כתם צבעוני",
"iot_wash_colored_delicate": "צבעוני עדין",
"iot_wash_coloured": "צבעוני",
"iot_wash_cotton": "כותנה",
"iot_wash_cuddly_toys": "צעצועי חיבוק",
"iot_wash_curtains": "וילונות",
"iot_wash_curtains_zelig": "וילונות",
"iot_wash_dark": "אפל",
"iot_wash_darks_and_coloured_44": "חביבים וצבעוניים 44 '",
"iot_wash_darks_and_coloured_59": "חביבים וצבעוני 59 '",
"iot_wash_darks_and_coloured_xl": "חפצים וצבע XL",
"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": "עדינים",
"iot_wash_delicate_antiallergy": "אנטי אלרגיה עדין",
"iot_wash_delicate_antiallergy_zelig": "אנטי אלרגיה עדין",
"iot_wash_delicate_colors": "צבעוני עדין",
"iot_wash_delicate_dark": "כהה עדין",
"iot_wash_delicate_tablecloths": "מפות עדינות",
"iot_wash_delicate_whites": "לבנים עדינים",
"iot_wash_denim_jeans": "ג'ינס",
"iot_wash_diving_suits": "חליפות צלילה",
"iot_wash_diving_suits_zelig": "חליפות צלילה",
"iot_wash_down_jackets": "מעילי פוך",
"iot_wash_down_jackets_zelig": "מעילי פוך",
"iot_wash_fruit_stains": "כתמי פרי",
"iot_wash_gym_fit": "כושר כושר - כושר",
"iot_wash_handwash": "שטיפת ידיים",
"iot_wash_handwash_colored": "שטיפת ידיים בצבע",
"iot_wash_handwash_dark": "שטיפת ידיים כהה",
"iot_wash_lingerie": "לִבנֵי נָשִׁים",
"iot_wash_masks_refresh": "מסכות רענן",
"iot_wash_masks_sanification": "חיטוי מסכות",
"iot_wash_mats": "מחצלות",
"iot_wash_men_s_trousers": "מכנסי גברים",
"iot_wash_mixed": "מעורב",
"iot_wash_mix_and_coloured_44": "לערבב וצבעוני 44 '",
"iot_wash_mix_and_coloured_59": "מיקס וצבעוני 59 '",
"iot_wash_mix_and_coloured_xl": "מערבבים וצבעים XL",
"iot_wash_new_clothes": "בגדים חדשים",
"iot_wash_perfect_white": "לבן מושלם",
"iot_wash_pets": "חיות מחמד",
"iot_wash_pets_steam": "חיות מחמד",
"iot_wash_playsuits": "חליפות משחק",
"iot_wash_rapid_14": "מהיר 14 '",
"iot_wash_rapid_30": "מהיר 30 '",
"iot_wash_rapid_44": "מהיר 44 '",
"iot_wash_rapid_59": "מהיר 59 '",
"iot_wash_refresh_14_min": "רענן 14 דקות",
"iot_wash_resistant_colored": "צבעוני עמיד",
"iot_wash_resistant_dark": "כהה עמיד",
"iot_wash_resistant_whites": "לבנים עמידים",
"iot_wash_rinse": "לִשְׁטוֹף",
"iot_wash_shirts": "חולצות",
"iot_wash_silk": "משי",
"iot_wash_ski_suit": "חליפת סקי",
"iot_wash_ski_suit_zelig": "חליפת סקי",
"iot_wash_spin": "סיבוב",
"iot_wash_sport": "ספּוֹרט",
"iot_wash_stains_remover": "מסיר כתמים",
"iot_wash_swimsuits_and_bikinis": "בגדי ים וביקיני",
"iot_wash_synthetic": "סינתטיים",
"iot_wash_tablecloths": "מפות שולחן",
"iot_wash_technical_fabrics": "בדים טכניים",
"iot_wash_technical_fabrics_zelig": "בדים טכניים",
"iot_wash_technical_jackets": "ז'קטים טכניים",
"iot_wash_technical_jackets_zelig": "ז'קטים טכניים",
"iot_wash_trainers": "מאמנים",
"iot_wash_whites": "לְבָנִים",
"iot_wash_whites_44": "לבנים 44 '",
"iot_wash_whites_59": "לבנים 59 '",
"iot_wash_whites_xl": "לבנים XL",
"iot_wash_wine_stains": "כתמי יין",
"iot_wash_wool": "צֶמֶר",
"jeans": "גִ'ינס",
"low_dry": "יבש בחום נמוך",
"mixed_and_colored_59": "מעורב וצבעוני 59 '",
"night_and_day": "לילה ויום",
"night_wash": "Night Wash",
"perfect_59": "מושלם 59 '",
"perfect_whites_59": "לבן מושלם",
"rapid_wash_and_dry_59_min": "לשטוף ולייבש 59 '",
"resistant_cotton": "כותנה",
"rinse": "לִשְׁטוֹף",
"silent_night": "Night Wash",
"soft_care": "טיפול רך",
"special_49": "מיוחד 49 '",
"sport_39": "ספורט 39 '",
"sport_plus_29": "ספורט פלוס 29 \"",
"steam_39": "קיטור 39 '",
"steam_care_pro": "Steam Care Pro",
"steam_care_pro_cotton": "Steam Care Pro",
"steam_care_pro_delicates": "Steam Care Pro",
"steam_care_pro_synthetic": "Steam Care Pro",
"synthetics": "סינתטיים",
"synthetic_and_coloured": "סינטטי וצבעוני",
"synthetic_and_coloured_steam": "סינטטי וצבעוני",
"tailored_resistant_cotton": "Tailored Resistant Cotton",
"tailored_synthetic_and_coloured": "Tailored Synthetic Colored",
"total_care": "טיפול טוטאלי",
"tumbling": "נופלים",
"wool_and_delicates_49": "Wool/Delicates 49'",
"wool_dry": "צמר יבש",
"wool_soft_care": "Wool & Soft Care"
},
"name": "Program"
},
"programs_ref": {
"state": {
@ -500,19 +710,20 @@
"sea_food": "Ready to cook meal",
"soft_frozen": "Soft freezing",
"tea": "Cold drinks or Beverages"
}
},
"name": "Program"
},
"dry_time": {
"name": "זמן ייבוש"
},
"spin_speed": {
"name": "סיבוב"
},
"temperature": {
"name": "Temperature"
},
"remaining_time": {
"name": "זמן שנותר"
},
"ref_zones": {
"state": {
"fridge": "Fridge",
"freezer": "Freezer",
"vtroom1": "My Zone",
"fridge_freezer": "Fridge & Freezer"
},
"name": "Zone"
}
},
"switch": {
@ -600,18 +811,15 @@
"acqua_plus": {
"name": "Acquaplus"
},
"auto_dose": {
"name": "מינון אוטומטי"
},
"good_night": {
"name": "לילה טוב"
},
"auto_dose_softener": {
"name": "מינון אוטומטי מרכך"
},
"auto_dose_detergent": {
"name": "מינון אוטומטי חומר ניקוי"
},
"good_night": {
"name": "לילה טוב"
},
"auto_set": {
"name": "Auto-Set"
},
@ -644,27 +852,12 @@
"anti_crease": {
"name": "Anticrease"
},
"aqua_plus": {
"acqua_plus": {
"name": "Acquaplus"
},
"spin_speed": {
"name": "סיבוב"
},
"programs_dw": {
"name": "Program"
},
"programs_ih": {
"name": "Program"
},
"programs_ov": {
"name": "Program"
},
"programs_td": {
"name": "Program"
},
"programs_wm": {
"name": "Program"
},
"still_hot": {
"name": "Still hot"
},
@ -695,12 +888,6 @@
"prewash": {
"name": "שטיפה מראש"
},
"acqua_plus": {
"name": "Acquaplus"
},
"auto_dose": {
"name": "מינון אוטומטי"
},
"buzzer": {
"name": "Cycle end chime"
},
@ -726,6 +913,17 @@
"name": "Filter replacement"
}
},
"button": {
"induction_hob": {
"name": "Induction Hob"
},
"start_program": {
"name": "Program Start"
},
"stop_program": {
"name": "Program Stop"
}
},
"number": {
"power_management": {
"name": "Power management"
@ -764,17 +962,6 @@
"name": "Target temperature Fridge"
}
},
"button": {
"induction_hob": {
"name": "Induction Hob"
},
"start_program": {
"name": "Program Start"
},
"stop_program": {
"name": "Program Stop"
}
},
"climate": {
"air_conditioner": {
"name": "Air conditioner"
@ -805,6 +992,32 @@
}
}
}
},
"oven": {
"name": "Oven",
"state_attributes": {
"preset_mode": {
"name": "Programs",
"state": {
"iot_h20_clean": "h2O clean",
"pizza": "Pizza",
"tailor_bake": "Tailor bake"
}
}
}
},
"wine": {
"state_attributes": {
"preset_mode": {
"name": "Wine Cellar",
"state": {}
}
}
}
},
"fan": {
"air_extraction": {
"name": "Air extraction"
}
}
},

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

59
info.md
View File

@ -2,17 +2,19 @@
[![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)](https://github.com/Andre0512/hon/blob/main/LICENSE)
[![GitHub all releases](https://img.shields.io/github/downloads/Andre0512/hon/total?color=blue)](https://tooomm.github.io/github-release-stats/?username=Andre0512&repository=hon)
Support for home appliances of Haier's mobile app hOn.
Support for home appliances of [Haier's mobile app hOn](https://hon-smarthome.com/) based on [pyhOn](https://github.com/Andre0512/pyhon).
## Supported Appliances
- [Washing Machine](https://github.com/Andre0512/hon#washing-machine)
- [Tumble Dryer](https://github.com/Andre0512/hon#tumble-dryer)
- [Washer Dryer](https://github.com/Andre0512/hon#washer-dryer)
- [Oven](https://github.com/Andre0512/hon#oven)
- [Hob](https://github.com/Andre0512/hon#hob)
- [Dish Washer](https://github.com/Andre0512/hon#dish-washer)
- [Air conditioner](https://github.com/Andre0512/hon#air-conditioner) [BETA]
- [Fridge](https://github.com/Andre0512/hon#fridge) [BETA]
- [Air conditioner](https://github.com/Andre0512/hon#air-conditioner)
- [Fridge](https://github.com/Andre0512/hon#fridge)
- [Hob](https://github.com/Andre0512/hon#hob) [BETA]
- [Hood](https://github.com/Andre0512/hon#hood) [BETA]
- [Wine Cellar](https://github.com/Andre0512/hon#wine-cellar) [BETA]
## Configuration
@ -21,6 +23,22 @@ Support for home appliances of Haier's mobile app 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._
## Supported Models
Support has been confirmed for these models, but many more will work. Please add already supported devices [with this form to complete the list](https://forms.gle/bTSD8qFotdZFytbf8).
| | **Haier** | **Hoover** | **Candy** |
|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
| **Washing Machine** | HW90-B14TEAM5 <br/> HW100-B14959U1 | H-WASH 500 <br/> H7W4 48MBC-S | CO4 107T1/2-07 <br/> RO44 1286DWMC4-07 <br/> HW 68AMC/1-80 <br/> HWPD 69AMBC/1-S |
| **Tumble Dryer** | HD80-A3959 | H-DRY 500 <br/> H9A3TCBEXS-S <br/> HLE C10DCE-80 <br/> NDE H10A2TCE-80 <br/> NDE H9A2TSBEXS-S <br/> NDPHY10A2TCBEXSS | BCTDH7A1TE <br/> CSOE C10DE-80 <br/> ROE H9A3TCEX-S |
| **Washer Dryer** | HWD100-B14979 | HWPS4954DAMR-11 | RPW41066BWMR/1-S |
| **Oven** | HWO60SM2F3XH | HSOT3161WG | |
| **Dish Washer** | XIB 3B2SFS-80 <br/> XIB 6B2D3FB | HFB 6B2S3FX | |
| **Air conditioner** | AD105S2SM3FA <br/> AS20HPL1HRA <br/> AS25PBAHRA <br/> AS25S2SF1FA-WH <br/> AS25TADHRA-2 <br/> AS35S2SF2FA-3 <br/> AS35TADHRA-2 <br/> AS35TAMHRA-C | | |
| **Fridge** | HFW7720ENMB | | CCE4T620EWU |
| **Hob** | HA2MTSJ68MC | | CIS633SCTTWIFI |
| **Hood** | HADG6DS46BWIFI | | |
| **Wine Cellar** | HWS247FDU1 | | |
## Supported Languages
Translation of internal names like programs are available for all languages which are official supported by the hOn app:
* 🇨🇳 Chinese
@ -47,39 +65,6 @@ Translation of internal names like programs are available for all languages whic
### Washing Machine
![washing_machine.png](assets/washing_machine.png)
## Supported Models
Support has been confirmed for these models, but many more will work. Please add already supported devices [with this form to complete the list](https://forms.gle/bTSD8qFotdZFytbf8).
- Haier AD105S2SM3FA
- Haier AS25PBAHRA
- Haier AS25TADHRA-2
- Haier AS35TADHRA-2
- Haier EG9012B19SU1JD
- Haier HD80-A3959
- Haier HW90-B14TEAM5
- Haier HW100-B14959U1
- Haier HWD100-B14979
- Haier HWO60SM2F3XH
- Haier XIB 3B2SFS-80
- Haier XIB 6B2D3FB
- Candy BCTDH7A1TE
- Candy CIS633SCTTWIFI
- Candy CSOE C10DE-80
- Candy ROE H9A3TCEX-S
- Candy RPW41066BWMR/1-S
- Hoover H-WASH 500
- Hoover H-DRY 500
- Hoover H7W4 48MBC-S
- Hoover H9A3TCBEXS-S
- Hoover HFB 6B2S3FX
- Hoover HLE C10DCE-80
- Hoover HSOT3161WG
- Hoover HW 68AMC/1-80
- Hoover HWPD 69AMBC/1-S
- Hoover HWPS4954DAMR-11
- Hoover NDE H10A2TCE-80
- Hoover NDE H9A2TSBEXS-S
- Hoover NDPHY10A2TCBEXSS
## 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!

View File

@ -8,226 +8,13 @@ from pathlib import Path
from pyhon import HonAPI
if __name__ == "__main__":
sys.path.insert(0, str(Path(__file__).parent.parent))
from scripts.translation_keys import SENSOR, SELECT, PROGRAMS, NAMES, CLIMATE
from custom_components.hon import const
SENSOR = {
"washing_modes": const.MACH_MODE,
"mach_modes_ac": const.AC_MACH_MODE,
"program_phases_wm": const.WASHING_PR_PHASE,
"program_phases_td": const.TUMBLE_DRYER_PR_PHASE,
"program_phases_dw": const.DISHWASHER_PR_PHASE,
"dry_levels": const.TUMBLE_DRYER_DRY_LEVEL,
}
SELECT = {
"dry_levels": const.TUMBLE_DRYER_DRY_LEVEL,
"eco_pilot": const.AC_HUMAN_SENSE,
"fan_mode": const.AC_FAN_MODE,
"ref_zones": const.REF_ZONES,
}
PROGRAMS = {
"select": {
"programs_ac": "PROGRAMS.AC",
"programs_dw": "PROGRAMS.DW",
"programs_ih": "PROGRAMS.IH",
"programs_ov": "PROGRAMS.OV",
"programs_td": "PROGRAMS.TD",
"programs_wm": "PROGRAMS.WM_WD",
"programs_ref": "PROGRAMS.REF",
},
"sensor": {
"programs_td": "PROGRAMS.TD",
},
}
CLIMATE = {
"fridge": {
"preset_mode": {
"name": "REF_CMD&CTRL.MODE_SELECTION_DRAWER_FRIDGE.FRIDGE_MODE_TITLE",
"state": {
"auto_set": "REF_CMD&CTRL.MODALITIES.ECO",
"super_cool": "REF_CMD&CTRL.MODALITIES.SUPER_COOL",
"holiday": "REF_CMD&CTRL.MODALITIES.BACK_FROM_HOLIDAY",
"no_mode": "REF_CMD&CTRL.MODALITIES.NO_MODE_SELECTED",
},
}
},
"freezer": {
"preset_mode": {
"name": "REF_CMD&CTRL.MODE_SELECTION_DRAWER_FREEZER.FREEZER_MODE_TITLE",
"state": {
"auto_set": "REF_CMD&CTRL.MODALITIES.ECO",
"super_freeze": "REF_CMD&CTRL.MODALITIES.SHOCK_FREEZE",
"no_mode": "REF_CMD&CTRL.MODALITIES.NO_MODE_SELECTED",
},
}
},
}
NAMES = {
"switch": {
"anti_crease": "HDRY_CMD&CTRL.PROGRAM_CYCLE_DETAIL.ANTICREASE_TITLE",
"add_dish": "DW.ADD_DISH",
"eco_express": "DW_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.ECO",
"extra_dry": "DW_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRA_DRY",
"half_load": "DW_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.HALF_LOAD",
"open_door": "DW_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.OPEN_DOOR",
"three_in_one": "DW_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.THREE_IN_ONE",
"preheat": "OV.PROGRAM_DETAIL.PREHEAT",
"dish_washer": "GLOBALS.APPLIANCES_NAME.DW",
"tumble_dryer": "GLOBALS.APPLIANCES_NAME.TD",
"washing_machine": "GLOBALS.APPLIANCES_NAME.WM",
"washer_dryer": "GLOBALS.APPLIANCES_NAME.WD",
"oven": "GLOBALS.APPLIANCES_NAME.OV",
"prewash": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.PREWASH",
"pause": "GENERAL.PAUSE_PROGRAM",
"keep_fresh": "GLOBALS.APPLIANCE_STATUS.TUMBLING",
"delay_time": "HINTS.TIPS_TIME_ENERGY_SAVING.TIPS_USE_AT_NIGHT_TITLE",
"rapid_mode": "AC.PROGRAM_CARD.RAPID",
"eco_mode": "AC.PROGRAM_CARD.ECO_MODE",
"10_degree_heating": "PROGRAMS.AC.IOT_10_HEATING",
"self_clean": "PROGRAMS.AC.IOT_SELF_CLEAN",
"self_clean_56": "PROGRAMS.AC.IOT_SELF_CLEAN_56",
"silent_mode": "AC.PROGRAM_DETAIL.SILENT_MODE",
"mute_mode": "AC.PROGRAM_DETAIL.MUTE_MODE",
"extra_rinse_1": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRARINSE1",
"extra_rinse_2": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRARINSE2",
"extra_rinse_3": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRARINSE3",
"acqua_plus": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.ACQUAPLUS",
"auto_dose_softener": [
"WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.AUTODOSE",
"WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.SOFTENER",
],
"auto_dose_detergent": [
"WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.AUTODOSE",
"WASHING_CMD&CTRL.DASHBOARD_MENU_MORE_SETTINGS_WATER.DETERGENT",
],
"good_night": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.GOODNIGHT",
"auto_set": "REF_CMD&CTRL.MODALITIES.ECO",
"super_cool": "REF_CMD&CTRL.MODALITIES.SUPER_COOL",
"super_freeze": "REF_CMD&CTRL.MODALITIES.SUPER_FREEZE",
"refrigerator": "REF.NAME",
},
"binary_sensor": {
"door_lock": "WASHING_CMD&CTRL.CHECK_UP_RESULTS.DOOR_LOCK",
"extra_rinse_1": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRARINSE1",
"extra_rinse_2": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRARINSE2",
"extra_rinse_3": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRARINSE3",
"good_night": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.GOODNIGHT",
"anti_crease": "HDRY_CMD&CTRL.PROGRAM_CYCLE_DETAIL.ANTICREASE_TITLE",
"acqua_plus": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.ACQUAPLUS",
"spin_speed": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.SPINSPEED",
"still_hot": "IH.COILS_STATUS.STILL_HOT",
"pan_status": "IH.COILS_STATUS.PAN",
"remote_control": "OV.SUPPORT.REMOTE_CONTROL",
"rinse_aid": "DW_CMD&CTRL.MAINTENANCE.CONSUMABLE_LEVELS_ICON_RINSE_AID",
"salt_level": "DW_CMD&CTRL.MAINTENANCE.CONSUMABLE_LEVELS_ICON_SALT",
"door_open": "GLOBALS.APPLIANCE_STATUS.DOOR_OPEN",
"connection": "ENROLLMENT_COMMON.HEADER_NAME.STEP_APPLIANCE_CONNECTION",
"child_lock": "AP.FOOTER_MENU_MORE.SECURITY_LOCK_TITLE",
"on": "GLOBALS.GENERAL.ON",
"prewash": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.PREWASH",
"buzzer": "DW_CMD&CTRL.SETTINGS.END_CYCLE_BUZZER",
"holiday_mode": "REF.DASHBOARD_MENU_MORE_NOTIFICATIONS.HOLIDAY_MODE",
"auto_set": "REF_CMD&CTRL.MODALITIES.ECO",
"super_cool": "REF_CMD&CTRL.MODALITIES.SUPER_COOL",
"super_freeze": "REF_CMD&CTRL.MODALITIES.SUPER_FREEZE",
"freezer_door": ["GLOBALS.APPLIANCE_STATUS.DOOR_OPEN", "REF.ZONES.FREEZER"],
"fridge_door": ["GLOBALS.APPLIANCE_STATUS.DOOR_OPEN", "REF.ZONES.FRIDGE"],
"filter_replacement": "AP.MAINTENANCE.FILTER_REPLACEMENT",
},
"button": {
"induction_hob": "GLOBALS.APPLIANCES_NAME.IH",
"start_program": ["WC.SET_PROGRAM.PROGRAM", "GLOBALS.GENERAL.START_ON"],
"stop_program": ["WC.SET_PROGRAM.PROGRAM", "GLOBALS.GENERAL.STOP"],
},
"select": {
"dry_levels": "WASHING_CMD&CTRL.DRAWER_CYCLE_DRYING.TAB_LEVEL",
"dry_time": "WASHING_CMD&CTRL.DRAWER_CYCLE_DRYING.TAB_TIME",
"spin_speed": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.SPINSPEED",
"temperature": "IH.COMMON.TEMPERATURE",
"programs_dw": "WC.SET_PROGRAM.PROGRAM",
"programs_ih": "WC.SET_PROGRAM.PROGRAM",
"programs_ov": "WC.SET_PROGRAM.PROGRAM",
"programs_td": "WC.SET_PROGRAM.PROGRAM",
"programs_wm": "WC.SET_PROGRAM.PROGRAM",
"eco_pilot": "AC.PROGRAM_DETAIL.ECO_PILOT",
"remaining_time": "ENROLLMENT_COMMON.GENERAL.REMAINING_TIME",
"ref_zones": "IH.COMMON.COIL",
},
"sensor": {
"dry_levels": "WASHING_CMD&CTRL.DRAWER_CYCLE_DRYING.TAB_LEVEL",
"dry_time": "WASHING_CMD&CTRL.DRAWER_CYCLE_DRYING.TAB_TIME",
"power": "OV.RECIPE_DETAIL.POWER_LEVEL",
"remaining_time": "ENROLLMENT_COMMON.GENERAL.REMAINING_TIME",
"temperature": "IH.COMMON.TEMPERATURE",
"water_efficiency": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_RESULT.WATER_EFFICIENCY",
"water_saving": "STATISTICS.SMART_AI_CYCLE.WATER_SAVING",
"duration": "WASHING_CMD&CTRL.DRAWER_PROGRAM_FILTERS.DURATION",
"target_temperature": "IH.COOKING_DETAIL.TEMPERATURE_TARGETING",
"spin_speed": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.SPINSPEED",
"steam_leve": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.STEAM_LEVEL",
"dirt_level": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.DIRTY_LEVEL",
"program_phases_wm": "WASHING_CMD&CTRL.STATISTICS_GRAPHIC_INSTANT_CONSUMPTION.PHASE",
"program_phases_td": "WASHING_CMD&CTRL.STATISTICS_GRAPHIC_INSTANT_CONSUMPTION.PHASE",
"program_phases_dw": "WASHING_CMD&CTRL.STATISTICS_GRAPHIC_INSTANT_CONSUMPTION.PHASE",
"delay_time": "HINTS.TIPS_TIME_ENERGY_SAVING.TIPS_USE_AT_NIGHT_TITLE",
"suggested_load": "WASHING_CMD&CTRL.DRAWER_PROGRAM_FILTERS.LOAD_CAPACITY",
"energy_label": "WASHING_CMD&CTRL.DRAWER_PROGRAM_FILTERS.ENERGY_EFFICIENCY",
"det_dust": "HUBS.WIDGET.STAINS_WIDGET.STAINS.SUGGESTED_DET_DUST",
"det_liquid": "HUBS.WIDGET.STAINS_WIDGET.STAINS.SUGGESTED_DET_LIQUID",
"errors": "ROBOT_CMD&CTRL.PHASE_ERROR.TITLE",
"programs": "OV.TABS.CURRENT_PROGRAM",
"room_temperature": "REF.SMART_DRINK_ASSISTANT.AMBIENT",
"humidity": "AP.TITLES.HUMIDITY",
"cycles_total": [
"WASHING_CMD&CTRL.GENERAL.CYCLES",
"WC.VIRTUAL_WINE_STATS_COUNTRY.TOTAL",
],
"energy_total": [
"MISE.ENERGY_CONSUMPTION.TITLE",
"WC.VIRTUAL_WINE_STATS_COUNTRY.TOTAL",
],
"water_total": [
"WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_RESULT.WATER_EFFICIENCY",
"WC.VIRTUAL_WINE_STATS_COUNTRY.TOTAL",
],
"energy_current": [
"MISE.ENERGY_CONSUMPTION.TITLE",
"CUBE90_GLOBAL.GENERAL.CURRENT",
],
"water_current": [
"WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_RESULT.WATER_EFFICIENCY",
"CUBE90_GLOBAL.GENERAL.CURRENT",
],
"freezer_temp": "REF_CMD&CTRL.TEMPERATURE_DRAWER_FREEZER.FREEZER_TEMPERATURE_TITLE",
"fridge_temp": "REF_CMD&CTRL.TEMPERATURE_DRAWER_FRIDGE.FRIDGE_TEMPERATURE_TITLE",
},
"number": {
"power_management": "HINTS.COOKING_WITH_INDUCTION.POWER_MANAGEMENT",
"temperature": "IH.COMMON.TEMPERATURE",
"delay_time": "HINTS.TIPS_TIME_ENERGY_SAVING.TIPS_USE_AT_NIGHT_TITLE",
"water_hard": "WASHING_CMD&CTRL.DASHBOARD_MENU_MORE_SETTINGS_WATER.TITLE",
"program_duration": "OV.PROGRAM_DETAIL.PROGRAM_DURATION",
"target_temperature": "IH.COOKING_DETAIL.TEMPERATURE_TARGETING",
"rinse_iterations": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL.DRAWER_HEADER_RINSE",
"wash_time": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL.WASHING_TIME",
"dry_time": "WASHING_CMD&CTRL.DRAWER_CYCLE_DRYING.TAB_TIME",
"steam_level": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.STEAM_LEVEL",
"freezer_temp_sel": ["OV.COMMON.GOAL_TEMPERATURE", "REF.ZONES.FREEZER"],
"fridge_temp_sel": ["OV.COMMON.GOAL_TEMPERATURE", "REF.ZONES.FRIDGE"],
},
"climate": {
"air_conditioner": "GLOBALS.APPLIANCES_NAME.AC",
"fridge": "REF.ZONES.FRIDGE",
"freezer": "REF.ZONES.FREEZER",
},
}
async def check_translation_files(translations):
for language in const.LANGUAGES:
@ -332,9 +119,13 @@ def main():
for mode, data in modes.items():
mode_name = load_key(data["name"], original, fallback)
attr.setdefault(mode, {})["name"] = mode_name
for state, key in data["state"].items():
mode_state = load_key(key, original, fallback)
attr[mode].setdefault("state", {})[state] = mode_state
if isinstance(data["state"], dict):
for state, key in data["state"].items():
mode_state = load_key(key, original, fallback)
attr[mode].setdefault("state", {})[state] = mode_state
else:
attr[mode]["state"] = load_keys(data["state"], original)
translate_login(old, original, fallback)
save_json(base_path / f"{language}.json", old)

View File

@ -14,6 +14,7 @@ from custom_components.hon.climate import CLIMATES
from custom_components.hon.number import NUMBERS
from custom_components.hon.select import SELECTS
from custom_components.hon.sensor import SENSORS
from custom_components.hon.fan import FANS
from custom_components.hon.switch import (
SWITCHES,
HonControlSwitchEntityDescription,
@ -48,6 +49,7 @@ entities = {
"sensor": SENSORS,
"switch": SWITCHES,
"climate": CLIMATES,
"fan": FANS,
}
result = {}

339
scripts/translation_keys.py Normal file
View File

@ -0,0 +1,339 @@
WASHING_PR_PHASE = {
"ready": "WASHING_CMD&CTRL.PHASE_READY.TITLE",
"spin": "WASHING_CMD&CTRL.PHASE_SPIN.TITLE",
"rinse": "WASHING_CMD&CTRL.PHASE_RINSE.TITLE",
"drying": "WASHING_CMD&CTRL.PHASE_DRYING.TITLE",
"steam": "WASHING_CMD&CTRL.PHASE_STEAM.TITLE",
"weighting": "WASHING_CMD&CTRL.PHASE_WEIGHTING.TITLE",
"scheduled": "WASHING_CMD&CTRL.PHASE_SCHEDULED.TITLE",
"tumbling": "WASHING_CMD&CTRL.PHASE_TUMBLING.TITLE",
"refresh": "WASHING_CMD&CTRL.PHASE_REFRESH.TITLE",
"heating": "WASHING_CMD&CTRL.PHASE_HEATING.TITLE",
"washing": "WASHING_CMD&CTRL.PHASE_WASHING.TITLE",
}
MACH_MODE = {
"ready": "WASHING_CMD&CTRL.PHASE_READY.TITLE",
"running": "WASHING_CMD&CTRL.PHASE_RUNNING.TITLE",
"pause": "WASHING_CMD&CTRL.PHASE_PAUSE.TITLE",
"scheduled": "WASHING_CMD&CTRL.PHASE_SCHEDULED.TITLE",
"error": "WASHING_CMD&CTRL.PHASE_ERROR.TITLE",
"test": "Test",
"ending": "GLOBALS.APPLIANCE_STATUS.ENDING_PROGRAM",
}
TUMBLE_DRYER_PR_PHASE = {
"ready": "WASHING_CMD&CTRL.PHASE_READY.TITLE",
"heat_stroke": "TD_CMD&CTRL.STATUS_PHASE.PHASE_HEAT_STROKE",
"drying": "WASHING_CMD&CTRL.PHASE_DRYING.TITLE",
"cooldown": "TD_CMD&CTRL.STATUS_PHASE.PHASE_COOLDOWN",
"unknown": "unknown",
"tumbling": "WASHING_CMD&CTRL.PHASE_TUMBLING.DASHBOARD_TITLE",
}
DIRTY_LEVEL = {
"little": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.LITTLE",
"normal": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.NORMAL",
"very": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.VERY",
"unknown": "unknown",
}
STEAM_LEVEL = {
"no_steam": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.NO_STEAM",
"cotton": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_FABRICS.COTTON_TITLE",
"delicate": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_FABRICS.DELICATE_TITLE",
"synthetic": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_FABRICS.SYNTHETIC_TITLE",
}
DISHWASHER_PR_PHASE = {
"ready": "WASHING_CMD&CTRL.PHASE_READY.TITLE",
"prewash": "WASHING_CMD&CTRL.PHASE_PREWASH.TITLE",
"washing": "WASHING_CMD&CTRL.PHASE_WASHING.TITLE",
"rinse": "WASHING_CMD&CTRL.PHASE_RINSE.TITLE",
"drying": "WASHING_CMD&CTRL.PHASE_DRYING.TITLE",
"hot_rinse": "WASHING_CMD&CTRL.PHASE_HOT_RINSE.TITLE",
}
TUMBLE_DRYER_DRY_LEVEL = {
"no_dry": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.NO_DRY",
"iron_dry": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OPTIONS_VALUES_DESCRIPTION.IRON_DRY",
"no_dry_iron": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_DRYING.NO_DRY_IRON_TITLE",
"cupboard_dry": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_DRYING.CUPBOARD_DRY_TITLE",
"extra_dry": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_DRYING.EXTRA_DRY_TITLE",
"ready_to_wear": "WASHING_CMD&CTRL.GUIDED_WASHING_SYMBOLS_DRYING.READY_TO_WEAR_TITLE",
}
AC_MACH_MODE = {
"auto": "PROGRAMS.AC.IOT_AUTO",
"cool": "PROGRAMS.AC.IOT_COOL",
"dry": "PROGRAMS.AC.IOT_DRY",
"heat": "PROGRAMS.AC.IOT_HEAT",
"fan": "PROGRAMS.AC.IOT_FAN",
}
AC_FAN_MODE = {
"high": "AC.PROGRAM_CARD.WIND_SPEED_HIGH",
"mid": "AC.PROGRAM_CARD.WIND_SPEED_MID",
"low": "AC.PROGRAM_CARD.WIND_SPEED_LOW",
"auto": "AC.PROGRAM_CARD.WIND_SPEED_AUTO",
}
AC_HUMAN_SENSE = {
"touch_off": "AC.PROGRAM_DETAIL.TOUCH_OFF",
"avoid_touch": "AC.PROGRAM_DETAIL.AVOID_TOUCH",
"follow_touch": "AC.PROGRAM_DETAIL.FOLLOW_TOUCH",
"unknown": "unknown",
}
REF_ZONES = {
"fridge": "REF.ZONES.FRIDGE",
"freezer": "REF.ZONES.FREEZER",
"vtroom1": "REF.ZONES.MY_ZONE_1",
"fridge_freezer": ["REF.ZONES.FRIDGE", " & ", "REF.ZONES.FREEZER"],
}
SENSOR = {
"washing_modes": MACH_MODE,
"mach_modes_ac": AC_MACH_MODE,
"program_phases_wm": WASHING_PR_PHASE,
"program_phases_td": TUMBLE_DRYER_PR_PHASE,
"program_phases_dw": DISHWASHER_PR_PHASE,
"dry_levels": TUMBLE_DRYER_DRY_LEVEL,
}
SELECT = {
"dry_levels": TUMBLE_DRYER_DRY_LEVEL,
"eco_pilot": AC_HUMAN_SENSE,
"fan_mode": AC_FAN_MODE,
"ref_zones": REF_ZONES,
}
PROGRAMS = {
"select": {
"programs_ac": "PROGRAMS.AC",
"programs_dw": "PROGRAMS.DW",
"programs_ih": "PROGRAMS.IH",
"programs_ov": "PROGRAMS.OV",
"programs_td": "PROGRAMS.TD",
"programs_wm": "PROGRAMS.WM_WD",
"programs_ref": "PROGRAMS.REF",
},
"sensor": {
"programs_ac": "PROGRAMS.AC",
"programs_dw": "PROGRAMS.DW",
"programs_ih": "PROGRAMS.IH",
"programs_ov": "PROGRAMS.OV",
"programs_td": "PROGRAMS.TD",
"programs_wm": "PROGRAMS.WM_WD",
"programs_ref": "PROGRAMS.REF",
"programs_wc": "PROGRAMS.WC",
},
}
CLIMATE = {
"fridge": {
"preset_mode": {
"name": "REF_CMD&CTRL.MODE_SELECTION_DRAWER_FRIDGE.FRIDGE_MODE_TITLE",
"state": {
"auto_set": "REF_CMD&CTRL.MODALITIES.ECO",
"super_cool": "REF_CMD&CTRL.MODALITIES.SUPER_COOL",
"holiday": "REF_CMD&CTRL.MODALITIES.BACK_FROM_HOLIDAY",
"no_mode": "REF_CMD&CTRL.MODALITIES.NO_MODE_SELECTED",
},
}
},
"freezer": {
"preset_mode": {
"name": "REF_CMD&CTRL.MODE_SELECTION_DRAWER_FREEZER.FREEZER_MODE_TITLE",
"state": {
"auto_set": "REF_CMD&CTRL.MODALITIES.ECO",
"super_freeze": "REF_CMD&CTRL.MODALITIES.SHOCK_FREEZE",
"no_mode": "REF_CMD&CTRL.MODALITIES.NO_MODE_SELECTED",
},
}
},
"oven": {
"preset_mode": {
"name": "OV.TABS.PROGRAMS_TITLE",
"state": "PROGRAMS.OV",
}
},
"wine": {
"preset_mode": {
"name": "WC.NAME",
"state": "PROGRAMS.WC",
}
},
}
NAMES = {
"switch": {
"anti_crease": "HDRY_CMD&CTRL.PROGRAM_CYCLE_DETAIL.ANTICREASE_TITLE",
"add_dish": "DW.ADD_DISH",
"eco_express": "DW_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.ECO",
"extra_dry": "DW_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRA_DRY",
"half_load": "DW_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.HALF_LOAD",
"open_door": "DW_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.OPEN_DOOR",
"three_in_one": "DW_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.THREE_IN_ONE",
"preheat": "OV.PROGRAM_DETAIL.PREHEAT",
"dish_washer": "GLOBALS.APPLIANCES_NAME.DW",
"tumble_dryer": "GLOBALS.APPLIANCES_NAME.TD",
"washing_machine": "GLOBALS.APPLIANCES_NAME.WM",
"washer_dryer": "GLOBALS.APPLIANCES_NAME.WD",
"oven": "GLOBALS.APPLIANCES_NAME.OV",
"prewash": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.PREWASH",
"pause": "GENERAL.PAUSE_PROGRAM",
"keep_fresh": "GLOBALS.APPLIANCE_STATUS.TUMBLING",
"delay_time": "HINTS.TIPS_TIME_ENERGY_SAVING.TIPS_USE_AT_NIGHT_TITLE",
"rapid_mode": "AC.PROGRAM_CARD.RAPID",
"eco_mode": "AC.PROGRAM_CARD.ECO_MODE",
"10_degree_heating": "PROGRAMS.AC.IOT_10_HEATING",
"self_clean": "PROGRAMS.AC.IOT_SELF_CLEAN",
"self_clean_56": "PROGRAMS.AC.IOT_SELF_CLEAN_56",
"silent_mode": "AC.PROGRAM_DETAIL.SILENT_MODE",
"mute_mode": "AC.PROGRAM_DETAIL.MUTE_MODE",
"extra_rinse_1": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRARINSE1",
"extra_rinse_2": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRARINSE2",
"extra_rinse_3": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRARINSE3",
"acqua_plus": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.ACQUAPLUS",
"auto_dose_softener": [
"WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.AUTODOSE",
"WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.SOFTENER",
],
"auto_dose_detergent": [
"WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.AUTODOSE",
"WASHING_CMD&CTRL.DASHBOARD_MENU_MORE_SETTINGS_WATER.DETERGENT",
],
"good_night": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.GOODNIGHT",
"auto_set": "REF_CMD&CTRL.MODALITIES.ECO",
"super_cool": "REF_CMD&CTRL.MODALITIES.SUPER_COOL",
"super_freeze": "REF_CMD&CTRL.MODALITIES.SUPER_FREEZE",
"refrigerator": "REF.NAME",
},
"binary_sensor": {
"door_lock": "WASHING_CMD&CTRL.CHECK_UP_RESULTS.DOOR_LOCK",
"extra_rinse_1": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRARINSE1",
"extra_rinse_2": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRARINSE2",
"extra_rinse_3": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.EXTRARINSE3",
"good_night": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.GOODNIGHT",
"anti_crease": "HDRY_CMD&CTRL.PROGRAM_CYCLE_DETAIL.ANTICREASE_TITLE",
"acqua_plus": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.ACQUAPLUS",
"spin_speed": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.SPINSPEED",
"still_hot": "IH.COILS_STATUS.STILL_HOT",
"pan_status": "IH.COILS_STATUS.PAN",
"remote_control": "OV.SUPPORT.REMOTE_CONTROL",
"rinse_aid": "DW_CMD&CTRL.MAINTENANCE.CONSUMABLE_LEVELS_ICON_RINSE_AID",
"salt_level": "DW_CMD&CTRL.MAINTENANCE.CONSUMABLE_LEVELS_ICON_SALT",
"door_open": "GLOBALS.APPLIANCE_STATUS.DOOR_OPEN",
"connection": "ENROLLMENT_COMMON.HEADER_NAME.STEP_APPLIANCE_CONNECTION",
"child_lock": "AP.FOOTER_MENU_MORE.SECURITY_LOCK_TITLE",
"on": "GLOBALS.GENERAL.ON",
"prewash": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_OTHER_OPTIONS.PREWASH",
"buzzer": "DW_CMD&CTRL.SETTINGS.END_CYCLE_BUZZER",
"holiday_mode": "REF.DASHBOARD_MENU_MORE_NOTIFICATIONS.HOLIDAY_MODE",
"auto_set": "REF_CMD&CTRL.MODALITIES.ECO",
"super_cool": "REF_CMD&CTRL.MODALITIES.SUPER_COOL",
"super_freeze": "REF_CMD&CTRL.MODALITIES.SUPER_FREEZE",
"freezer_door": ["GLOBALS.APPLIANCE_STATUS.DOOR_OPEN", "REF.ZONES.FREEZER"],
"fridge_door": ["GLOBALS.APPLIANCE_STATUS.DOOR_OPEN", "REF.ZONES.FRIDGE"],
"filter_replacement": "AP.MAINTENANCE.FILTER_REPLACEMENT",
},
"button": {
"induction_hob": "GLOBALS.APPLIANCES_NAME.IH",
"start_program": ["WC.SET_PROGRAM.PROGRAM", "GLOBALS.GENERAL.START_ON"],
"stop_program": ["WC.SET_PROGRAM.PROGRAM", "GLOBALS.GENERAL.STOP"],
},
"select": {
"dry_levels": "WASHING_CMD&CTRL.DRAWER_CYCLE_DRYING.TAB_LEVEL",
"dry_time": "WASHING_CMD&CTRL.DRAWER_CYCLE_DRYING.TAB_TIME",
"spin_speed": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.SPINSPEED",
"temperature": "IH.COMMON.TEMPERATURE",
"programs_dw": "WC.SET_PROGRAM.PROGRAM",
"programs_ih": "WC.SET_PROGRAM.PROGRAM",
"programs_ov": "WC.SET_PROGRAM.PROGRAM",
"programs_td": "WC.SET_PROGRAM.PROGRAM",
"programs_wm": "WC.SET_PROGRAM.PROGRAM",
"programs_ac": "WC.SET_PROGRAM.PROGRAM",
"programs_ref": "WC.SET_PROGRAM.PROGRAM",
"eco_pilot": "AC.PROGRAM_DETAIL.ECO_PILOT",
"remaining_time": "ENROLLMENT_COMMON.GENERAL.REMAINING_TIME",
"ref_zones": "IH.COMMON.COIL",
},
"sensor": {
"dry_levels": "WASHING_CMD&CTRL.DRAWER_CYCLE_DRYING.TAB_LEVEL",
"dry_time": "WASHING_CMD&CTRL.DRAWER_CYCLE_DRYING.TAB_TIME",
"power": "OV.RECIPE_DETAIL.POWER_LEVEL",
"remaining_time": "ENROLLMENT_COMMON.GENERAL.REMAINING_TIME",
"temperature": "IH.COMMON.TEMPERATURE",
"water_efficiency": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_RESULT.WATER_EFFICIENCY",
"water_saving": "STATISTICS.SMART_AI_CYCLE.WATER_SAVING",
"duration": "WASHING_CMD&CTRL.DRAWER_PROGRAM_FILTERS.DURATION",
"target_temperature": "IH.COOKING_DETAIL.TEMPERATURE_TARGETING",
"spin_speed": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.SPINSPEED",
"steam_leve": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.STEAM_LEVEL",
"dirt_level": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.DIRTY_LEVEL",
"program_phases_wm": "WASHING_CMD&CTRL.STATISTICS_GRAPHIC_INSTANT_CONSUMPTION.PHASE",
"program_phases_td": "WASHING_CMD&CTRL.STATISTICS_GRAPHIC_INSTANT_CONSUMPTION.PHASE",
"program_phases_dw": "WASHING_CMD&CTRL.STATISTICS_GRAPHIC_INSTANT_CONSUMPTION.PHASE",
"delay_time": "HINTS.TIPS_TIME_ENERGY_SAVING.TIPS_USE_AT_NIGHT_TITLE",
"suggested_load": "WASHING_CMD&CTRL.DRAWER_PROGRAM_FILTERS.LOAD_CAPACITY",
"energy_label": "WASHING_CMD&CTRL.DRAWER_PROGRAM_FILTERS.ENERGY_EFFICIENCY",
"det_dust": "HUBS.WIDGET.STAINS_WIDGET.STAINS.SUGGESTED_DET_DUST",
"det_liquid": "HUBS.WIDGET.STAINS_WIDGET.STAINS.SUGGESTED_DET_LIQUID",
"errors": "ROBOT_CMD&CTRL.PHASE_ERROR.TITLE",
"programs": "OV.TABS.CURRENT_PROGRAM",
"room_temperature": "REF.SMART_DRINK_ASSISTANT.AMBIENT",
"humidity": "AP.TITLES.HUMIDITY",
"cycles_total": [
"WASHING_CMD&CTRL.GENERAL.CYCLES",
"WC.VIRTUAL_WINE_STATS_COUNTRY.TOTAL",
],
"energy_total": [
"MISE.ENERGY_CONSUMPTION.TITLE",
"WC.VIRTUAL_WINE_STATS_COUNTRY.TOTAL",
],
"water_total": [
"WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_RESULT.WATER_EFFICIENCY",
"WC.VIRTUAL_WINE_STATS_COUNTRY.TOTAL",
],
"energy_current": [
"MISE.ENERGY_CONSUMPTION.TITLE",
"CUBE90_GLOBAL.GENERAL.CURRENT",
],
"water_current": [
"WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_RESULT.WATER_EFFICIENCY",
"CUBE90_GLOBAL.GENERAL.CURRENT",
],
"freezer_temp": "REF_CMD&CTRL.TEMPERATURE_DRAWER_FREEZER.FREEZER_TEMPERATURE_TITLE",
"fridge_temp": "REF_CMD&CTRL.TEMPERATURE_DRAWER_FRIDGE.FRIDGE_TEMPERATURE_TITLE",
"programs_dw": "WC.SET_PROGRAM.PROGRAM",
"programs_ih": "WC.SET_PROGRAM.PROGRAM",
"programs_ov": "WC.SET_PROGRAM.PROGRAM",
"programs_td": "WC.SET_PROGRAM.PROGRAM",
"programs_wm": "WC.SET_PROGRAM.PROGRAM",
"programs_ac": "WC.SET_PROGRAM.PROGRAM",
"programs_ref": "WC.SET_PROGRAM.PROGRAM",
},
"number": {
"power_management": "HINTS.COOKING_WITH_INDUCTION.POWER_MANAGEMENT",
"temperature": "IH.COMMON.TEMPERATURE",
"delay_time": "HINTS.TIPS_TIME_ENERGY_SAVING.TIPS_USE_AT_NIGHT_TITLE",
"water_hard": "WASHING_CMD&CTRL.DASHBOARD_MENU_MORE_SETTINGS_WATER.TITLE",
"program_duration": "OV.PROGRAM_DETAIL.PROGRAM_DURATION",
"target_temperature": "IH.COOKING_DETAIL.TEMPERATURE_TARGETING",
"rinse_iterations": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL.DRAWER_HEADER_RINSE",
"wash_time": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL.WASHING_TIME",
"dry_time": "WASHING_CMD&CTRL.DRAWER_CYCLE_DRYING.TAB_TIME",
"steam_level": "WASHING_CMD&CTRL.PROGRAM_CYCLE_DETAIL_MAIN_OPTIONS.STEAM_LEVEL",
"freezer_temp_sel": ["OV.COMMON.GOAL_TEMPERATURE", "REF.ZONES.FREEZER"],
"fridge_temp_sel": ["OV.COMMON.GOAL_TEMPERATURE", "REF.ZONES.FRIDGE"],
},
"climate": {
"air_conditioner": "GLOBALS.APPLIANCES_NAME.AC",
"fridge": "REF.ZONES.FRIDGE",
"freezer": "REF.ZONES.FREEZER",
"oven": "GLOBALS.APPLIANCES_NAME.OV",
},
"fan": {"air_extraction": "HO.DASHBOARD.AIR_EXTRACTION_TITLE"},
}