Compare commits
	
		
			16 Commits
		
	
	
		
			v0.9.0-bet
			...
			v0.9.0-bet
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0b345e082b | |||
| 0fec369746 | |||
| 3ed335d356 | |||
| 269a521435 | |||
| 3c747f9602 | |||
| 0cd4db0839 | |||
| e33a609d40 | |||
| 97637ef244 | |||
| 1d83162f7d | |||
| 60ed8b4ec1 | |||
| 6519bef12a | |||
| a25510184e | |||
| e5e351272b | |||
| 4b1f500f90 | |||
| 0d43eeff3d | |||
| 1ea9153c2e | 
							
								
								
									
										13
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							| @ -25,15 +25,26 @@ 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] | ||||
|  - hOn Integration Version [e.g. `0.8.1`, can be found in HACS or device log] | ||||
|  - pyhOn Version [e.g. `0.13.1`, can be found in device log] | ||||
|  | ||||
| **Additional context** | ||||
| Add any other context about the problem here. | ||||
|  | ||||
| **Home Assistant Logs** | ||||
| Check `System` -> `Logs` if you can find any logs related to this integration and post it 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) | ||||
|  | ||||
| **Data Archive** | ||||
| For further analysis, please add your appliance data archive here (if available) | ||||
| Navigate to `Settings` -> `Device & Services` -> `Haier hOn` -> _your device_ and press the _Create Data Archive_ button.  | ||||
| Then open notifications to download the data zip archive. | ||||
| To attach the file: | ||||
| * GitHub Web: Use the "Attach files by dragging & dropping, selecting or pasting them." function | ||||
| * GitHub Mobile: Upload the zip archive as image | ||||
|  | ||||
							
								
								
									
										8
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
								
							| @ -24,3 +24,11 @@ _This button can be found in the diagnostic section of your device or in the ent | ||||
| 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. | ||||
|  | ||||
| **Data Archive** | ||||
| For further analysis, please add your appliance data archive here (if available) | ||||
| Navigate to `Settings` -> `Device & Services` -> `Haier hOn` -> _your device_ and press the _Create Data Archive_ button.  | ||||
| Then open notifications to download the data zip archive. | ||||
| To attach the file: | ||||
| * GitHub Web: Use the "Attach files by dragging & dropping, selecting or pasting them." function | ||||
| * GitHub Mobile: Upload the zip archive as image | ||||
|  | ||||
							
								
								
									
										33
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								README.md
									
									
									
									
									
								
							| @ -39,8 +39,8 @@ _If the integration is not in the list, you need to clear the browser cache._ | ||||
