Use fan entity for wind speed

This commit is contained in:
Andre Basche 2023-06-09 05:56:52 +02:00
parent 5bc3120000
commit 79b43b8695
28 changed files with 247 additions and 86 deletions

View file

@ -61,42 +61,18 @@ Translation of internal names like programs are available for all languages whic
## Supported Models ## Supported Models
Support has been confirmed for these models, but many more will work. Please add already supported devices [with this form to complete the list](https://forms.gle/bTSD8qFotdZFytbf8). Support has been confirmed for these models, but many more will work. Please add already supported devices [with this form to complete the list](https://forms.gle/bTSD8qFotdZFytbf8).
- Haier AD105S2SM3FA
- Haier AS20HPL1HRA | | **Haier** | **Hoover** | **Candy** |
- Haier AS25PBAHRA |--------------------|------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------|
- Haier AS25S2SF1FA-WH | **Washing Machine** | HW90-B14TEAM5 <br/> HW100-B14959U1 | H-WASH 500 <br/> H7W4 48MBC-S | RO44 1286DWMC4-07 <br/> HW 68AMC/1-80 <br/> HWPD 69AMBC/1-S |
- Haier AS25TADHRA-2 | **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 |
- Haier AS35TADHRA-2 | **Washer Dryer** | HWD100-B14979 | HWPS4954DAMR-11 | RPW41066BWMR/1-S |
- Haier EG9012B19SU1JD | **Oven** | HWO60SM2F3XH | HSOT3161WG | |
- Haier HA2MTSJ68MC | **Dish Washer** | XIB 3B2SFS-80 <br/> XIB 6B2D3FB | HFB 6B2S3FX | |
- Haier HADG6DS46BWIFI | **Air conditioner** | AD105S2SM3FA <br/> AS20HPL1HRA <br/> AS25PBAHRA <br/> AS25S2SF1FA-WH <br/> AS25TADHRA-2 <br/> AS35TADHRA-2 <br/> | | |
- Haier HD80-A3959 | **Fridge** | HFW7720ENMB | | CCE4T620EWU |
- Haier HW90-B14TEAM5 | **Hob** | HA2MTSJ68MC | | CIS633SCTTWIFI |
- Haier HW100-B14959U1 | **Hood** | HADG6DS46BWIFI | | |
- Haier HWD100-B14979
- Haier HWO60SM2F3XH
- Haier XIB 3B2SFS-80
- Haier XIB 6B2D3FB
- Candy BCTDH7A1TE
- Candy CCE4T620EWU
- Candy CIS633SCTTWIFI
- Candy CSOE C10DE-80
- Candy RO44 1286DWMC4-07
- Candy ROE H9A3TCEX-S
- Candy RPW41066BWMR/1-S
- Hoover H-WASH 500
- Hoover H-DRY 500
- Hoover H7W4 48MBC-S
- Hoover H9A3TCBEXS-S
- Hoover HFB 6B2S3FX
- Hoover HLE C10DCE-80
- Hoover HSOT3161WG
- Hoover HW 68AMC/1-80
- Hoover HWPD 69AMBC/1-S
- Hoover HWPS4954DAMR-11
- Hoover NDE H10A2TCE-80
- Hoover NDE H9A2TSBEXS-S
- Hoover NDPHY10A2TCBEXSS
## Contribute ## Contribute
Any kind of contribution is welcome! Any kind of contribution is welcome!
@ -237,11 +213,11 @@ For every device exists a hidden button which can be used to log all infos of yo
| --- | --- | --- | --- | | --- | --- | --- | --- |
| Start Program | `hvac` | `button` | `startProgram` | | Start Program | `hvac` | `button` | `startProgram` |
| Stop Program | `hvac-off` | `button` | `stopProgram` | | Stop Program | `hvac-off` | `button` | `stopProgram` |
| Wind Speed | | `fan` | `settings.windSpeed` |
#### Configs #### Configs
| Name | Icon | Entity | Key | | Name | Icon | Entity | Key |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| Light status | `lightbulb` | `number` | `startProgram.lightStatus` | | Light status | `lightbulb` | `number` | `startProgram.lightStatus` |
| Wind speed | `fan` | `number` | `startProgram.windSpeed` |
#### Sensors #### Sensors
| Name | Icon | Entity | Key | | Name | Icon | Entity | Key |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@ -257,7 +233,6 @@ For every device exists a hidden button which can be used to log all infos of yo
| Quick Delay Time Status | | `sensor` | `quickDelayTimeStatus` | | Quick Delay Time Status | | `sensor` | `quickDelayTimeStatus` |
| RGB Light Color | `lightbulb` | `sensor` | `rgbLightColors` | | RGB Light Color | `lightbulb` | `sensor` | `rgbLightColors` |
| RGB Light Status | `lightbulb` | `sensor` | `rgbLightStatus` | | RGB Light Status | `lightbulb` | `sensor` | `rgbLightStatus` |
| Wind Speed | `fan` | `sensor` | `windSpeed` |
### Hob ### Hob
#### Controls #### Controls

View file

@ -213,7 +213,7 @@ class HonACClimateEntity(HonEntity, ClimateEntity):
class HonClimateEntity(HonEntity, ClimateEntity): class HonClimateEntity(HonEntity, ClimateEntity):
entity_description = HonClimateEntityDescription entity_description: HonClimateEntityDescription
def __init__(self, hass, entry, device: HonAppliance, description) -> None: def __init__(self, hass, entry, device: HonAppliance, description) -> None:
super().__init__(hass, entry, device, description) super().__init__(hass, entry, device, description)

View file

@ -17,6 +17,7 @@ PLATFORMS = [
"button", "button",
"binary_sensor", "binary_sensor",
"climate", "climate",
"fan",
] ]
HON_HVAC_MODE = { HON_HVAC_MODE = {

View file

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

View file

@ -163,12 +163,6 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = {
), ),
), ),
"HO": ( "HO": (
HonNumberEntityDescription(
key="startProgram.windSpeed",
name="Wind speed",
icon="mdi:fan",
entity_category=EntityCategory.CONFIG,
),
HonNumberEntityDescription( HonNumberEntityDescription(
key="startProgram.lightStatus", key="startProgram.lightStatus",
name="Light status", name="Light status",

View file

@ -593,11 +593,6 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
name="RGB Light Status", name="RGB Light Status",
icon="mdi:lightbulb", icon="mdi:lightbulb",
), ),
HonSensorEntityDescription(
key="windSpeed",
name="Wind Speed",
icon="mdi:fan",
),
), ),
} }
SENSORS["WD"] = unique_entities(SENSORS["WM"], SENSORS["TD"]) SENSORS["WD"] = unique_entities(SENSORS["WM"], SENSORS["TD"])

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Odsávání vzduchu"
}
} }
}, },
"config": { "config": {

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Dunstabzug"
}
} }
}, },
"config": { "config": {

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Εξαγωγή αέρα"
}
} }
}, },
"config": { "config": {

View file

@ -2056,6 +2056,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Air extraction"
}
} }
} }
} }

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Extracción de aire"
}
} }
}, },
"config": { "config": {

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Extraction de l'air"
}
} }
}, },
"config": { "config": {

View file

@ -1065,6 +1065,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Air extraction"
}
} }
}, },
"config": { "config": {

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Odvođenje zraka"
}
} }
}, },
"config": { "config": {

View file

@ -2031,6 +2031,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Aspirazione aria"
}
} }
} }
} }

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Luchtafvoer"
}
} }
}, },
"config": { "config": {

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Wyciąg powietrza"
}
} }
}, },
"config": { "config": {

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Extração de ar"
}
} }
}, },
"config": { "config": {

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Extracția aerului"
}
} }
}, },
"config": { "config": {

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Отвод воздуха"
}
} }
}, },
"config": { "config": {

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Odsávanie vzduchu"
}
} }
}, },
"config": { "config": {

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Odvajanje zraka"
}
} }
}, },
"config": { "config": {

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Usisavanje vazduha"
}
} }
}, },
"config": { "config": {

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "Hava tahliyesi"
}
} }
}, },
"config": { "config": {

View file

@ -1979,6 +1979,11 @@
} }
} }
} }
},
"fan": {
"air_extraction": {
"name": "抽气"
}
} }
}, },
"config": { "config": {

48
info.md
View file

@ -50,42 +50,18 @@ Translation of internal names like programs are available for all languages whic
## Supported Models ## Supported Models
Support has been confirmed for these models, but many more will work. Please add already supported devices [with this form to complete the list](https://forms.gle/bTSD8qFotdZFytbf8). Support has been confirmed for these models, but many more will work. Please add already supported devices [with this form to complete the list](https://forms.gle/bTSD8qFotdZFytbf8).
- Haier AD105S2SM3FA
- Haier AS20HPL1HRA | | **Haier** | **Hoover** | **Candy** |
- Haier AS25PBAHRA |--------------------|------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------|
- Haier AS25S2SF1FA-WH | **Washing Machine** | HW90-B14TEAM5 <br/> HW100-B14959U1 | H-WASH 500 <br/> H7W4 48MBC-S | RO44 1286DWMC4-07 <br/> HW 68AMC/1-80 <br/> HWPD 69AMBC/1-S |
- Haier AS25TADHRA-2 | **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 |
- Haier AS35TADHRA-2 | **Washer Dryer** | HWD100-B14979 | HWPS4954DAMR-11 | RPW41066BWMR/1-S |
- Haier EG9012B19SU1JD | **Oven** | HWO60SM2F3XH | HSOT3161WG | |
- Haier HA2MTSJ68MC | **Dish Washer** | XIB 3B2SFS-80 <br/> XIB 6B2D3FB | HFB 6B2S3FX | |
- Haier HADG6DS46BWIFI | **Air conditioner** | AD105S2SM3FA <br/> AS20HPL1HRA <br/> AS25PBAHRA <br/> AS25S2SF1FA-WH <br/> AS25TADHRA-2 <br/> AS35TADHRA-2 <br/> | | |
- Haier HD80-A3959 | **Fridge** | HFW7720ENMB | | CCE4T620EWU |
- Haier HW90-B14TEAM5 | **Hob** | HA2MTSJ68MC | | CIS633SCTTWIFI |
- Haier HW100-B14959U1 | **Hood** | HADG6DS46BWIFI | | |
- Haier HWD100-B14979
- Haier HWO60SM2F3XH
- Haier XIB 3B2SFS-80
- Haier XIB 6B2D3FB
- Candy BCTDH7A1TE
- Candy CCE4T620EWU
- Candy CIS633SCTTWIFI
- Candy CSOE C10DE-80
- Candy RO44 1286DWMC4-07
- Candy ROE H9A3TCEX-S
- Candy RPW41066BWMR/1-S
- Hoover H-WASH 500
- Hoover H-DRY 500
- Hoover H7W4 48MBC-S
- Hoover H9A3TCBEXS-S
- Hoover HFB 6B2S3FX
- Hoover HLE C10DCE-80
- Hoover HSOT3161WG
- Hoover HW 68AMC/1-80
- Hoover HWPD 69AMBC/1-S
- Hoover HWPS4954DAMR-11
- Hoover NDE H10A2TCE-80
- Hoover NDE H9A2TSBEXS-S
- Hoover NDPHY10A2TCBEXSS
## Contribute ## Contribute
Want to help us to support more appliances? Or add more sensors? Or help with translating? Or beautify some icons or captions? Want to help us to support more appliances? Or add more sensors? Or help with translating? Or beautify some icons or captions?

View file

@ -248,6 +248,7 @@ NAMES = {
"freezer": "REF.ZONES.FREEZER", "freezer": "REF.ZONES.FREEZER",
"oven": "GLOBALS.APPLIANCES_NAME.OV", "oven": "GLOBALS.APPLIANCES_NAME.OV",
}, },
"fan": {"air_extraction": "HO.DASHBOARD.AIR_EXTRACTION_TITLE"},
} }

View file

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