| 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/> CBWO49TWME-S <br/> RO44 1286DWMC4-07 <br/> HW 68AMC/1-80 <br/> HWPD 69AMBC/1-S | | ||||
| |---------------------|---------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------| | ||||
| | **Washing Machine** | HW90-B14TEAM5 <br/> HW100-B14959U1                                                                                                                | H-WASH 500 <br/> H7W4 48MBC-S <br/> HW 410AMBCB/1-80                                                                 | CO4 107T1/2-07 <br/> CBWO49TWME-S <br/> RO44 1286DWMC4-07 <br/> HW 68AMC/1-80 <br/> HWPD 69AMBC/1-S | | ||||
| | **Tumble Dryer**    | HD80-A3959                                                                                                                                        | H-DRY 500 <br/> H9A3TCBEXS-S <br/> HLE C10DCE-80 <br/> NDE H10A2TCE-80 <br/> NDE H9A2TSBEXS-S <br/> NDPHY10A2TCBEXSS | BCTDH7A1TE <br/> CSOE C10DE-80 <br/> ROE H9A3TCEX-S                                                 | | ||||
| | **Washer Dryer**    | HWD100-B14979                                                                                                                                     | HWPS4954DAMR-11                                                                                                      | RPW41066BWMR/1-S                                                                                    | | ||||
| | **Oven**            | HWO60SM2F3XH                                                                                                                                      | HSOT3161WG                                                                                                           |                                                                                                     | | ||||
| @ -51,6 +51,9 @@ Support has been confirmed for these models, but many more will work. Please add | ||||
| | **Hood**            | HADG6DS46BWIFI                                                                                                                                    |                                                                                                                      |                                                                                                     | | ||||
| | **Wine Cellar**     | HWS247FDU1                                                                                                                                        |                                                                                                                      |                                                                                                     | | ||||
|  | ||||
| | Please add your appliances data to our [hon-test-data collection](https://github.com/Andre0512/hon-test-data). <br/>This helps us to develop new features and not to break compatibility in newer versions. | | ||||
| |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ||||
|  | ||||
| ## Supported Languages | ||||
| Translation of internal names like programs are available for all languages which are official supported by the hOn app: | ||||
| * 🇨🇳 Chinese | ||||
| @ -81,11 +84,9 @@ Translation of internal names like programs are available for all languages whic | ||||
| Any kind of contribution is welcome! | ||||
| ### Read out device data | ||||
| If you want to make a request for adding new appliances or additional attributes and don't want to use the command line, here is how you can read out your device data. | ||||
| For every device exists a hidden button which can be used to log all infos of your appliance. | ||||
| 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) | ||||
| For every device exists a button under diagnostics which can be used to log all info of your appliance. | ||||
| 1. Press the button to create a notification | ||||
| 2. Open home assistant notifications and copy the message (Crtl+A, Ctrl+C) | ||||
| ### Add appliances or additional attributes | ||||
| 1. Install [pyhOn](https://github.com/Andre0512/pyhOn) | ||||
|    ```commandline | ||||
| @ -148,12 +149,12 @@ For every device exists a hidden button which can be used to log all infos of yo | ||||
| | Eco Mode |  | `switch` | `ecoMode` | | ||||
| | Eco Pilot | `run` | `select` | `settings.humanSensingStatus` | | ||||
| | Health Mode | `medication-outline` | `switch` | `healthMode` | | ||||
| | Mute | `volume-off` | `switch` | `muteStatus` | | ||||
| | Night Mode | `bed` | `switch` | `silentSleepStatus` | | ||||
| | Rapid Mode | `run-fast` | `switch` | `rapidMode` | | ||||
| | Screen Display | `monitor-small` | `switch` | `screenDisplayStatus` | | ||||
| | Self Cleaning | `air-filter` | `switch` | `selfCleaningStatus` | | ||||
| | Self Cleaning 56 | `air-filter` | `switch` | `selfCleaning56Status` | | ||||
| | Silent Sleep | `bed` | `switch` | `silentSleepStatus` | | ||||
| | Silent Mode | `volume-off` | `switch` | `muteStatus` | | ||||
| | Target Temperature | `thermometer` | `number` | `settings.tempSel` | | ||||
| #### Sensors | ||||
| | Name | Icon | Entity | Key | | ||||
| @ -179,8 +180,7 @@ For every device exists a hidden button which can be used to log all infos of yo | ||||
| | Aroma Time Off | `thermometer` | `number` | `settings.aromaTimeOff` | | ||||
| | Aroma Time On | `thermometer` | `number` | `settings.aromaTimeOn` | | ||||
| | Diffuser Level |  | `select` | `settings.aromaStatus` | | ||||
| | Light status | `lightbulb` | `number` | `settings.lightStatus` | | ||||
| | Lock Status |  | `switch` | `lockStatus` | | ||||
| | Light status |  | `light` | `settings.lightStatus` | | ||||
| | Mode | `run` | `select` | `settings.machMode` | | ||||
| | Pollen Level |  | `number` | `settings.pollenLevel` | | ||||
| | Touch Tone |  | `switch` | `touchToneStatus` | | ||||
| @ -191,15 +191,16 @@ For every device exists a hidden button which can be used to log all infos of yo | ||||
| | CO Level |  | `sensor` | `coLevel` | | ||||
| | Error | `math-log` | `sensor` | `errors` | | ||||
| | Humidity |  | `sensor` | `humidityIndoor` | | ||||
| | Lock Status |  | `lock` | `lockStatus` | | ||||
| | Main Filter Status |  | `sensor` | `mainFilterStatus` | | ||||
| | On | `power-cycle` | `binary_sensor` | `attributes.parameters.onOffStatus` | | ||||
| | PM 10 |  | `sensor` | `pm10ValueIndoor` | | ||||
| | PM 2.5 |  | `sensor` | `pm2p5ValueIndoor` | | ||||
| | Pre Filter Status |  | `sensor` | `preFilterStatus` | | ||||
| | Temperature |  | `sensor` | `temp` | | ||||
| | Total Work Time |  | `sensor` | `totalWorkTime` | | ||||
| | VOC |  | `sensor` | `vocValueIndoor` | | ||||
| | Wind Speed |  | `sensor` | `windSpeed` | | ||||
| | pm10 |  | `sensor` | `pm10ValueIndoor` | | ||||
| | pm2p5 |  | `sensor` | `pm2p5ValueIndoor` | | ||||
|  | ||||
| ### Dish Washer | ||||
| #### Controls | ||||
| @ -257,7 +258,7 @@ For every device exists a hidden button which can be used to log all infos of yo | ||||
| | Filter Cleaning Status |  | `sensor` | `filterCleaningStatus` | | ||||
| | Last Work Time | `clock-start` | `sensor` | `lastWorkTime` | | ||||
| | Light Status | `lightbulb` | `sensor` | `lightStatus` | | ||||
| | Light status | `lightbulb` | `number` | `startProgram.lightStatus` | | ||||
| | Light status |  | `light` | `startProgram.lightStatus` | | ||||
| | Mach Mode |  | `sensor` | `machMode` | | ||||
| | On / Off Status | `lightbulb` | `sensor` | `onOffStatus` | | ||||
| | Quick Delay Time Status |  | `sensor` | `quickDelayTimeStatus` | | ||||
| @ -293,8 +294,8 @@ For every device exists a hidden button which can be used to log all infos of yo | ||||
| #### Controls | ||||
| | Name | Icon | Entity | Key | | ||||
| | --- | --- | --- | --- | | ||||
| | Oven | `toaster-oven` | `switch` | `startProgram` / `stopProgram` | | ||||
| | Oven | `thermometer` | `climate` | `settings.tempSel` | | ||||
| | Oven | `toaster-oven` | `switch` | `startProgram` / `stopProgram` | | ||||
| #### Configs | ||||
| | Name | Icon | Entity | Key | | ||||
| | --- | --- | --- | --- | | ||||
| @ -390,7 +391,7 @@ For every device exists a hidden button which can be used to log all infos of yo | ||||
| #### Controls | ||||
| | Name | Icon | Entity | Key | | ||||
| | --- | --- | --- | --- | | ||||
| | Light | `lightbulb` | `switch` | `lightStatus` | | ||||
| | Light |  | `light` | `settings.lightStatus` | | ||||
| | Sabbath Mode | `palm-tree` | `switch` | `sabbathStatus` | | ||||
| | Wine Cellar | `thermometer` | `climate` | `settings.tempSel` | | ||||
| | Wine Cellar | `thermometer` | `climate` | `settings.tempSelZ2` | | ||||
|  | ||||
| @ -1,18 +1,17 @@ | ||||
| import logging | ||||
| from pathlib import Path | ||||
|  | ||||
| import voluptuous as vol | ||||
| from pyhon import Hon | ||||
|  | ||||
| from homeassistant.config_entries import ConfigEntry | ||||
| from homeassistant.const import CONF_EMAIL, CONF_PASSWORD | ||||
| from homeassistant.helpers import config_validation as cv, aiohttp_client | ||||
| from homeassistant.helpers.typing import HomeAssistantType | ||||
| from pyhon import Hon | ||||
|  | ||||
| from .const import DOMAIN, PLATFORMS | ||||
|  | ||||
| _LOGGER = logging.getLogger(__name__) | ||||
|  | ||||
|  | ||||
| HON_SCHEMA = vol.Schema( | ||||
|     { | ||||
|         vol.Required(CONF_EMAIL): cv.string, | ||||
| @ -29,7 +28,10 @@ CONFIG_SCHEMA = vol.Schema( | ||||
| async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry): | ||||
|     session = aiohttp_client.async_get_clientsession(hass) | ||||
|     hon = await Hon( | ||||
|         entry.data["email"], entry.data["password"], session=session | ||||
|         entry.data["email"], | ||||
|         entry.data["password"], | ||||
|         session=session, | ||||
|         test_data_path=Path(hass.config.config_dir), | ||||
|     ).create() | ||||
|     hass.data.setdefault(DOMAIN, {}) | ||||
|     hass.data[DOMAIN][entry.unique_id] = hon | ||||
|  | ||||
| @ -17,7 +17,7 @@ _LOGGER = logging.getLogger(__name__) | ||||
|  | ||||
| @dataclass | ||||
| class HonBinarySensorEntityDescriptionMixin: | ||||
|     on_value: str = "" | ||||
|     on_value: str | float = "" | ||||
|  | ||||
|  | ||||
| @dataclass | ||||
| @ -41,14 +41,14 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             key="doorLockStatus", | ||||
|             name="Door Lock", | ||||
|             device_class=BinarySensorDeviceClass.LOCK, | ||||
|             on_value="0", | ||||
|             on_value=0, | ||||
|             translation_key="door_lock", | ||||
|         ), | ||||
|         HonBinarySensorEntityDescription( | ||||
|             key="doorStatus", | ||||
|             name="Door", | ||||
|             device_class=BinarySensorDeviceClass.DOOR, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             translation_key="door_open", | ||||
|         ), | ||||
|         HonBinarySensorEntityDescription( | ||||
| @ -82,7 +82,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             key="doorStatus", | ||||
|             name="Door", | ||||
|             device_class=BinarySensorDeviceClass.DOOR, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             translation_key="door_open", | ||||
|         ), | ||||
|         HonBinarySensorEntityDescription( | ||||
| @ -102,7 +102,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             key="attributes.parameters.onOffStatus", | ||||
|             name="On", | ||||
|             device_class=BinarySensorDeviceClass.RUNNING, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             icon="mdi:power-cycle", | ||||
|             translation_key="on", | ||||
|         ), | ||||
| @ -120,7 +120,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             key="attributes.parameters.onOffStatus", | ||||
|             name="On", | ||||
|             device_class=BinarySensorDeviceClass.RUNNING, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             icon="mdi:power-cycle", | ||||
|             translation_key="on", | ||||
|         ), | ||||
| @ -128,13 +128,13 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             key="hotStatus", | ||||
|             name="Hot Status", | ||||
|             device_class=BinarySensorDeviceClass.HEAT, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             translation_key="still_hot", | ||||
|         ), | ||||
|         HonBinarySensorEntityDescription( | ||||
|             key="panStatus", | ||||
|             name="Pan Status", | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             icon="mdi:pot-mix", | ||||
|             translation_key="pan_status", | ||||
|         ), | ||||
| @ -142,7 +142,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             key="hobLockStatus", | ||||
|             name="Hob Lock", | ||||
|             device_class=BinarySensorDeviceClass.LOCK, | ||||
|             on_value="0", | ||||
|             on_value=0, | ||||
|             translation_key="child_lock", | ||||
|         ), | ||||
|     ), | ||||
| @ -151,7 +151,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             key="saltStatus", | ||||
|             name="Salt", | ||||
|             device_class=BinarySensorDeviceClass.PROBLEM, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             icon="mdi:shaker-outline", | ||||
|             translation_key="salt_level", | ||||
|         ), | ||||
| @ -159,7 +159,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             key="rinseAidStatus", | ||||
|             name="Rinse Aid", | ||||
|             device_class=BinarySensorDeviceClass.PROBLEM, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             icon="mdi:spray-bottle", | ||||
|             translation_key="rinse_aid", | ||||
|         ), | ||||
| @ -174,7 +174,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             key="doorStatus", | ||||
|             name="Door", | ||||
|             device_class=BinarySensorDeviceClass.DOOR, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             translation_key="door_open", | ||||
|         ), | ||||
|     ), | ||||
| @ -183,13 +183,13 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             key="filterChangeStatusLocal", | ||||
|             name="Filter Replacement", | ||||
|             device_class=BinarySensorDeviceClass.PROBLEM, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             translation_key="filter_replacement", | ||||
|         ), | ||||
|         HonBinarySensorEntityDescription( | ||||
|             key="ch2oCleaningStatus", | ||||
|             name="Ch2O Cleaning", | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|         ), | ||||
|     ), | ||||
|     "REF": ( | ||||
| @ -198,7 +198,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             name="Super Cool", | ||||
|             icon="mdi:snowflake", | ||||
|             device_class=BinarySensorDeviceClass.RUNNING, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             translation_key="super_cool", | ||||
|         ), | ||||
|         HonBinarySensorEntityDescription( | ||||
| @ -206,7 +206,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             name="Super Freeze", | ||||
|             icon="mdi:snowflake-variant", | ||||
|             device_class=BinarySensorDeviceClass.RUNNING, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             translation_key="super_freeze", | ||||
|         ), | ||||
|         HonBinarySensorEntityDescription( | ||||
| @ -214,7 +214,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             name="Door Status Freezer", | ||||
|             device_class=BinarySensorDeviceClass.DOOR, | ||||
|             icon="mdi:fridge-top", | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             translation_key="freezer_door", | ||||
|         ), | ||||
|         HonBinarySensorEntityDescription( | ||||
| @ -222,7 +222,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             name="Door Status Fridge", | ||||
|             icon="mdi:fridge-bottom", | ||||
|             device_class=BinarySensorDeviceClass.DOOR, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             translation_key="fridge_door", | ||||
|         ), | ||||
|         HonBinarySensorEntityDescription( | ||||
| @ -230,7 +230,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             name="Auto-Set Mode", | ||||
|             icon="mdi:thermometer-auto", | ||||
|             device_class=BinarySensorDeviceClass.RUNNING, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             translation_key="auto_set", | ||||
|         ), | ||||
|         HonBinarySensorEntityDescription( | ||||
| @ -238,7 +238,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|             name="Holiday Mode", | ||||
|             icon="mdi:palm-tree", | ||||
|             device_class=BinarySensorDeviceClass.RUNNING, | ||||
|             on_value="1", | ||||
|             on_value=1, | ||||
|             translation_key="holiday_mode", | ||||
|         ), | ||||
|     ), | ||||
| @ -254,7 +254,6 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = { | ||||
|     ), | ||||
| } | ||||
|  | ||||
|  | ||||
| BINARY_SENSORS["WD"] = unique_entities(BINARY_SENSORS["WM"], BINARY_SENSORS["TD"]) | ||||
|  | ||||
|  | ||||
| @ -262,7 +261,7 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non | ||||
|     entities = [] | ||||
|     for device in hass.data[DOMAIN][entry.unique_id].appliances: | ||||
|         for description in BINARY_SENSORS.get(device.appliance_type, []): | ||||
|             if not device.get(description.key): | ||||
|             if device.get(description.key) is None: | ||||
|                 continue | ||||
|             entity = HonBinarySensorEntity(hass, entry, device, description) | ||||
|             await entity.coordinator.async_config_entry_first_refresh() | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| import logging | ||||
| from pathlib import Path | ||||
|  | ||||
| import pkg_resources | ||||
| from homeassistant.components import persistent_notification | ||||
| from homeassistant.components.button import ButtonEntityDescription, ButtonEntity | ||||
| from homeassistant.config_entries import ConfigEntry | ||||
| @ -61,7 +61,8 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non | ||||
|             entity = HonButtonEntity(hass, entry, device, description) | ||||
|             await entity.coordinator.async_config_entry_first_refresh() | ||||
|             entities.append(entity) | ||||
|         entities.append(HonFeatureRequestButton(hass, entry, device)) | ||||
|         entities.append(HonDeviceInfo(hass, entry, device)) | ||||
|         entities.append(HonDataArchive(hass, entry, device)) | ||||
|         await entities[-1].coordinator.async_config_entry_first_refresh() | ||||
|     async_add_entities(entities) | ||||
|  | ||||
| @ -77,26 +78,52 @@ class HonButtonEntity(HonEntity, ButtonEntity): | ||||
|         """Return True if entity is available.""" | ||||
|         return ( | ||||
|             super().available | ||||
|             and self._device.get("remoteCtrValid", "1") == "1" | ||||
|             and int(self._device.get("remoteCtrValid", "1")) == 1 | ||||
|             and self._device.get("attributes.lastConnEvent.category") != "DISCONNECTED" | ||||
|         ) | ||||
|  | ||||
|  | ||||
| class HonFeatureRequestButton(HonEntity, ButtonEntity): | ||||
| class HonDeviceInfo(HonEntity, ButtonEntity): | ||||
|     def __init__(self, hass, entry, device: HonAppliance) -> None: | ||||
|         super().__init__(hass, entry, device) | ||||
|  | ||||
|         self._attr_unique_id = f"{super().unique_id}_log_device_info" | ||||
|         self._attr_unique_id = f"{super().unique_id}_show_device_info" | ||||
|         self._attr_icon = "mdi:information" | ||||
|         self._attr_name = "Show Device Info" | ||||
|         self._attr_entity_category = EntityCategory.DIAGNOSTIC | ||||
|         if "beta" not in self.coordinator.info.hon_version: | ||||
|             self._attr_entity_registry_enabled_default = False | ||||
|  | ||||
|     async def async_press(self) -> None: | ||||
|         pyhon_version = pkg_resources.get_distribution("pyhon").version | ||||
|         info = f"{self._device.diagnose()}pyhOnVersion: {pyhon_version}" | ||||
|         versions = "versions:\n" | ||||
|         versions += f"  hon: {self.coordinator.info.hon_version}\n" | ||||
|         versions += f"  pyhOn: {self.coordinator.info.pyhon_version}\n" | ||||
|         info = f"{self._device.diagnose}{versions}" | ||||
|         title = f"{self._device.nick_name} Device Info" | ||||
|         persistent_notification.create( | ||||
|             self._hass, f"````\n```\n{info}\n```\n````", title | ||||
|         ) | ||||
|         _LOGGER.info(info.replace(" ", "\u200B ")) | ||||
|  | ||||
|  | ||||
| class HonDataArchive(HonEntity, ButtonEntity): | ||||
|     def __init__(self, hass, entry, device: HonAppliance) -> None: | ||||
|         super().__init__(hass, entry, device) | ||||
|  | ||||
|         self._attr_unique_id = f"{super().unique_id}_create_data_archive" | ||||
|         self._attr_icon = "mdi:archive-arrow-down" | ||||
|         self._attr_name = "Create Data Archive" | ||||
|         self._attr_entity_category = EntityCategory.DIAGNOSTIC | ||||
|         if "beta" not in self.coordinator.info.hon_version: | ||||
|             self._attr_entity_registry_enabled_default = False | ||||
|  | ||||
|     async def async_press(self) -> None: | ||||
|         path = Path(self._hass.config.config_dir) / "www" | ||||
|         data = await self._device.data_archive(path) | ||||
|         title = f"{self._device.nick_name} Data Archive" | ||||
|         text = ( | ||||
|             f'<a href="/local/{data}" target="_blank">{data}</a> <br/><br/> ' | ||||
|             f"Use this data for [GitHub Issues of Haier hOn](https://github.com/Andre0512/hon).<br/>" | ||||
|             f"Or add it to the [hon-test-data collection](https://github.com/Andre0512/hon-test-data)." | ||||
|         ) | ||||
|         persistent_notification.create(self._hass, text, title) | ||||
|  | ||||
| @ -119,13 +119,13 @@ class HonACClimateEntity(HonEntity, ClimateEntity): | ||||
|  | ||||
|         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_hvac_modes.append(HON_HVAC_MODE[int(mode)]) | ||||
|         self._attr_preset_modes = [] | ||||
|         for mode in device.settings["startProgram.program"].values: | ||||
|             self._attr_preset_modes.append(mode) | ||||
|         self._attr_fan_modes = [FAN_OFF] | ||||
|         for mode in device.settings["settings.windSpeed"].values: | ||||
|             self._attr_fan_modes.append(HON_FAN[mode]) | ||||
|             self._attr_fan_modes.append(HON_FAN[int(mode)]) | ||||
|         self._attr_swing_modes = [ | ||||
|             SWING_OFF, | ||||
|             SWING_VERTICAL, | ||||
| @ -151,12 +151,12 @@ class HonACClimateEntity(HonEntity, ClimateEntity): | ||||
|     @property | ||||
|     def target_temperature(self) -> int | None: | ||||
|         """Return the temperature we try to reach.""" | ||||
|         return int(float(self._device.get("tempSel"))) | ||||
|         return self._device.get("tempSel") | ||||
|  | ||||
|     @property | ||||
|     def current_temperature(self) -> float | None: | ||||
|         """Return the current temperature.""" | ||||
|         return float(self._device.get("tempIndoor")) | ||||
|         return self._device.get("tempIndoor") | ||||
|  | ||||
|     async def async_set_temperature(self, **kwargs): | ||||
|         if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None: | ||||
| @ -167,7 +167,7 @@ class HonACClimateEntity(HonEntity, ClimateEntity): | ||||
|  | ||||
|     @property | ||||
|     def hvac_mode(self) -> HVACMode | str | None: | ||||
|         if self._device.get("onOffStatus") == "0": | ||||
|         if self._device.get("onOffStatus") == 0: | ||||
|             return HVACMode.OFF | ||||
|         else: | ||||
|             return HON_HVAC_MODE[self._device.get("machMode")] | ||||
| @ -180,7 +180,7 @@ class HonACClimateEntity(HonEntity, ClimateEntity): | ||||
|         else: | ||||
|             self._device.settings["settings.onOffStatus"].value = "1" | ||||
|             setting = self._device.settings["settings.machMode"] | ||||
|             modes = {HON_HVAC_MODE[number]: number for number in setting.values} | ||||
|             modes = {HON_HVAC_MODE[int(number)]: number for number in setting.values} | ||||
|             setting.value = modes[hvac_mode] | ||||
|             await self._device.commands["settings"].send() | ||||
|         self.async_write_ha_state() | ||||
| @ -210,7 +210,7 @@ class HonACClimateEntity(HonEntity, ClimateEntity): | ||||
|     async def async_set_fan_mode(self, fan_mode): | ||||
|         mode_number = list(HON_FAN.values()).index(fan_mode) | ||||
|         mode = list(HON_FAN.keys())[mode_number] | ||||
|         self._device.settings["settings.windSpeed"].value = mode | ||||
|         self._device.settings["settings.windSpeed"].value = str(mode) | ||||
|         self._attr_fan_mode = fan_mode | ||||
|         await self._device.commands["settings"].send() | ||||
|         self.async_write_ha_state() | ||||
| @ -220,11 +220,11 @@ class HonACClimateEntity(HonEntity, ClimateEntity): | ||||
|         """Return the swing setting.""" | ||||
|         horizontal = self._device.get("windDirectionHorizontal") | ||||
|         vertical = self._device.get("windDirectionVertical") | ||||
|         if horizontal == "7" and vertical == "8": | ||||
|         if horizontal == 7 and vertical == 8: | ||||
|             return SWING_BOTH | ||||
|         elif horizontal == "7": | ||||
|         elif horizontal == 7: | ||||
|             return SWING_HORIZONTAL | ||||
|         elif vertical == "8": | ||||
|         elif vertical == 8: | ||||
|             return SWING_VERTICAL | ||||
|         else: | ||||
|             return SWING_OFF | ||||
| @ -290,13 +290,13 @@ class HonClimateEntity(HonEntity, ClimateEntity): | ||||
|     @property | ||||
|     def target_temperature(self) -> float | None: | ||||
|         """Return the temperature we try to reach.""" | ||||
|         return float(self._device.get(self.entity_description.key)) | ||||
|         return 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 float(self._device.get(temp_key)) | ||||
|         return self._device.get(temp_key) | ||||
|  | ||||
|     async def async_set_temperature(self, **kwargs): | ||||
|         if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None: | ||||
| @ -307,7 +307,7 @@ class HonClimateEntity(HonEntity, ClimateEntity): | ||||
|  | ||||
|     @property | ||||
|     def hvac_mode(self) -> HVACMode | str | None: | ||||
|         if self._device.get("onOffStatus") == "0": | ||||
|         if self._device.get("onOffStatus") == 0: | ||||
|             return HVACMode.OFF | ||||
|         else: | ||||
|             return self.entity_description.mode | ||||
|  | ||||
| @ -18,16 +18,36 @@ PLATFORMS = [ | ||||
|     "binary_sensor", | ||||
|     "climate", | ||||
|     "fan", | ||||
|     "light", | ||||
|     "lock", | ||||
| ] | ||||
|  | ||||
| APPLIANCES = { | ||||
|     "AC": "Air Conditioner", | ||||
|     "AP": "Air Purifier", | ||||
|     "AS": "Air Scanner", | ||||
|     "DW": "Dish Washer", | ||||
|     "HO": "Hood", | ||||
|     "IH": "Induction Hob", | ||||
|     "MW": "Microwave", | ||||
|     "OV": "Oven", | ||||
|     "REF": "Fridge", | ||||
|     "RVC": "Robot Vacuum Cleaner", | ||||
|     "TD": "Tumble Dryer", | ||||
|     "WC": "Wine Cellar", | ||||
|     "WD": "Washer Dryer", | ||||
|     "WH": "Water Heater", | ||||
|     "WM": "Washing Machine", | ||||
| } | ||||
|  | ||||
| HON_HVAC_MODE = { | ||||
|     "0": HVACMode.AUTO, | ||||
|     "1": HVACMode.COOL, | ||||
|     "2": HVACMode.DRY, | ||||
|     "3": HVACMode.DRY, | ||||
|     "4": HVACMode.HEAT, | ||||
|     "5": HVACMode.FAN_ONLY, | ||||
|     "6": HVACMode.FAN_ONLY, | ||||
|     0: HVACMode.AUTO, | ||||
|     1: HVACMode.COOL, | ||||
|     2: HVACMode.DRY, | ||||
|     3: HVACMode.DRY, | ||||
|     4: HVACMode.HEAT, | ||||
|     5: HVACMode.FAN_ONLY, | ||||
|     6: HVACMode.FAN_ONLY, | ||||
| } | ||||
|  | ||||
| HON_HVAC_PROGRAM = { | ||||
| @ -39,11 +59,11 @@ HON_HVAC_PROGRAM = { | ||||
| } | ||||
|  | ||||
| HON_FAN = { | ||||
|     "1": FAN_HIGH, | ||||
|     "2": FAN_MEDIUM, | ||||
|     "3": FAN_LOW, | ||||
|     "4": FAN_AUTO, | ||||
|     "5": FAN_AUTO, | ||||
|     1: FAN_HIGH, | ||||
|     2: FAN_MEDIUM, | ||||
|     3: FAN_LOW, | ||||
|     4: FAN_AUTO, | ||||
|     5: FAN_AUTO, | ||||
| } | ||||
|  | ||||
| # These languages are official supported by hOn | ||||
| @ -70,136 +90,136 @@ LANGUAGES = [ | ||||
| ] | ||||
|  | ||||
| WASHING_PR_PHASE = { | ||||
|     "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", | ||||
|     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": "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 | ||||
|     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": "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": "tumbling", | ||||
|     "19": "drying", | ||||
|     "20": "drying", | ||||
|     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: "tumbling", | ||||
|     19: "drying", | ||||
|     20: "drying", | ||||
| } | ||||
|  | ||||
| DIRTY_LEVEL = { | ||||
|     "0": "unknown", | ||||
|     "1": "little", | ||||
|     "2": "normal", | ||||
|     "3": "very", | ||||
|     0: "unknown", | ||||
|     1: "little", | ||||
|     2: "normal", | ||||
|     3: "very", | ||||
| } | ||||
|  | ||||
| STEAM_LEVEL = { | ||||
|     "0": "no_steam", | ||||
|     "1": "cotton", | ||||
|     "2": "delicate", | ||||
|     "3": "synthetic", | ||||
|     0: "no_steam", | ||||
|     1: "cotton", | ||||
|     2: "delicate", | ||||
|     3: "synthetic", | ||||
| } | ||||
|  | ||||
| DISHWASHER_PR_PHASE = { | ||||
|     "0": "ready", | ||||
|     "1": "prewash", | ||||
|     "2": "washing", | ||||
|     "3": "rinse", | ||||
|     "4": "drying", | ||||
|     "5": "ready", | ||||
|     "6": "hot_rinse", | ||||
|     0: "ready", | ||||
|     1: "prewash", | ||||
|     2: "washing", | ||||
|     3: "rinse", | ||||
|     4: "drying", | ||||
|     5: "ready", | ||||
|     6: "hot_rinse", | ||||
| } | ||||
|  | ||||
| TUMBLE_DRYER_DRY_LEVEL = { | ||||
|     "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", | ||||
|     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": "auto", | ||||
|     "1": "cool", | ||||
|     "2": "cool", | ||||
|     "3": "dry", | ||||
|     "4": "heat", | ||||
|     "5": "fan", | ||||
|     "6": "fan", | ||||
|     0: "auto", | ||||
|     1: "cool", | ||||
|     2: "cool", | ||||
|     3: "dry", | ||||
|     4: "heat", | ||||
|     5: "fan", | ||||
|     6: "fan", | ||||
| } | ||||
|  | ||||
| AC_FAN_MODE = { | ||||
|     "1": "high", | ||||
|     "2": "mid", | ||||
|     "3": "low", | ||||
|     "4": "auto", | ||||
|     "5": "auto", | ||||
|     1: "high", | ||||
|     2: "mid", | ||||
|     3: "low", | ||||
|     4: "auto", | ||||
|     5: "auto", | ||||
| } | ||||
|  | ||||
| AC_HUMAN_SENSE = { | ||||
|     "0": "touch_off", | ||||
|     "1": "avoid_touch", | ||||
|     "2": "follow_touch", | ||||
|     "3": "unknown", | ||||
|     0: "touch_off", | ||||
|     1: "avoid_touch", | ||||
|     2: "follow_touch", | ||||
|     3: "unknown", | ||||
| } | ||||
|  | ||||
| AP_MACH_MODE = { | ||||
|     "0": "standby", | ||||
|     "1": "sleep", | ||||
|     "2": "auto", | ||||
|     "3": "allergens", | ||||
|     "4": "max", | ||||
|     0: "standby", | ||||
|     1: "sleep", | ||||
|     2: "auto", | ||||
|     3: "allergens", | ||||
|     4: "max", | ||||
| } | ||||
|  | ||||
| AP_DIFFUSER_LEVEL = { | ||||
|     "1": "soft", | ||||
|     "2": "mid", | ||||
|     "3": "h_biotics", | ||||
|     "4": "custom", | ||||
|     1: "soft", | ||||
|     2: "mid", | ||||
|     3: "h_biotics", | ||||
|     4: "custom", | ||||
| } | ||||
|  | ||||
| @ -44,8 +44,9 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non | ||||
|     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] | ||||
|                 if ( | ||||
|                     description.key not in device.available_settings | ||||
|                     or device.get(description.key.split(".")[-1]) is None | ||||
|                 ): | ||||
|                     continue | ||||
|                 entity = HonFanEntity(hass, entry, device, description) | ||||
| @ -74,7 +75,7 @@ class HonFanEntity(HonEntity, FanEntity): | ||||
|     @property | ||||
|     def percentage(self) -> int | None: | ||||
|         """Return the current speed.""" | ||||
|         value = int(self._device.get(self._parameter, "0")) | ||||
|         value = self._device.get(self._parameter, 0) | ||||
|         return ranged_value_to_percentage(self._speed_range, value) | ||||
|  | ||||
|     @property | ||||
|  | ||||
| @ -1,6 +1,10 @@ | ||||
| import json | ||||
| import logging | ||||
| from contextlib import suppress | ||||
| from datetime import timedelta | ||||
| from pathlib import Path | ||||
|  | ||||
| import pkg_resources | ||||
| from homeassistant.core import callback | ||||
| from homeassistant.helpers.entity import DeviceInfo | ||||
| from homeassistant.helpers.update_coordinator import CoordinatorEntity | ||||
| @ -36,9 +40,7 @@ class HonEntity(CoordinatorEntity): | ||||
|         return DeviceInfo( | ||||
|             identifiers={(DOMAIN, self._device.unique_id)}, | ||||
|             manufacturer=self._device.get("brand", ""), | ||||
|             name=self._device.nick_name | ||||
|             if self._device.nick_name | ||||
|             else self._device.model_name, | ||||
|             name=self._device.nick_name, | ||||
|             model=self._device.model_name, | ||||
|             sw_version=self._device.get("fwVersion", ""), | ||||
|         ) | ||||
| @ -49,6 +51,31 @@ class HonEntity(CoordinatorEntity): | ||||
|             self.async_write_ha_state() | ||||
|  | ||||
|  | ||||
| class HonInfo: | ||||
|     def __init__(self): | ||||
|         self._manifest = self._get_manifest() | ||||
|         self._hon_version = self._manifest.get("version", "") | ||||
|         self._pyhon_version = pkg_resources.get_distribution("pyhon").version | ||||
|  | ||||
|     @staticmethod | ||||
|     def _get_manifest(): | ||||
|         manifest = Path(__file__).parent / "manifest.json" | ||||
|         with open(manifest, "r", encoding="utf-8") as file: | ||||
|             return json.loads(file.read()) | ||||
|  | ||||
|     @property | ||||
|     def manifest(self): | ||||
|         return self._manifest | ||||
|  | ||||
|     @property | ||||
|     def hon_version(self): | ||||
|         return self._hon_version | ||||
|  | ||||
|     @property | ||||
|     def pyhon_version(self): | ||||
|         return self._pyhon_version | ||||
|  | ||||
|  | ||||
| class HonCoordinator(DataUpdateCoordinator): | ||||
|     def __init__(self, hass, device: HonAppliance): | ||||
|         """Initialize my coordinator.""" | ||||
| @ -59,10 +86,15 @@ class HonCoordinator(DataUpdateCoordinator): | ||||
|             update_interval=timedelta(seconds=UPDATE_INTERVAL), | ||||
|         ) | ||||
|         self._device = device | ||||
|         self._info = HonInfo() | ||||
|  | ||||
|     async def _async_update_data(self): | ||||
|         await self._device.update() | ||||
|  | ||||
|     @property | ||||
|     def info(self) -> HonInfo: | ||||
|         return self._info | ||||
|  | ||||
|  | ||||
| def unique_entities(base_entities, new_entities): | ||||
|     result = list(base_entities) | ||||
| @ -81,3 +113,10 @@ def get_coordinator(hass, appliance): | ||||
|         coordinator = HonCoordinator(hass, appliance) | ||||
|         hass.data[DOMAIN]["coordinators"][appliance.unique_id] = coordinator | ||||
|     return coordinator | ||||
|  | ||||
|  | ||||
| def get_readable(description, value): | ||||
|     if description.option_list is not None: | ||||
|         with suppress(ValueError): | ||||
|             return description.option_list.get(int(value), value) | ||||
|     return value | ||||
|  | ||||
							
								
								
									
										122
									
								
								custom_components/hon/light.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								custom_components/hon/light.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,122 @@ | ||||
| import logging | ||||
| from typing import Any | ||||
|  | ||||
| from homeassistant.components.light import ( | ||||
|     LightEntityDescription, | ||||
|     LightEntity, | ||||
|     ColorMode, | ||||
|     ATTR_BRIGHTNESS, | ||||
| ) | ||||
| from homeassistant.config_entries import ConfigEntry | ||||
| from homeassistant.core import callback | ||||
| from pyhon.appliance import HonAppliance | ||||
| from pyhon.parameter.range import HonParameterRange | ||||
|  | ||||
| from .const import DOMAIN | ||||
| from .hon import HonEntity | ||||
|  | ||||
| _LOGGER = logging.getLogger(__name__) | ||||
|  | ||||
|  | ||||
| LIGHTS = { | ||||
|     "WC": ( | ||||
|         LightEntityDescription( | ||||
|             key="settings.lightStatus", | ||||
|             name="Light", | ||||
|             translation_key="light", | ||||
|         ), | ||||
|     ), | ||||
|     "HO": ( | ||||
|         LightEntityDescription( | ||||
|             key="startProgram.lightStatus", | ||||
|             name="Light status", | ||||
|             translation_key="light", | ||||
|         ), | ||||
|     ), | ||||
|     "AP": ( | ||||
|         LightEntityDescription( | ||||
|             key="settings.lightStatus", | ||||
|             name="Light status", | ||||
|             translation_key="light", | ||||
|         ), | ||||
|     ), | ||||
| } | ||||
|  | ||||
|  | ||||
| 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 LIGHTS.get(device.appliance_type, []): | ||||
|             if ( | ||||
|                 description.key not in device.available_settings | ||||
|                 or device.get(description.key.split(".")[-1]) is None | ||||
|             ): | ||||
|                 continue | ||||
|             entity = HonLightEntity(hass, entry, device, description) | ||||
|             await entity.coordinator.async_config_entry_first_refresh() | ||||
|             entities.append(entity) | ||||
|     async_add_entities(entities) | ||||
|  | ||||
|  | ||||
| class HonLightEntity(HonEntity, LightEntity): | ||||
|     entity_description: LightEntityDescription | ||||
|  | ||||
|     def __init__(self, hass, entry, device: HonAppliance, description) -> None: | ||||
|         light: HonParameterRange = device.settings.get(description.key) | ||||
|         self._light_range = (light.min, light.max) | ||||
|         self._attr_supported_color_modes: set[ColorMode] = set() | ||||
|         if len(light.values) == 2: | ||||
|             self._attr_supported_color_modes.add(ColorMode.ONOFF) | ||||
|         else: | ||||
|             self._attr_supported_color_modes.add(ColorMode.BRIGHTNESS) | ||||
|         self._command, self._parameter = description.key.split(".") | ||||
|         super().__init__(hass, entry, device, description) | ||||
|         self._handle_coordinator_update(update=False) | ||||
|  | ||||
|     @property | ||||
|     def is_on(self) -> bool: | ||||
|         """Return true if light is on.""" | ||||
|         light = self._device.settings.get(self.entity_description.key) | ||||
|         return light.value != light.min | ||||
|  | ||||
|     async def async_turn_on(self, **kwargs: Any) -> None: | ||||
|         """Turn on or control the light.""" | ||||
|         light: HonParameterRange = self._device.settings.get( | ||||
|             self.entity_description.key | ||||
|         ) | ||||
|         if ColorMode.BRIGHTNESS in self._attr_supported_color_modes: | ||||
|             percent = int(100 / 255 * kwargs.get(ATTR_BRIGHTNESS, 128)) | ||||
|             light.value = round(light.max / 100 * percent) | ||||
|             if light.value == light.min: | ||||
|                 self._attr_is_on = False | ||||
|             self._attr_brightness = self.brightness | ||||
|         else: | ||||
|             light.value = light.max | ||||
|         await self._device.commands[self._command].send() | ||||
|         self.async_write_ha_state() | ||||
|  | ||||
|     async def async_turn_off(self, **kwargs: Any) -> None: | ||||
|         """Instruct the light to turn off.""" | ||||
|         light: HonParameterRange = self._device.settings.get( | ||||
|             self.entity_description.key | ||||
|         ) | ||||
|         light.value = light.min | ||||
|         await self._device.commands[self._command].send() | ||||
|         self.async_write_ha_state() | ||||
|  | ||||
|     @property | ||||
|     def brightness(self) -> int | None: | ||||
|         """Return the brightness of the light.""" | ||||
|         light: HonParameterRange = self._device.settings.get( | ||||
|             self.entity_description.key | ||||
|         ) | ||||
|         if light.value == light.min: | ||||
|             return None | ||||
|         return int(255 / light.max * light.value) | ||||
|  | ||||
|     @callback | ||||
|     def _handle_coordinator_update(self, update=True) -> None: | ||||
|         self._attr_is_on = self.is_on | ||||
|         self._attr_brightness = self.brightness | ||||
|         if update: | ||||
|             self.async_write_ha_state() | ||||
							
								
								
									
										85
									
								
								custom_components/hon/lock.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								custom_components/hon/lock.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,85 @@ | ||||
| import logging | ||||
| from typing import Any | ||||
|  | ||||
| from homeassistant.components.lock import LockEntity, LockEntityDescription | ||||
| from homeassistant.config_entries import ConfigEntry | ||||
| from homeassistant.core import callback | ||||
| from pyhon.parameter.base import HonParameter | ||||
| from pyhon.parameter.range import HonParameterRange | ||||
|  | ||||
| from .const import DOMAIN | ||||
| from .hon import HonEntity | ||||
|  | ||||
| _LOGGER = logging.getLogger(__name__) | ||||
|  | ||||
| LOCKS: dict[str, tuple[LockEntityDescription, ...]] = { | ||||
|     "AP": ( | ||||
|         LockEntityDescription( | ||||
|             key="lockStatus", | ||||
|             name="Lock Status", | ||||
|             translation_key="mode", | ||||
|         ), | ||||
|     ), | ||||
| } | ||||
|  | ||||
|  | ||||
| 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 LOCKS.get(device.appliance_type, []): | ||||
|             if ( | ||||
|                 f"settings.{description.key}" not in device.available_settings | ||||
|                 or device.get(description.key) is None | ||||
|             ): | ||||
|                 continue | ||||
|             entity = HonLockEntity(hass, entry, device, description) | ||||
|             await entity.coordinator.async_config_entry_first_refresh() | ||||
|             entities.append(entity) | ||||
|  | ||||
|     async_add_entities(entities) | ||||
|  | ||||
|  | ||||
| class HonLockEntity(HonEntity, LockEntity): | ||||
|     entity_description: LockEntityDescription | ||||
|  | ||||
|     @property | ||||
|     def is_locked(self) -> bool | None: | ||||
|         """Return a boolean for the state of the lock.""" | ||||
|         """Return True if entity is on.""" | ||||
|         return self._device.get(self.entity_description.key, 0) == 1 | ||||
|  | ||||
|     async def async_lock(self, **kwargs: Any) -> None: | ||||
|         """Lock method.""" | ||||
|         setting = self._device.settings[f"settings.{self.entity_description.key}"] | ||||
|         if type(setting) == HonParameter: | ||||
|             return | ||||
|         setting.value = setting.max if isinstance(setting, HonParameterRange) else 1 | ||||
|         self.async_write_ha_state() | ||||
|         await self._device.commands["settings"].send() | ||||
|         await self.coordinator.async_refresh() | ||||
|  | ||||
|     async def async_unlock(self, **kwargs: Any) -> None: | ||||
|         """Unlock method.""" | ||||
|         setting = self._device.settings[f"settings.{self.entity_description.key}"] | ||||
|         if type(setting) == HonParameter: | ||||
|             return | ||||
|         setting.value = setting.min if isinstance(setting, HonParameterRange) else 0 | ||||
|         self.async_write_ha_state() | ||||
|         await self._device.commands["settings"].send() | ||||
|         await self.coordinator.async_refresh() | ||||
|  | ||||
|     @property | ||||
|     def available(self) -> bool: | ||||
|         """Return True if entity is available.""" | ||||
|         return ( | ||||
|             super().available | ||||
|             and int(self._device.get("remoteCtrValid", 1)) == 1 | ||||
|             and self._device.get("attributes.lastConnEvent.category") != "DISCONNECTED" | ||||
|         ) | ||||
|  | ||||
|     @callback | ||||
|     def _handle_coordinator_update(self, update=True) -> None: | ||||
|         value = self._device.get(self.entity_description.key, 0) | ||||
|         self._attr_is_locked = self.is_locked | ||||
|         if update: | ||||
|             self.async_write_ha_state() | ||||
| @ -9,7 +9,7 @@ | ||||
|   "iot_class": "cloud_polling", | ||||
|   "issue_tracker": "https://github.com/Andre0512/hon/issues", | ||||
|   "requirements": [ | ||||
|     "pyhOn==0.13.1" | ||||
|     "pyhOn==0.14.7" | ||||
|   ], | ||||
|   "version": "0.9.0-beta.4" | ||||
|   "version": "0.9.0-beta.8" | ||||
| } | ||||
|  | ||||
| @ -162,13 +162,6 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = { | ||||
|             translation_key="freezer_temp_sel", | ||||
|         ), | ||||
|     ), | ||||
|     "HO": ( | ||||
|         HonNumberEntityDescription( | ||||
|             key="startProgram.lightStatus", | ||||
|             name="Light status", | ||||
|             icon="mdi:lightbulb", | ||||
|         ), | ||||
|     ), | ||||
|     "AP": ( | ||||
|         HonNumberEntityDescription( | ||||
|             key="settings.aromaTimeOn", | ||||
| @ -182,14 +175,10 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = { | ||||
|             icon="mdi:thermometer", | ||||
|             native_unit_of_measurement=UnitOfTime.SECONDS, | ||||
|         ), | ||||
|         HonNumberEntityDescription( | ||||
|             key="settings.lightStatus", | ||||
|             name="Light status", | ||||
|             icon="mdi:lightbulb", | ||||
|         ), | ||||
|         HonNumberEntityDescription( | ||||
|             key="settings.pollenLevel", | ||||
|             name="Pollen Level", | ||||
|             translation_key="pollen_level", | ||||
|         ), | ||||
|     ), | ||||
| } | ||||
| @ -256,7 +245,7 @@ class HonNumberEntity(HonEntity, NumberEntity): | ||||
|         """Return True if entity is available.""" | ||||
|         return ( | ||||
|             super().available | ||||
|             and self._device.get("remoteCtrValid", "1") == "1" | ||||
|             and int(self._device.get("remoteCtrValid", 1)) == 1 | ||||
|             and self._device.get("attributes.lastConnEvent.category") != "DISCONNECTED" | ||||
|         ) | ||||
|  | ||||
| @ -264,6 +253,10 @@ class HonNumberEntity(HonEntity, NumberEntity): | ||||
| class HonConfigNumberEntity(HonNumberEntity): | ||||
|     entity_description: HonConfigNumberEntityDescription | ||||
|  | ||||
|     @property | ||||
|     def native_value(self) -> float | None: | ||||
|         return self._device.settings[self.entity_description.key].value | ||||
|  | ||||
|     async def async_set_native_value(self, value: str) -> None: | ||||
|         setting = self._device.settings[self.entity_description.key] | ||||
|         if isinstance(setting, HonParameterRange): | ||||
|  | ||||
| @ -12,20 +12,20 @@ from homeassistant.helpers.entity import EntityCategory | ||||
|  | ||||
| from . import const | ||||
| from .const import DOMAIN | ||||
| from .hon import HonEntity, unique_entities | ||||
| from .hon import HonEntity, unique_entities, get_readable | ||||
|  | ||||
| _LOGGER = logging.getLogger(__name__) | ||||
|  | ||||
|  | ||||
| @dataclass | ||||
| class HonSelectEntityDescription(SelectEntityDescription): | ||||
|     option_list: Dict[str, str] = None | ||||
|     option_list: Dict[int, str] = None | ||||
|  | ||||
|  | ||||
| @dataclass | ||||
| class HonConfigSelectEntityDescription(SelectEntityDescription): | ||||
|     entity_category: EntityCategory = EntityCategory.CONFIG | ||||
|     option_list: Dict[str, str] = None | ||||
|     option_list: Dict[int, str] = None | ||||
|  | ||||
|  | ||||
| SELECTS = { | ||||
| @ -138,12 +138,14 @@ SELECTS = { | ||||
|             key="settings.aromaStatus", | ||||
|             name="Diffuser Level", | ||||
|             option_list=const.AP_DIFFUSER_LEVEL, | ||||
|             translation_key="diffuser", | ||||
|         ), | ||||
|         HonSelectEntityDescription( | ||||
|             key="settings.machMode", | ||||
|             name="Mode", | ||||
|             icon="mdi:run", | ||||
|             option_list=const.AP_MACH_MODE, | ||||
|             translation_key="mode", | ||||
|         ), | ||||
|     ), | ||||
| } | ||||
| @ -175,9 +177,7 @@ class HonConfigSelectEntity(HonEntity, SelectEntity): | ||||
|     def current_option(self) -> str | None: | ||||
|         if not (setting := self._device.settings.get(self.entity_description.key)): | ||||
|             return None | ||||
|         value = setting.value | ||||
|         if self.entity_description.option_list: | ||||
|             value = self.entity_description.option_list.get(str(value), value) | ||||
|         value = get_readable(self.entity_description, setting.value) | ||||
|         if value not in self._attr_options: | ||||
|             return None | ||||
|         return value | ||||
| @ -187,13 +187,12 @@ class HonConfigSelectEntity(HonEntity, SelectEntity): | ||||
|         setting = self._device.settings.get(self.entity_description.key) | ||||
|         if setting is None: | ||||
|             return [] | ||||
|         options = self.entity_description.option_list or {} | ||||
|         return [options.get(str(key), key) for key in setting.values] | ||||
|         return [get_readable(self.entity_description, key) for key in setting.values] | ||||
|  | ||||
|     def _option_to_number(self, option: str, values: List[str]): | ||||
|         if (options := self.entity_description.option_list) is not None: | ||||
|             return next( | ||||
|                 (k for k, v in options.items() if k in values and v == option), | ||||
|                 (k for k, v in options.items() if str(k) in values and v == option), | ||||
|                 option, | ||||
|             ) | ||||
|         return option | ||||
| @ -213,6 +212,7 @@ class HonConfigSelectEntity(HonEntity, SelectEntity): | ||||
|  | ||||
|     @property | ||||
|     def available(self) -> bool: | ||||
|         """Return True if entity is available.""" | ||||
|         return self._device.settings.get(self.entity_description.key) is not None | ||||
|  | ||||
|  | ||||
| @ -233,6 +233,6 @@ class HonSelectEntity(HonConfigSelectEntity): | ||||
|         """Return True if entity is available.""" | ||||
|         return ( | ||||
|             super().available | ||||
|             and self._device.get("remoteCtrValid", "1") == "1" | ||||
|             and int(self._device.get("remoteCtrValid", 1)) == 1 | ||||
|             and self._device.get("attributes.lastConnEvent.category") != "DISCONNECTED" | ||||
|         ) | ||||
|  | ||||
| @ -12,7 +12,6 @@ from homeassistant.config_entries import ConfigEntry | ||||
| from homeassistant.const import ( | ||||
|     PERCENTAGE, | ||||
|     CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, | ||||
|     CONCENTRATION_PARTS_PER_BILLION, | ||||
|     CONCENTRATION_PARTS_PER_MILLION, | ||||
| ) | ||||
| from homeassistant.const import ( | ||||
| @ -29,7 +28,7 @@ from homeassistant.helpers.entity import EntityCategory | ||||
|  | ||||
| from . import const | ||||
| from .const import DOMAIN | ||||
| from .hon import HonEntity, unique_entities | ||||
| from .hon import HonEntity, unique_entities, get_readable | ||||
|  | ||||
| _LOGGER = logging.getLogger(__name__) | ||||
|  | ||||
| @ -37,12 +36,12 @@ _LOGGER = logging.getLogger(__name__) | ||||
| @dataclass | ||||
| class HonConfigSensorEntityDescription(SensorEntityDescription): | ||||
|     entity_category: EntityCategory = EntityCategory.CONFIG | ||||
|     option_list: Dict[str, str] = None | ||||
|     option_list: Dict[int, str] = None | ||||
|  | ||||
|  | ||||
| @dataclass | ||||
| class HonSensorEntityDescription(SensorEntityDescription): | ||||
|     option_list: Dict[str, str] = None | ||||
|     option_list: Dict[int, str] = None | ||||
|  | ||||
|  | ||||
| SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = { | ||||
| @ -719,14 +718,14 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = { | ||||
|         ), | ||||
|         HonSensorEntityDescription( | ||||
|             key="pm10ValueIndoor", | ||||
|             name="pm10", | ||||
|             name="PM 10", | ||||
|             state_class=SensorStateClass.MEASUREMENT, | ||||
|             device_class=SensorDeviceClass.PM10, | ||||
|             native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, | ||||
|         ), | ||||
|         HonSensorEntityDescription( | ||||
|             key="pm2p5ValueIndoor", | ||||
|             name="pm2p5", | ||||
|             name="PM 2.5", | ||||
|             state_class=SensorStateClass.MEASUREMENT, | ||||
|             device_class=SensorDeviceClass.PM25, | ||||
|             native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, | ||||
| @ -736,7 +735,8 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = { | ||||
|             name="VOC", | ||||
|             state_class=SensorStateClass.MEASUREMENT, | ||||
|             device_class=SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS, | ||||
|             native_unit_of_measurement=CONCENTRATION_PARTS_PER_BILLION, | ||||
|             native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, | ||||
|             translation_key="voc", | ||||
|         ), | ||||
|         HonSensorEntityDescription( | ||||
|             key="humidityIndoor", | ||||
| @ -769,7 +769,7 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non | ||||
|     for device in hass.data[DOMAIN][entry.unique_id].appliances: | ||||
|         for description in SENSORS.get(device.appliance_type, []): | ||||
|             if isinstance(description, HonSensorEntityDescription): | ||||
|                 if not device.get(description.key): | ||||
|                 if device.get(description.key) is None: | ||||
|                     continue | ||||
|                 entity = HonSensorEntity(hass, entry, device, description) | ||||
|             elif isinstance(description, HonConfigSensorEntityDescription): | ||||
| @ -796,7 +796,7 @@ class HonSensorEntity(HonEntity, SensorEntity): | ||||
|             ).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) | ||||
|             value = get_readable(self.entity_description, value) | ||||
|         if not value and self.entity_description.state_class is not None: | ||||
|             self._attr_native_value = 0 | ||||
|         self._attr_native_value = value | ||||
| @ -821,7 +821,7 @@ class HonConfigSensorEntity(HonEntity, SensorEntity): | ||||
|             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) | ||||
|             value = get_readable(self.entity_description, value) | ||||
|         self._attr_native_value = value | ||||
|         if update: | ||||
|             self.async_write_ha_state() | ||||
|  | ||||
| @ -5,8 +5,8 @@ from typing import Any | ||||
|  | ||||
| from homeassistant.components.switch import SwitchEntityDescription, SwitchEntity | ||||
| from homeassistant.config_entries import ConfigEntry | ||||
| from homeassistant.helpers.entity import EntityCategory | ||||
| from homeassistant.core import callback | ||||
| from homeassistant.helpers.entity import EntityCategory | ||||
| from pyhon.parameter.base import HonParameter | ||||
| from pyhon.parameter.range import HonParameterRange | ||||
|  | ||||
| @ -262,9 +262,9 @@ SWITCHES: dict[str, tuple[HonSwitchEntityDescription, ...]] = { | ||||
|         ), | ||||
|         HonSwitchEntityDescription( | ||||
|             key="muteStatus", | ||||
|             name="Mute", | ||||
|             name="Silent Mode", | ||||
|             icon="mdi:volume-off", | ||||
|             translation_key="mute_mode", | ||||
|             translation_key="silent_mode", | ||||
|         ), | ||||
|         HonSwitchEntityDescription( | ||||
|             key="rapidMode", | ||||
| @ -291,9 +291,9 @@ SWITCHES: dict[str, tuple[HonSwitchEntityDescription, ...]] = { | ||||
|         ), | ||||
|         HonSwitchEntityDescription( | ||||
|             key="silentSleepStatus", | ||||
|             name="Silent Sleep", | ||||
|             name="Night Mode", | ||||
|             icon="mdi:bed", | ||||
|             translation_key="silent_mode", | ||||
|             translation_key="night_mode", | ||||
|         ), | ||||
|     ), | ||||
|     "REF": ( | ||||
| @ -329,18 +329,12 @@ SWITCHES: dict[str, tuple[HonSwitchEntityDescription, ...]] = { | ||||
|             icon="mdi:palm-tree", | ||||
|             translation_key="holiday_mode", | ||||
|         ), | ||||
|         HonSwitchEntityDescription( | ||||
|             key="lightStatus", name="Light", icon="mdi:lightbulb" | ||||
|         ), | ||||
|     ), | ||||
|     "AP": ( | ||||
|         HonSwitchEntityDescription( | ||||
|             key="touchToneStatus", | ||||
|             name="Touch Tone", | ||||
|         ), | ||||
|         HonSwitchEntityDescription( | ||||
|             key="lockStatus", | ||||
|             name="Lock Status", | ||||
|             translation_key="touch_tone", | ||||
|         ), | ||||
|     ), | ||||
| } | ||||
| @ -368,7 +362,7 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non | ||||
|             elif isinstance(description, HonSwitchEntityDescription): | ||||
|                 if ( | ||||
|                     f"settings.{description.key}" not in device.available_settings | ||||
|                     or not device.get(description.key) | ||||
|                     or device.get(description.key) is None | ||||
|                 ): | ||||
|                     continue | ||||
|                 entity = HonSwitchEntity(hass, entry, device, description) | ||||
| @ -386,7 +380,7 @@ class HonSwitchEntity(HonEntity, SwitchEntity): | ||||
|     @property | ||||
|     def is_on(self) -> bool | None: | ||||
|         """Return True if entity is on.""" | ||||
|         return self._device.get(self.entity_description.key, "0") == "1" | ||||
|         return self._device.get(self.entity_description.key, 0) == 1 | ||||
|  | ||||
|     async def async_turn_on(self, **kwargs: Any) -> None: | ||||
|         setting = self._device.settings[f"settings.{self.entity_description.key}"] | ||||
| @ -411,14 +405,14 @@ class HonSwitchEntity(HonEntity, SwitchEntity): | ||||
|         """Return True if entity is available.""" | ||||
|         return ( | ||||
|             super().available | ||||
|             and self._device.get("remoteCtrValid", "1") == "1" | ||||
|             and int(self._device.get("remoteCtrValid", 1)) == 1 | ||||
|             and self._device.get("attributes.lastConnEvent.category") != "DISCONNECTED" | ||||
|         ) | ||||
|  | ||||
|     @callback | ||||
|     def _handle_coordinator_update(self, update=True) -> None: | ||||
|         value = self._device.get(self.entity_description.key, "0") | ||||
|         self._attr_state = value == "1" | ||||
|         value = self._device.get(self.entity_description.key, 0) | ||||
|         self._attr_state = value == 1 | ||||
|         if update: | ||||
|             self.async_write_ha_state() | ||||
|  | ||||
| @ -446,7 +440,7 @@ class HonControlSwitchEntity(HonEntity, SwitchEntity): | ||||
|         """Return True if entity is available.""" | ||||
|         return ( | ||||
|             super().available | ||||
|             and self._device.get("remoteCtrValid", "1") == "1" | ||||
|             and int(self._device.get("remoteCtrValid", 1)) == 1 | ||||
|             and self._device.get("attributes.lastConnEvent.category") != "DISCONNECTED" | ||||
|         ) | ||||
|  | ||||
| @ -454,8 +448,8 @@ class HonControlSwitchEntity(HonEntity, SwitchEntity): | ||||
|     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)) | ||||
|         if remaining_time := self._device.get("remainingTimeMM", 0): | ||||
|             delay_time = 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 | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Rychlý 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Aut. Hygienický", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Aut. Rychlý", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto univerzální 50 -60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rychlý 20", | ||||
|                     "hqd_quick_30": "Rychlý 30", | ||||
|                     "hqd_quick_dry": "Rychlé sušení 30", | ||||
|                     "hqd_quick_dry": "Rychlé sušení 30'", | ||||
|                     "hqd_quilt": "Deky", | ||||
|                     "hqd_refresh": "Osvěžení", | ||||
|                     "hqd_school_uniform": "Školní uniformy", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Teplota chladničky" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Plyn (VOC)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Rychlý 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Aut. Hygienický", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Aut. Rychlý", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto univerzální 50 -60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rychlý 20", | ||||
|                     "hqd_quick_30": "Rychlý 30", | ||||
|                     "hqd_quick_dry": "Rychlé sušení 30", | ||||
|                     "hqd_quick_dry": "Rychlé sušení 30'", | ||||
|                     "hqd_quilt": "Deky", | ||||
|                     "hqd_refresh": "Osvěžení", | ||||
|                     "hqd_school_uniform": "Školní uniformy", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Zbývající čas" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Difuzér" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Režim" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1642,7 +1655,7 @@ | ||||
|                 "name": "Trouba" | ||||
|             }, | ||||
|             "prewash": { | ||||
|                 "name": "Předpírka\r\r\r\r\r\r\r\n" | ||||
|                 "name": "Předpírka" | ||||
|             }, | ||||
|             "pause": { | ||||
|                 "name": "Pozastavit" | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Chladnička" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Noční režim" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Hlasitost tónu klepnutí" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1761,7 +1780,7 @@ | ||||
|                 "name": "Zapnout" | ||||
|             }, | ||||
|             "prewash": { | ||||
|                 "name": "Předpírka\r\r\r\r\r\r\r\n" | ||||
|                 "name": "Předpírka" | ||||
|             }, | ||||
|             "buzzer": { | ||||
|                 "name": "Zvuková signalizace konce cyklu" | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Cílová teplota Chladnička" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Hladina pylu" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Odsávání vzduchu" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Světlo" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Rapid 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "AutoUniversal 50-60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious Cure", | ||||
|                     "hqd_quick_20": "Schnell 20", | ||||
|                     "hqd_quick_30": "Schnell 30", | ||||
|                     "hqd_quick_dry": "Schnell trocken 30", | ||||
|                     "hqd_quick_dry": "Schnell trocken 30'", | ||||
|                     "hqd_quilt": "Steppdecken", | ||||
|                     "hqd_refresh": "Auffrischen", | ||||
|                     "hqd_school_uniform": "Schuluniform", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Temperatur des Kühlschranks" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Gas (VOC)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Rapid 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "AutoUniversal 50-60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious Cure", | ||||
|                     "hqd_quick_20": "Schnell 20", | ||||
|                     "hqd_quick_30": "Schnell 30", | ||||
|                     "hqd_quick_dry": "Schnell trocken 30", | ||||
|                     "hqd_quick_dry": "Schnell trocken 30'", | ||||
|                     "hqd_quilt": "Steppdecken", | ||||
|                     "hqd_refresh": "Auffrischen", | ||||
|                     "hqd_school_uniform": "Schuluniform", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Verbleibende Zeit" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Luftverteiler" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Modus" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Kühlschrank" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Nachtmodus" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Tastentonlautstärke" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Zieltemperatur Kühlschrank" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Pollenkonzentration" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Dunstabzug" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Licht" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Γρηγορο 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Αυτοματη Υγιεινη", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Αυτοματο Γρηγορο", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "αυτοματο Universal 50 - 60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Γρήγορα 20", | ||||
|                     "hqd_quick_30": "Γρήγορα 30", | ||||
|                     "hqd_quick_dry": "Γρήγορο στέγνωμα 30", | ||||
|                     "hqd_quick_dry": "Γρήγορο στέγνωμα 30'", | ||||
|                     "hqd_quilt": "Παπλώματα", | ||||
|                     "hqd_refresh": "Φρεσκάρισμα", | ||||
|                     "hqd_school_uniform": "Σχολική στολή", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Θερμοκρασία ψυγείου" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Αέριο (VOC)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Γρηγορο 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Αυτοματη Υγιεινη", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Αυτοματο Γρηγορο", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "αυτοματο Universal 50 - 60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Γρήγορα 20", | ||||
|                     "hqd_quick_30": "Γρήγορα 30", | ||||
|                     "hqd_quick_dry": "Γρήγορο στέγνωμα 30", | ||||
|                     "hqd_quick_dry": "Γρήγορο στέγνωμα 30'", | ||||
|                     "hqd_quilt": "Παπλώματα", | ||||
|                     "hqd_refresh": "Φρεσκάρισμα", | ||||
|                     "hqd_school_uniform": "Σχολική στολή", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Χρόνος που απομένει" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Διαχύτης" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Mode" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Ψυγείο" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Νυχτερινή λειτουργία" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Ένταση τόνου αφής" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Στοχευμένη θερμοκρασία Ψυγείο" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Επίπεδο γύρης" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Εξαγωγή αέρα" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Φως" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -360,8 +360,8 @@ | ||||
|                     "hqd_outdoor": "Outdoor", | ||||
|                     "hqd_precious_cure": "Precious Cure", | ||||
|                     "hqd_quick_20": "Quick 20m", | ||||
|                     "hqd_quick_30": "Quick 30m", | ||||
|                     "hqd_quick_dry": "Quick dry (30 min)", | ||||
|                     "hqd_quick_30": "Quick 30'", | ||||
|                     "hqd_quick_dry": "Quick dry 30'", | ||||
|                     "hqd_quilt": "Quilts", | ||||
|                     "hqd_refresh": "Refresh", | ||||
|                     "hqd_school_uniform": "School Uniform", | ||||
| @ -399,7 +399,7 @@ | ||||
|                     "iot_dry_lingerie": "Lingerie", | ||||
|                     "iot_dry_mixed": "Mixed", | ||||
|                     "iot_dry_playsuits": "Playsuits", | ||||
|                     "iot_dry_rapid_30": "Rapid 30m", | ||||
|                     "iot_dry_rapid_30": "Rapid 30'", | ||||
|                     "iot_dry_rapid_59": "Rapid 59'", | ||||
|                     "iot_dry_refresh": "Refresh", | ||||
|                     "iot_dry_regenerates_waterproof": "Regenerates Waterproof", | ||||
| @ -699,6 +699,7 @@ | ||||
|                     "iot_wash_wool": "Wool", | ||||
|                     "jeans": "Jeans", | ||||
|                     "jeans_60": "Jeans", | ||||
|                     "jeans_60_steam": "Jeans + Steam", | ||||
|                     "low_dry": "Low Heat Dry", | ||||
|                     "mixed": "Mixed", | ||||
|                     "mixed_and_colored_59": "Mixed and Colored 59'", | ||||
| @ -876,6 +877,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Fridge temperature" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Gas (VOC)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -1198,8 +1202,8 @@ | ||||
|                     "hqd_outdoor": "Outdoor", | ||||
|                     "hqd_precious_cure": "Precious Cure", | ||||
|                     "hqd_quick_20": "Quick 20m", | ||||
|                     "hqd_quick_30": "Quick 30m", | ||||
|                     "hqd_quick_dry": "Quick dry (30 min)", | ||||
|                     "hqd_quick_30": "Quick 30'", | ||||
|                     "hqd_quick_dry": "Quick dry 30'", | ||||
|                     "hqd_quilt": "Quilts", | ||||
|                     "hqd_refresh": "Refresh", | ||||
|                     "hqd_school_uniform": "School Uniform", | ||||
| @ -1237,7 +1241,7 @@ | ||||
|                     "iot_dry_lingerie": "Lingerie", | ||||
|                     "iot_dry_mixed": "Mixed", | ||||
|                     "iot_dry_playsuits": "Playsuits", | ||||
|                     "iot_dry_rapid_30": "Rapid 30m", | ||||
|                     "iot_dry_rapid_30": "Rapid 30'", | ||||
|                     "iot_dry_rapid_59": "Rapid 59'", | ||||
|                     "iot_dry_refresh": "Refresh", | ||||
|                     "iot_dry_regenerates_waterproof": "Regenerates Waterproof", | ||||
| @ -1537,6 +1541,7 @@ | ||||
|                     "iot_wash_wool": "Wool", | ||||
|                     "jeans": "Jeans", | ||||
|                     "jeans_60": "Jeans", | ||||
|                     "jeans_60_steam": "Jeans + Steam", | ||||
|                     "low_dry": "Low Heat Dry", | ||||
|                     "mixed": "Mixed", | ||||
|                     "mixed_and_colored_59": "Mixed and Colored 59'", | ||||
| @ -1628,6 +1633,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Time remaining" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Diffuser" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Mode" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1735,6 +1746,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Refrigerator" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Night mode" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Touch tone volume" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1864,6 +1881,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Target temperature Fridge" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Pollen level" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -2006,6 +2026,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Air extraction" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Light" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Rápido 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto Universal 50 - 60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rápido 20", | ||||
|                     "hqd_quick_30": "Rápido 30", | ||||
|                     "hqd_quick_dry": "Secado rápido 30", | ||||
|                     "hqd_quick_dry": "Secado rápido 30'", | ||||
|                     "hqd_quilt": "Colchas", | ||||
|                     "hqd_refresh": "Refrescar", | ||||
|                     "hqd_school_uniform": "Uniformes escolares", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Temperatura del frigorífico" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Gas (COV)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Rápido 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto Universal 50 - 60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rápido 20", | ||||
|                     "hqd_quick_30": "Rápido 30", | ||||
|                     "hqd_quick_dry": "Secado rápido 30", | ||||
|                     "hqd_quick_dry": "Secado rápido 30'", | ||||
|                     "hqd_quilt": "Colchas", | ||||
|                     "hqd_refresh": "Refrescar", | ||||
|                     "hqd_school_uniform": "Uniformes escolares", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Tiempo restante" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Difusor" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Modo" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Frigorífico" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Modo nocturno" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Volumen del tono táctil" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Temperatura deseada Frigorífico" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Nivel de polen" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Extracción de aire" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Luz" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Rapide 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiène", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapide", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto universel 50 - 60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rapide 20’", | ||||
|                     "hqd_quick_30": "Rapide 30’", | ||||
|                     "hqd_quick_dry": "Séchage rapide 30", | ||||
|                     "hqd_quick_dry": "Séchage rapide 30'", | ||||
|                     "hqd_quilt": "Couvertures", | ||||
|                     "hqd_refresh": "Rafraîchissement", | ||||
|                     "hqd_school_uniform": "Uniforme scolaire", | ||||
| @ -372,7 +374,7 @@ | ||||
|                     "iot_dry_cotton": "Coton", | ||||
|                     "iot_dry_cuddly_toys": "Jouets en peluche", | ||||
|                     "iot_dry_curtains": "Rideaux", | ||||
|                     "iot_dry_dehumidifier": "Élimination de l\\'humidité", | ||||
|                     "iot_dry_dehumidifier": "Élimination de l'humidité", | ||||
|                     "iot_dry_delicates": "Délicats", | ||||
|                     "iot_dry_delicate_tablecloths": "Nappes délicates", | ||||
|                     "iot_dry_denim_jeans": "Denim - jeans", | ||||
| @ -386,7 +388,7 @@ | ||||
|                     "iot_dry_playsuits": "Combinaisons", | ||||
|                     "iot_dry_rapid_30": "Rapid 30", | ||||
|                     "iot_dry_rapid_59": "Rapide 59'.", | ||||
|                     "iot_dry_refresh": "Coup d\\'éclat", | ||||
|                     "iot_dry_refresh": "Coup d'éclat", | ||||
|                     "iot_dry_regenerates_waterproof": "Imperméabilisant", | ||||
|                     "iot_dry_relax_creases": "Anti-plis", | ||||
|                     "iot_dry_shirts": "Chemises", | ||||
| @ -488,7 +490,7 @@ | ||||
|                     "hqd_quick_15": "Rapide 15'", | ||||
|                     "hqd_quick_wash_57": "Lavage rapide 57 min", | ||||
|                     "hqd_rapid_wash_and_dry": "Lavage et séchage", | ||||
|                     "hqd_refresh": "Coup d\\'éclat", | ||||
|                     "hqd_refresh": "Coup d'éclat", | ||||
|                     "hqd_rinse": "Rinçage", | ||||
|                     "hqd_shirts": "Chemises", | ||||
|                     "hqd_smart": "Smart A.I.", | ||||
| @ -522,7 +524,7 @@ | ||||
|                     "iot_dry_cotton_dry": "Séchage du coton", | ||||
|                     "iot_dry_cuddly_toys": "Animaux en peluche", | ||||
|                     "iot_dry_curtains": "Rideaux", | ||||
|                     "iot_dry_dehumidifier": "Élimination de l\\'humidité", | ||||
|                     "iot_dry_dehumidifier": "Élimination de l'humidité", | ||||
|                     "iot_dry_delicates_antiallergy": "Délicat - anti-allergique", | ||||
|                     "iot_dry_delicate_tablecloths": "Nappes délicates", | ||||
|                     "iot_dry_denim_jeans": "Denim - Jeans", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Température du réfrigérateur" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "COV gazeux" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Rapide 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiène", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapide", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto universel 50 - 60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rapide 20’", | ||||
|                     "hqd_quick_30": "Rapide 30’", | ||||
|                     "hqd_quick_dry": "Séchage rapide 30", | ||||
|                     "hqd_quick_dry": "Séchage rapide 30'", | ||||
|                     "hqd_quilt": "Couvertures", | ||||
|                     "hqd_refresh": "Rafraîchissement", | ||||
|                     "hqd_school_uniform": "Uniforme scolaire", | ||||
| @ -1197,7 +1204,7 @@ | ||||
|                     "iot_dry_cotton": "Coton", | ||||
|                     "iot_dry_cuddly_toys": "Jouets en peluche", | ||||
|                     "iot_dry_curtains": "Rideaux", | ||||
|                     "iot_dry_dehumidifier": "Élimination de l\\'humidité", | ||||
|                     "iot_dry_dehumidifier": "Élimination de l'humidité", | ||||
|                     "iot_dry_delicates": "Délicats", | ||||
|                     "iot_dry_delicate_tablecloths": "Nappes délicates", | ||||
|                     "iot_dry_denim_jeans": "Denim - jeans", | ||||
| @ -1211,7 +1218,7 @@ | ||||
|                     "iot_dry_playsuits": "Combinaisons", | ||||
|                     "iot_dry_rapid_30": "Rapid 30", | ||||
|                     "iot_dry_rapid_59": "Rapide 59'.", | ||||
|                     "iot_dry_refresh": "Coup d\\'éclat", | ||||
|                     "iot_dry_refresh": "Coup d'éclat", | ||||
|                     "iot_dry_regenerates_waterproof": "Imperméabilisant", | ||||
|                     "iot_dry_relax_creases": "Anti-plis", | ||||
|                     "iot_dry_shirts": "Chemises", | ||||
| @ -1313,7 +1320,7 @@ | ||||
|                     "hqd_quick_15": "Rapide 15'", | ||||
|                     "hqd_quick_wash_57": "Lavage rapide 57 min", | ||||
|                     "hqd_rapid_wash_and_dry": "Lavage et séchage", | ||||
|                     "hqd_refresh": "Coup d\\'éclat", | ||||
|                     "hqd_refresh": "Coup d'éclat", | ||||
|                     "hqd_rinse": "Rinçage", | ||||
|                     "hqd_shirts": "Chemises", | ||||
|                     "hqd_smart": "Smart A.I.", | ||||
| @ -1347,7 +1354,7 @@ | ||||
|                     "iot_dry_cotton_dry": "Séchage du coton", | ||||
|                     "iot_dry_cuddly_toys": "Animaux en peluche", | ||||
|                     "iot_dry_curtains": "Rideaux", | ||||
|                     "iot_dry_dehumidifier": "Élimination de l\\'humidité", | ||||
|                     "iot_dry_dehumidifier": "Élimination de l'humidité", | ||||
|                     "iot_dry_delicates_antiallergy": "Délicat - anti-allergique", | ||||
|                     "iot_dry_delicate_tablecloths": "Nappes délicates", | ||||
|                     "iot_dry_denim_jeans": "Denim - Jeans", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Temps restant" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Diffuseur" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Mode" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Réfrigérateur" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Mode nuit" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Volume des tonalités" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Température cible Réfrigérateur" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Niveau de pollen" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Extraction de l'air" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Luminosité" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -413,6 +413,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Fridge temperature" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Gas (VOC)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -724,6 +727,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "זמן שנותר" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Diffuser" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Mode" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -831,6 +840,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Refrigerator" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Night mode" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Touch tone volume" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -960,6 +975,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Target temperature Fridge" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Pollen level" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1027,6 +1045,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Air extraction" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Light" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Brzi 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Automatska Higijena", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Automatski Brzi", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Automatski univerzalni 50 - 60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious Cure", | ||||
|                     "hqd_quick_20": "Brzo 20", | ||||
|                     "hqd_quick_30": "Brzo 30", | ||||
|                     "hqd_quick_dry": "Brzo sušenje 30", | ||||
|                     "hqd_quick_dry": "Brzo sušenje 30'", | ||||
|                     "hqd_quilt": "Popluni", | ||||
|                     "hqd_refresh": "Protiv neugodnih mirisa", | ||||
|                     "hqd_school_uniform": "Školska uniforma", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Temperatura hladnjaka" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Plinovi (HOS-ovi)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Brzi 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Automatska Higijena", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Automatski Brzi", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Automatski univerzalni 50 - 60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious Cure", | ||||
|                     "hqd_quick_20": "Brzo 20", | ||||
|                     "hqd_quick_30": "Brzo 30", | ||||
|                     "hqd_quick_dry": "Brzo sušenje 30", | ||||
|                     "hqd_quick_dry": "Brzo sušenje 30'", | ||||
|                     "hqd_quilt": "Popluni", | ||||
|                     "hqd_refresh": "Protiv neugodnih mirisa", | ||||
|                     "hqd_school_uniform": "Školska uniforma", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Preostalo vrijeme" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Raspršivač" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Mode" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Hladnjak" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Noćni način rada" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Glasnoća tona pri dodiru" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Ciljana temperatura Hladnjak" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Razina peludi" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Odvođenje zraka" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Svjetlo" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Rapido 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Igiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapido", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto Universale 50 - 60°C", | ||||
| @ -345,8 +347,8 @@ | ||||
|                     "hqd_outdoor": "Outdoor", | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rapido 20m", | ||||
|                     "hqd_quick_30": "Rapido 30m", | ||||
|                     "hqd_quick_dry": "Asciugatura veloce (30 min)", | ||||
|                     "hqd_quick_30": "Rapido 30'", | ||||
|                     "hqd_quick_dry": "Asciugatura veloce 30'", | ||||
|                     "hqd_quilt": "Trapunte", | ||||
|                     "hqd_refresh": "Refresh", | ||||
|                     "hqd_school_uniform": "Uniforme scolastica", | ||||
| @ -384,7 +386,7 @@ | ||||
|                     "iot_dry_lingerie": "Lingerie", | ||||
|                     "iot_dry_mixed": "Misti", | ||||
|                     "iot_dry_playsuits": "Tutine", | ||||
|                     "iot_dry_rapid_30": "Rapido 30m", | ||||
|                     "iot_dry_rapid_30": "Rapido 30'", | ||||
|                     "iot_dry_rapid_59": "Rapido 59'.", | ||||
|                     "iot_dry_refresh": "Rinfresca", | ||||
|                     "iot_dry_regenerates_waterproof": "Rigenera Tessuti Impermeabili", | ||||
| @ -860,6 +862,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Temperatura del frigorifero" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Gas (VOC)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -927,7 +932,9 @@ | ||||
|                     "59_min": "Rapido 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Igiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapido", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto Universale 50 - 60°C", | ||||
| @ -1175,8 +1182,8 @@ | ||||
|                     "hqd_outdoor": "Outdoor", | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rapido 20m", | ||||
|                     "hqd_quick_30": "Rapido 30m", | ||||
|                     "hqd_quick_dry": "Asciugatura veloce (30 min)", | ||||
|                     "hqd_quick_30": "Rapido 30'", | ||||
|                     "hqd_quick_dry": "Asciugatura veloce 30'", | ||||
|                     "hqd_quilt": "Trapunte", | ||||
|                     "hqd_refresh": "Refresh", | ||||
|                     "hqd_school_uniform": "Uniforme scolastica", | ||||
| @ -1214,7 +1221,7 @@ | ||||
|                     "iot_dry_lingerie": "Lingerie", | ||||
|                     "iot_dry_mixed": "Misti", | ||||
|                     "iot_dry_playsuits": "Tutine", | ||||
|                     "iot_dry_rapid_30": "Rapido 30m", | ||||
|                     "iot_dry_rapid_30": "Rapido 30'", | ||||
|                     "iot_dry_rapid_59": "Rapido 59'.", | ||||
|                     "iot_dry_refresh": "Rinfresca", | ||||
|                     "iot_dry_regenerates_waterproof": "Rigenera Tessuti Impermeabili", | ||||
| @ -1604,6 +1611,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Tempo rimanente" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Diffusore" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Modalità" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1711,6 +1724,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Frigo" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Modalità notte" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Volume Tasti" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1840,6 +1859,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Temperatura target Frigorifero" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Livello di polline" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1980,6 +2002,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Aspirazione aria" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Illuminazione" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Snel 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto universeel 50 - 60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Quick 20", | ||||
|                     "hqd_quick_30": "Quick 30", | ||||
|                     "hqd_quick_dry": "Quick dry 30", | ||||
|                     "hqd_quick_dry": "Quick dry 30'", | ||||
|                     "hqd_quilt": "Quilts", | ||||
|                     "hqd_refresh": "Opfrissen", | ||||
|                     "hqd_school_uniform": "Schooluniform", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Koelkasttemperatuur" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Gas (VOC)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Snel 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto universeel 50 - 60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Quick 20", | ||||
|                     "hqd_quick_30": "Quick 30", | ||||
|                     "hqd_quick_dry": "Quick dry 30", | ||||
|                     "hqd_quick_dry": "Quick dry 30'", | ||||
|                     "hqd_quilt": "Quilts", | ||||
|                     "hqd_refresh": "Opfrissen", | ||||
|                     "hqd_school_uniform": "Schooluniform", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Resterende tijd" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Diffuser" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Modus" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Koelkast" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Nachtmodus" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Volume van geluid bij aanraking" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Doeltemperatuur Koelkast" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Pollenniveau" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Luchtafvoer" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Licht" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Szybki 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto Universalny 50 - 60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Szybkie 20", | ||||
|                     "hqd_quick_30": "Szybkie 30", | ||||
|                     "hqd_quick_dry": "Szybkoschnące 30", | ||||
|                     "hqd_quick_dry": "Szybkoschnące 30'", | ||||
|                     "hqd_quilt": "Kołdry", | ||||
|                     "hqd_refresh": "Odświeżanie", | ||||
|                     "hqd_school_uniform": "Mundurek szkolny", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Temperatura lodówki" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Gaz (VOC)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Szybki 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto Universalny 50 - 60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Szybkie 20", | ||||
|                     "hqd_quick_30": "Szybkie 30", | ||||
|                     "hqd_quick_dry": "Szybkoschnące 30", | ||||
|                     "hqd_quick_dry": "Szybkoschnące 30'", | ||||
|                     "hqd_quilt": "Kołdry", | ||||
|                     "hqd_refresh": "Odświeżanie", | ||||
|                     "hqd_school_uniform": "Mundurek szkolny", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Pozostały czas" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Dyfuzor" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Tryb" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Lodówka" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Tryb nocny" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Dźwięk przycisku dotykowego" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Temperatura docelowa Lodówka" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Poziom pyłków" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Wyciąg powietrza" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Światło" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Rápido 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto Universal 50 - 60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rápido 20", | ||||
|                     "hqd_quick_30": "Rápido 30", | ||||
|                     "hqd_quick_dry": "Secagem rápida 30", | ||||
|                     "hqd_quick_dry": "Secagem rápida 30'", | ||||
|                     "hqd_quilt": "Colchas", | ||||
|                     "hqd_refresh": "Refrescar", | ||||
|                     "hqd_school_uniform": "Farda da escola", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Temperatura do frigorífico" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Gás (VOC)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Rápido 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto Universal 50 - 60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rápido 20", | ||||
|                     "hqd_quick_30": "Rápido 30", | ||||
|                     "hqd_quick_dry": "Secagem rápida 30", | ||||
|                     "hqd_quick_dry": "Secagem rápida 30'", | ||||
|                     "hqd_quilt": "Colchas", | ||||
|                     "hqd_refresh": "Refrescar", | ||||
|                     "hqd_school_uniform": "Farda da escola", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Tempo restante" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Difusor" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Modo" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Frigorífico" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Modo noturno" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Volume do tom de toque" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Temperatura alvo Frigorífico" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Nível de pólenes" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Extração de ar" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Luz" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Rapid 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Autoigienă", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto Universal 50 - 60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rapid 20", | ||||
|                     "hqd_quick_30": "Rapid 30", | ||||
|                     "hqd_quick_dry": "Uscare rapidă 30", | ||||
|                     "hqd_quick_dry": "Uscare rapidă 30'", | ||||
|                     "hqd_quilt": "Pilote", | ||||
|                     "hqd_refresh": "Reîmprospătare", | ||||
|                     "hqd_school_uniform": "Uniformă școlară", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Temperatura frigiderului" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Gaze (COV)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Rapid 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Autoigienă", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto Universal 50 - 60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rapid 20", | ||||
|                     "hqd_quick_30": "Rapid 30", | ||||
|                     "hqd_quick_dry": "Uscare rapidă 30", | ||||
|                     "hqd_quick_dry": "Uscare rapidă 30'", | ||||
|                     "hqd_quilt": "Pilote", | ||||
|                     "hqd_refresh": "Reîmprospătare", | ||||
|                     "hqd_school_uniform": "Uniformă școlară", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Timp rămas" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Difuzor" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Mode" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Frigider" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Modul noapte" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Volum la atingerea tastelor" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Temperatură vizată Frigider" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Nivel polen" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Extracția aerului" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Lumină" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Быcтрая Мойkа 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Автоочистка", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Быстрая Автомойка", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "авто универсальная 50 - 60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Быстрая 20", | ||||
|                     "hqd_quick_30": "Быстрая 30", | ||||
|                     "hqd_quick_dry": "Быстрая сушка 30", | ||||
|                     "hqd_quick_dry": "Быстрая сушка 30'", | ||||
|                     "hqd_quilt": "Стеганые одеяла", | ||||
|                     "hqd_refresh": "Освежение", | ||||
|                     "hqd_school_uniform": "Школьная форма", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Температура в холодильнике" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Газ (ЛОС)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Быcтрая Мойkа 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Автоочистка", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Быстрая Автомойка", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "авто универсальная 50 - 60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Быстрая 20", | ||||
|                     "hqd_quick_30": "Быстрая 30", | ||||
|                     "hqd_quick_dry": "Быстрая сушка 30", | ||||
|                     "hqd_quick_dry": "Быстрая сушка 30'", | ||||
|                     "hqd_quilt": "Стеганые одеяла", | ||||
|                     "hqd_refresh": "Освежение", | ||||
|                     "hqd_school_uniform": "Школьная форма", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Оставшееся время" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Распылитель" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Режим" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Холодильник" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Ночной режим" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Громкость сенсорных кнопок" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Заданная температура Холодильник" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Уровень пыльцы в воздухе" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Отвод воздуха" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Свет" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Rýchly 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Automatická Hygiena", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto univerzálny 50 -60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rýchle 20", | ||||
|                     "hqd_quick_30": "Rýchle 30", | ||||
|                     "hqd_quick_dry": "Rýchle sušenie 30", | ||||
|                     "hqd_quick_dry": "Rýchle sušenie 30'", | ||||
|                     "hqd_quilt": "Prikrývky", | ||||
|                     "hqd_refresh": "Osvieženie", | ||||
|                     "hqd_school_uniform": "Školská uniforma", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Teplota chladničky" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Plyn (VOC)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Rýchly 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Automatická Hygiena", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Auto univerzálny 50 -60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Rýchle 20", | ||||
|                     "hqd_quick_30": "Rýchle 30", | ||||
|                     "hqd_quick_dry": "Rýchle sušenie 30", | ||||
|                     "hqd_quick_dry": "Rýchle sušenie 30'", | ||||
|                     "hqd_quilt": "Prikrývky", | ||||
|                     "hqd_refresh": "Osvieženie", | ||||
|                     "hqd_school_uniform": "Školská uniforma", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Zostávajúci čas" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Difuzér" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Mode" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Chladnička" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Nočný režim" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Hlasitosť tónu dotyku" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Cieľová teplota Chladnička" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Úroveň peľu" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Odsávanie vzduchu" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Osvetlenie" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Hitri progr. 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Higiena", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Avtomatsko Hitro", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Samodejno univerzalno 50–60 °C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Hitro 20", | ||||
|                     "hqd_quick_30": "Hitro 30", | ||||
|                     "hqd_quick_dry": "Hitro sušenje 30", | ||||
|                     "hqd_quick_dry": "Hitro sušenje 30'", | ||||
|                     "hqd_quilt": "Posteljna pregrinjala", | ||||
|                     "hqd_refresh": "Osvežitev", | ||||
|                     "hqd_school_uniform": "Šolska uniforma", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Temperatura hladilnika" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Lahkohlapne organske spojine (HOS)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Hitri progr. 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Higiena", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Avtomatsko Hitro", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Samodejno univerzalno 50–60 °C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Hitro 20", | ||||
|                     "hqd_quick_30": "Hitro 30", | ||||
|                     "hqd_quick_dry": "Hitro sušenje 30", | ||||
|                     "hqd_quick_dry": "Hitro sušenje 30'", | ||||
|                     "hqd_quilt": "Posteljna pregrinjala", | ||||
|                     "hqd_refresh": "Osvežitev", | ||||
|                     "hqd_school_uniform": "Šolska uniforma", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Time remaining" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Razpršilnik" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Mode" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Hladilnik" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Nočni način" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Glasnost tona dotika" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Ciljna temperatura Hladilnik" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Raven cvetnega prahu" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Odvajanje zraka" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Osvetljava" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Brzi 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Automatska Higijena", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Automatski Brzi", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Automatski univerzalni 50 - 60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Brzo 20", | ||||
|                     "hqd_quick_30": "Brzo 30", | ||||
|                     "hqd_quick_dry": "Brzo sušenje 30", | ||||
|                     "hqd_quick_dry": "Brzo sušenje 30'", | ||||
|                     "hqd_quilt": "Jorgani", | ||||
|                     "hqd_refresh": "Osvežavanje", | ||||
|                     "hqd_school_uniform": "Školska uniforma", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Temperatura frižidera" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Gas (VOC)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Brzi 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Automatska Higijena", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Automatski Brzi", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Automatski univerzalni 50 - 60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Brzo 20", | ||||
|                     "hqd_quick_30": "Brzo 30", | ||||
|                     "hqd_quick_dry": "Brzo sušenje 30", | ||||
|                     "hqd_quick_dry": "Brzo sušenje 30'", | ||||
|                     "hqd_quilt": "Jorgani", | ||||
|                     "hqd_refresh": "Osvežavanje", | ||||
|                     "hqd_school_uniform": "Školska uniforma", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Preostalo vreme" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Difuzor" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Mode" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Frižider" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Noćni režim" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Jačina tona dodira" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Željena temperatura Frižider" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Nivo polena u vazduhu" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Usisavanje vazduha" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Svetlo" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Hizli 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Oto. Hijyen", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Oto. Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Universal 50-60°C", | ||||
| @ -346,7 +348,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Hızlı 20", | ||||
|                     "hqd_quick_30": "Hızlı 30", | ||||
|                     "hqd_quick_dry": "Hızlı kurutma 30", | ||||
|                     "hqd_quick_dry": "Hızlı kurutma 30'", | ||||
|                     "hqd_quilt": "Yorganlar", | ||||
|                     "hqd_refresh": "Yenileme", | ||||
|                     "hqd_school_uniform": "Okul üniforması", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "Buzdolabı sıcaklığı" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "Gaz (VOC)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Hizli 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Oto. Hijyen", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Oto. Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "Universal 50-60°C", | ||||
| @ -1171,7 +1178,7 @@ | ||||
|                     "hqd_precious_cure": "Precious cure", | ||||
|                     "hqd_quick_20": "Hızlı 20", | ||||
|                     "hqd_quick_30": "Hızlı 30", | ||||
|                     "hqd_quick_dry": "Hızlı kurutma 30", | ||||
|                     "hqd_quick_dry": "Hızlı kurutma 30'", | ||||
|                     "hqd_quilt": "Yorganlar", | ||||
|                     "hqd_refresh": "Yenileme", | ||||
|                     "hqd_school_uniform": "Okul üniforması", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "Kalan süre" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "Difüzör" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Mode" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "Buzdolabı" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "Gece modu" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "Dokunma tonu seviyesi" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "Hedef sıcaklık Buzdolabı" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "Polen seviyesi" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "Hava tahliyesi" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "Işık" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
| @ -97,7 +97,9 @@ | ||||
|                     "59_min": "Rapid 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "自动通用50℃-60℃", | ||||
| @ -500,7 +502,7 @@ | ||||
|                     "hygiene_60": "卫生 60°", | ||||
|                     "hygiene_plus_59": "卫生增强 59 分", | ||||
|                     "hygiene_plus_59_min": "卫生增强 59 分", | ||||
|                     "hygiene_pro_49_min": "Hygiene Pro 49 min", | ||||
|                     "hygiene_pro_49_min": "49 分钟卫生专家", | ||||
|                     "hygiene_pro_steam": "Hygiene Pro + 蒸汽", | ||||
|                     "intensive_40": "加强 40°C", | ||||
|                     "intensive_40_steam": "Intensive 40°C + 蒸汽", | ||||
| @ -855,6 +857,9 @@ | ||||
|             }, | ||||
|             "fridge_temp": { | ||||
|                 "name": "冰箱温度" | ||||
|             }, | ||||
|             "voc": { | ||||
|                 "name": "气体(VOC)" | ||||
|             } | ||||
|         }, | ||||
|         "select": { | ||||
| @ -922,7 +927,9 @@ | ||||
|                     "59_min": "Rapid 59'", | ||||
|                     "auto_care": "Auto Care", | ||||
|                     "auto_care_soil": "Auto Care", | ||||
|                     "auto_hygiene": "Auto Hygiene", | ||||
|                     "auto_plus": "AutoPlus", | ||||
|                     "auto_rapid": "Auto Rapid", | ||||
|                     "auto_sensor": "Auto Sensor", | ||||
|                     "auto_sensor_soil": "Auto Sensor", | ||||
|                     "auto_universal": "自动通用50℃-60℃", | ||||
| @ -1325,7 +1332,7 @@ | ||||
|                     "hygiene_60": "卫生 60°", | ||||
|                     "hygiene_plus_59": "卫生增强 59 分", | ||||
|                     "hygiene_plus_59_min": "卫生增强 59 分", | ||||
|                     "hygiene_pro_49_min": "Hygiene Pro 49 min", | ||||
|                     "hygiene_pro_49_min": "49 分钟卫生专家", | ||||
|                     "hygiene_pro_steam": "Hygiene Pro + 蒸汽", | ||||
|                     "intensive_40": "加强 40°C", | ||||
|                     "intensive_40_steam": "Intensive 40°C + 蒸汽", | ||||
| @ -1599,6 +1606,12 @@ | ||||
|             }, | ||||
|             "remaining_time": { | ||||
|                 "name": "剩余时间" | ||||
|             }, | ||||
|             "diffuser": { | ||||
|                 "name": "扩散器" | ||||
|             }, | ||||
|             "mode": { | ||||
|                 "name": "Mode" | ||||
|             } | ||||
|         }, | ||||
|         "switch": { | ||||
| @ -1706,6 +1719,12 @@ | ||||
|             }, | ||||
|             "refrigerator": { | ||||
|                 "name": "冰箱" | ||||
|             }, | ||||
|             "night_mode": { | ||||
|                 "name": "夜间模式" | ||||
|             }, | ||||
|             "touch_tone": { | ||||
|                 "name": "按键音量" | ||||
|             } | ||||
|         }, | ||||
|         "binary_sensor": { | ||||
| @ -1835,6 +1854,9 @@ | ||||
|             }, | ||||
|             "fridge_temp_sel": { | ||||
|                 "name": "目标温度 冰箱" | ||||
|             }, | ||||
|             "pollen_level": { | ||||
|                 "name": "花粉水平" | ||||
|             } | ||||
|         }, | ||||
|         "climate": { | ||||
| @ -1975,6 +1997,11 @@ | ||||
|             "air_extraction": { | ||||
|                 "name": "抽气" | ||||
|             } | ||||
|         }, | ||||
|         "light": { | ||||
|             "light": { | ||||
|                 "name": "照明" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|  | ||||
							
								
								
									
										9
									
								
								info.md
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								info.md
									
									
									
									
									
								
							| @ -28,8 +28,8 @@ _If the integration is not in the list, you need to clear the browser cache._ | ||||
| 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/> CBWO49TWME-S <br/> RO44 1286DWMC4-07 <br/> HW 68AMC/1-80 <br/> HWPD 69AMBC/1-S | | ||||
| |---------------------|---------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------| | ||||
| | **Washing Machine** | HW90-B14TEAM5 <br/> HW100-B14959U1 <br/> HW 410AMBCB/1-80                                                                                         | H-WASH 500 <br/> H7W4 48MBC-S <br/>                                                                                  | CO4 107T1/2-07 <br/> CBWO49TWME-S <br/> RO44 1286DWMC4-07 <br/> HW 68AMC/1-80 <br/> HWPD 69AMBC/1-S | | ||||
| | **Tumble Dryer**    | HD80-A3959                                                                                                                                        | H-DRY 500 <br/> H9A3TCBEXS-S <br/> HLE C10DCE-80 <br/> NDE H10A2TCE-80 <br/> NDE H9A2TSBEXS-S <br/> NDPHY10A2TCBEXSS | BCTDH7A1TE <br/> CSOE C10DE-80 <br/> ROE H9A3TCEX-S                                                 | | ||||
| | **Washer Dryer**    | HWD100-B14979                                                                                                                                     | HWPS4954DAMR-11                                                                                                      | RPW41066BWMR/1-S                                                                                    | | ||||
| | **Oven**            | HWO60SM2F3XH                                                                                                                                      | HSOT3161WG                                                                                                           |                                                                                                     | | ||||
| @ -40,6 +40,9 @@ Support has been confirmed for these models, but many more will work. Please add | ||||
| | **Hood**            | HADG6DS46BWIFI                                                                                                                                    |                                                                                                                      |                                                                                                     | | ||||
| | **Wine Cellar**     | HWS247FDU1                                                                                                                                        |                                                                                                                      |                                                                                                     | | ||||
|  | ||||
| | Please add your appliances data to our [hon-test-data collection](https://github.com/Andre0512/hon-test-data). <br/>This helps us to develop new features and not to break compatibility in newer versions. | | ||||
| |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ||||
|  | ||||
| ## Supported Languages | ||||
| Translation of internal names like programs are available for all languages which are official supported by the hOn app: | ||||
| * 🇨🇳 Chinese | ||||
| @ -67,6 +70,8 @@ Translation of internal names like programs are available for all languages whic | ||||
|  | ||||
|  | ||||
| ## 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! | ||||
|  | ||||
|  | ||||
							
								
								
									
										49
									
								
								scripts/check.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										49
									
								
								scripts/check.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,49 @@ | ||||
| #!/usr/bin/env python | ||||
| import sys | ||||
| from pathlib import Path | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     sys.path.insert(0, str(Path(__file__).parent.parent)) | ||||
|  | ||||
| from custom_components.hon.binary_sensor import BINARY_SENSORS | ||||
| from custom_components.hon.button import BUTTONS | ||||
| from custom_components.hon.climate import CLIMATES | ||||
| from custom_components.hon.fan import FANS | ||||
| from custom_components.hon.light import LIGHTS | ||||
| from custom_components.hon.lock import LOCKS | ||||
| 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.switch import SWITCHES | ||||
|  | ||||
| entities = { | ||||
|     "binary_sensor": BINARY_SENSORS, | ||||
|     "button": BUTTONS, | ||||
|     "climate": CLIMATES, | ||||
|     "fan": FANS, | ||||
|     "light": LIGHTS, | ||||
|     "lock": LOCKS, | ||||
|     "number": NUMBERS, | ||||
|     "select": SELECTS, | ||||
|     "sensor": SENSORS, | ||||
|     "switch": SWITCHES, | ||||
| } | ||||
|  | ||||
|  | ||||
| def get_missing_translation_keys(): | ||||
|     result = {} | ||||
|     for entity_type, appliances in entities.items(): | ||||
|         for appliance, data in appliances.items(): | ||||
|             for entity in data: | ||||
|                 if entity.translation_key: | ||||
|                     continue | ||||
|                 key = f"{entity_type}.{entity.key}" | ||||
|                 result.setdefault(appliance, []).append(key) | ||||
|     return result | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     for appliance, data in sorted(get_missing_translation_keys().items()): | ||||
|         for key in data: | ||||
|             print(f"WARNING - {appliance} - Missing translation key for {key}") | ||||
| @ -8,48 +8,35 @@ from pathlib import Path | ||||
| if __name__ == "__main__": | ||||
|     sys.path.insert(0, str(Path(__file__).parent.parent)) | ||||
|  | ||||
| from custom_components.hon.const import APPLIANCES | ||||
| from custom_components.hon.binary_sensor import BINARY_SENSORS | ||||
| from custom_components.hon.button import BUTTONS | ||||
| from custom_components.hon.climate import CLIMATES | ||||
| from custom_components.hon.fan import FANS | ||||
| from custom_components.hon.light import LIGHTS | ||||
| from custom_components.hon.lock import LOCKS | ||||
| 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, | ||||
|     HonSwitchEntityDescription, | ||||
| ) | ||||
|  | ||||
| APPLIANCES = { | ||||
|     "AC": "Air Conditioner", | ||||
|     "AP": "Air Purifier", | ||||
|     "AS": "Air Scanner", | ||||
|     "DW": "Dish Washer", | ||||
|     "HO": "Hood", | ||||
|     "IH": "Induction Hob", | ||||
|     "MW": "Microwave", | ||||
|     "OV": "Oven", | ||||
|     "REF": "Fridge", | ||||
|     "RVC": "Robot Vacuum Cleaner", | ||||
|     "TD": "Tumble Dryer", | ||||
|     "WC": "Wine Cellar", | ||||
|     "WD": "Washer Dryer", | ||||
|     "WH": "Water Heater", | ||||
|     "WM": "Washing Machine", | ||||
| } | ||||
|  | ||||
| ENTITY_CATEGORY_SORT = ["control", "config", "sensor"] | ||||
|  | ||||
| entities = { | ||||
|     "binary_sensor": BINARY_SENSORS, | ||||
|     "button": BUTTONS, | ||||
|     "climate": CLIMATES, | ||||
|     "fan": FANS, | ||||
|     "light": LIGHTS, | ||||
|     "lock": LOCKS, | ||||
|     "number": NUMBERS, | ||||
|     "select": SELECTS, | ||||
|     "sensor": SENSORS, | ||||
|     "switch": SWITCHES, | ||||
|     "climate": CLIMATES, | ||||
|     "fan": FANS, | ||||
| } | ||||
|  | ||||
| result = {} | ||||
|  | ||||
| @ -198,7 +198,7 @@ NAMES = { | ||||
|         "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", | ||||
|         "night_mode": "AC.PROGRAM_CARD.NIGHT", | ||||
|         "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", | ||||
| @ -216,6 +216,7 @@ NAMES = { | ||||
|         "super_cool": "REF_CMD&CTRL.MODALITIES.SUPER_COOL", | ||||
|         "super_freeze": "REF_CMD&CTRL.MODALITIES.SUPER_FREEZE", | ||||
|         "refrigerator": "REF.NAME", | ||||
|         "touch_tone": "AP.FOOTER_MENU_MORE.TOUCH_TONE_VOLUME", | ||||
|     }, | ||||
|     "binary_sensor": { | ||||
|         "door_lock": "WASHING_CMD&CTRL.CHECK_UP_RESULTS.DOOR_LOCK", | ||||
| @ -265,6 +266,8 @@ NAMES = { | ||||
|         "eco_pilot": "AC.PROGRAM_DETAIL.ECO_PILOT", | ||||
|         "remaining_time": "ENROLLMENT_COMMON.GENERAL.REMAINING_TIME", | ||||
|         "ref_zones": "IH.COMMON.COIL", | ||||
|         "diffuser": "AP.TITLES.DIFFUSER", | ||||
|         "mode": "CUBE90_GLOBAL.GENERAL.MODE", | ||||
|     }, | ||||
|     "sensor": { | ||||
|         "dry_levels": "WASHING_CMD&CTRL.DRAWER_CYCLE_DRYING.TAB_LEVEL", | ||||
| @ -320,6 +323,7 @@ NAMES = { | ||||
|         "programs_wm": "WC.SET_PROGRAM.PROGRAM", | ||||
|         "programs_ac": "WC.SET_PROGRAM.PROGRAM", | ||||
|         "programs_ref": "WC.SET_PROGRAM.PROGRAM", | ||||
|         "voc": "HINTS.WHAT_POLLUTES_THE_AIR_IN_OUR_HOMES.GAS_VOC_TITLE", | ||||
|     }, | ||||
|     "number": { | ||||
|         "power_management": "HINTS.COOKING_WITH_INDUCTION.POWER_MANAGEMENT", | ||||
| @ -334,6 +338,7 @@ NAMES = { | ||||
|         "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"], | ||||
|         "pollen_level": "AP.AIR_QUALITY.POLLEN_LEVEL", | ||||
|     }, | ||||
|     "climate": { | ||||
|         "air_conditioner": "GLOBALS.APPLIANCES_NAME.AC", | ||||
| @ -342,4 +347,5 @@ NAMES = { | ||||
|         "oven": "GLOBALS.APPLIANCES_NAME.OV", | ||||
|     }, | ||||
|     "fan": {"air_extraction": "HO.DASHBOARD.AIR_EXTRACTION_TITLE"}, | ||||
|     "light": {"light": "WC.DASHBOARD_MENU_MORE.LIGHT"}, | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	