Reformat with black

This commit is contained in:
Andre Basche 2023-04-10 19:51:16 +02:00
parent 4901be4050
commit 907bc44533
10 changed files with 133 additions and 85 deletions

View file

@ -28,7 +28,9 @@ CONFIG_SCHEMA = vol.Schema(
async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry): async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry):
session = aiohttp_client.async_get_clientsession(hass) session = aiohttp_client.async_get_clientsession(hass)
hon = await Hon(entry.data["email"], entry.data["password"], session=session).create() hon = await Hon(
entry.data["email"], entry.data["password"], session=session
).create()
hass.data.setdefault(DOMAIN, {}) hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][entry.unique_id] = hon hass.data[DOMAIN][entry.unique_id] = hon
hass.data[DOMAIN]["coordinators"] = {} hass.data[DOMAIN]["coordinators"] = {}

View file

@ -3,8 +3,11 @@ from dataclasses import dataclass
from pyhon import Hon from pyhon import Hon
from homeassistant.components.binary_sensor import BinarySensorEntityDescription, BinarySensorDeviceClass, \ from homeassistant.components.binary_sensor import (
BinarySensorEntity BinarySensorEntityDescription,
BinarySensorDeviceClass,
BinarySensorEntity,
)
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import callback from homeassistant.core import callback
from .const import DOMAIN from .const import DOMAIN
@ -19,7 +22,9 @@ class HonBinarySensorEntityDescriptionMixin:
@dataclass @dataclass
class HonBinarySensorEntityDescription(HonBinarySensorEntityDescriptionMixin, BinarySensorEntityDescription): class HonBinarySensorEntityDescription(
HonBinarySensorEntityDescriptionMixin, BinarySensorEntityDescription
):
pass pass
@ -30,7 +35,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = {
name="Remote Control", name="Remote Control",
device_class=BinarySensorDeviceClass.CONNECTIVITY, device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="CONNECTED", on_value="CONNECTED",
icon="mdi:remote" icon="mdi:remote",
), ),
HonBinarySensorEntityDescription( HonBinarySensorEntityDescription(
key="doorLockStatus", key="doorLockStatus",
@ -65,7 +70,7 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = {
name="Remote Control", name="Remote Control",
device_class=BinarySensorDeviceClass.CONNECTIVITY, device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="CONNECTED", on_value="CONNECTED",
icon="mdi:remote" icon="mdi:remote",
), ),
HonBinarySensorEntityDescription( HonBinarySensorEntityDescription(
key="startProgram.prewash", key="startProgram.prewash",
@ -102,21 +107,21 @@ BINARY_SENSORS: dict[str, tuple[HonBinarySensorEntityDescription, ...]] = {
name="Online", name="Online",
device_class=BinarySensorDeviceClass.CONNECTIVITY, device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="CONNECTED", on_value="CONNECTED",
icon="mdi:wifi" icon="mdi:wifi",
), ),
HonBinarySensorEntityDescription( HonBinarySensorEntityDescription(
key="attributes.parameters.remoteCtrValid", key="attributes.parameters.remoteCtrValid",
name="On", name="On",
device_class=BinarySensorDeviceClass.CONNECTIVITY, device_class=BinarySensorDeviceClass.CONNECTIVITY,
on_value="1", on_value="1",
icon="mdi:remote" icon="mdi:remote",
), ),
HonBinarySensorEntityDescription( HonBinarySensorEntityDescription(
key="attributes.parameters.onOffStatus", key="attributes.parameters.onOffStatus",
name="On", name="On",
device_class=BinarySensorDeviceClass.RUNNING, device_class=BinarySensorDeviceClass.RUNNING,
on_value="1", on_value="1",
icon="mdi:power-cycle" icon="mdi:power-cycle",
), ),
), ),
} }
@ -137,10 +142,16 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
if descriptions := BINARY_SENSORS.get(device.appliance_type): if descriptions := BINARY_SENSORS.get(device.appliance_type):
for description in descriptions: for description in descriptions:
if not device.get(description.key): if not device.get(description.key):
_LOGGER.warning("[%s] Can't setup %s", device.appliance_type, description.key) _LOGGER.warning(
"[%s] Can't setup %s", device.appliance_type, description.key
)
continue continue
appliances.extend([ appliances.extend(
HonBinarySensorEntity(hass, coordinator, entry, device, description)] [
HonBinarySensorEntity(
hass, coordinator, entry, device, description
)
]
) )
async_add_entities(appliances) async_add_entities(appliances)
@ -159,9 +170,15 @@ class HonBinarySensorEntity(HonEntity, BinarySensorEntity):
@property @property
def is_on(self) -> bool: def is_on(self) -> bool:
return self._device.get(self.entity_description.key, "") == self.entity_description.on_value return (
self._device.get(self.entity_description.key, "")
== self.entity_description.on_value
)
@callback @callback
def _handle_coordinator_update(self): def _handle_coordinator_update(self):
self._attr_native_value = self._device.get(self.entity_description.key, "") == self.entity_description.on_value self._attr_native_value = (
self._device.get(self.entity_description.key, "")
== self.entity_description.on_value
)
self.async_write_ha_state() self.async_write_ha_state()

View file

@ -38,15 +38,17 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
for description in descriptions: for description in descriptions:
if not device.commands.get(description.key): if not device.commands.get(description.key):
continue continue
appliances.extend([ appliances.extend(
HonButtonEntity(hass, coordinator, entry, device, description)] [HonButtonEntity(hass, coordinator, entry, device, description)]
) )
async_add_entities(appliances) async_add_entities(appliances)
class HonButtonEntity(HonEntity, ButtonEntity): class HonButtonEntity(HonEntity, ButtonEntity):
def __init__(self, hass, coordinator, entry, device: HonAppliance, description) -> None: def __init__(
self, hass, coordinator, entry, device: HonAppliance, description
) -> None:
super().__init__(hass, entry, coordinator, device) super().__init__(hass, entry, coordinator, device)
self._coordinator = coordinator self._coordinator = coordinator

View file

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

View file

@ -29,7 +29,9 @@ class HonEntity(CoordinatorEntity):
return DeviceInfo( return DeviceInfo(
identifiers={(DOMAIN, self._device.mac_address)}, identifiers={(DOMAIN, self._device.mac_address)},
manufacturer=self._device.get("brand", ""), manufacturer=self._device.get("brand", ""),
name=self._device.nick_name if self._device.nick_name else self._device.model_name, name=self._device.nick_name
if self._device.nick_name
else self._device.model_name,
model=self._device.model_name, model=self._device.model_name,
sw_version=self._device.get("fwVersion", ""), sw_version=self._device.get("fwVersion", ""),
) )
@ -38,7 +40,12 @@ class HonEntity(CoordinatorEntity):
class HonCoordinator(DataUpdateCoordinator): class HonCoordinator(DataUpdateCoordinator):
def __init__(self, hass, device: HonAppliance): def __init__(self, hass, device: HonAppliance):
"""Initialize my coordinator.""" """Initialize my coordinator."""
super().__init__(hass, _LOGGER, name=device.mac_address, update_interval=timedelta(seconds=30)) super().__init__(
hass,
_LOGGER,
name=device.mac_address,
update_interval=timedelta(seconds=30),
)
self._device = device self._device = device
async def _async_update_data(self): async def _async_update_data(self):

View file

@ -9,4 +9,3 @@
"requirements": ["pyhOn==0.6.2"], "requirements": ["pyhOn==0.6.2"],
"version": "0.5.0-beta.3" "version": "0.5.0-beta.3"
} }

View file

@ -22,20 +22,20 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = {
name="Delay Time", name="Delay Time",
icon="mdi:timer-plus", icon="mdi:timer-plus",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=UnitOfTime.MINUTES native_unit_of_measurement=UnitOfTime.MINUTES,
), ),
NumberEntityDescription( NumberEntityDescription(
key="startProgram.rinseIterations", key="startProgram.rinseIterations",
name="Rinse Iterations", name="Rinse Iterations",
icon="mdi:rotate-right", icon="mdi:rotate-right",
entity_category=EntityCategory.CONFIG entity_category=EntityCategory.CONFIG,
), ),
NumberEntityDescription( NumberEntityDescription(
key="startProgram.mainWashTime", key="startProgram.mainWashTime",
name="Main Wash Time", name="Main Wash Time",
icon="mdi:clock-start", icon="mdi:clock-start",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=UnitOfTime.MINUTES native_unit_of_measurement=UnitOfTime.MINUTES,
), ),
), ),
"TD": ( "TD": (
@ -44,34 +44,34 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = {
name="Delay time", name="Delay time",
icon="mdi:timer-plus", icon="mdi:timer-plus",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=UnitOfTime.MINUTES native_unit_of_measurement=UnitOfTime.MINUTES,
), ),
NumberEntityDescription( NumberEntityDescription(
key="startProgram.dryLevel", key="startProgram.dryLevel",
name="Dry level", name="Dry level",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
icon="mdi:hair-dryer", icon="mdi:hair-dryer",
translation_key="tumbledryerdrylevel" translation_key="tumbledryerdrylevel",
), ),
NumberEntityDescription( NumberEntityDescription(
key="startProgram.tempLevel", key="startProgram.tempLevel",
name="Temperature level", name="Temperature level",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
icon="mdi:thermometer", icon="mdi:thermometer",
translation_key="tumbledryertemplevel" translation_key="tumbledryertemplevel",
), ),
NumberEntityDescription( NumberEntityDescription(
key="startProgram.antiCreaseTime", key="startProgram.antiCreaseTime",
name="Anti-Crease time", name="Anti-Crease time",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
icon="mdi:timer", icon="mdi:timer",
native_unit_of_measurement=UnitOfTime.MINUTES native_unit_of_measurement=UnitOfTime.MINUTES,
), ),
NumberEntityDescription( NumberEntityDescription(
key="startProgram.sterilizationStatus", key="startProgram.sterilizationStatus",
name="Sterilization status", name="Sterilization status",
icon="mdi:clock-start", icon="mdi:clock-start",
entity_category=EntityCategory.CONFIG entity_category=EntityCategory.CONFIG,
), ),
), ),
"WD": ( "WD": (
@ -80,7 +80,7 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = {
name="Delay Time", name="Delay Time",
icon="mdi:timer-plus", icon="mdi:timer-plus",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=UnitOfTime.MINUTES native_unit_of_measurement=UnitOfTime.MINUTES,
), ),
), ),
"OV": ( "OV": (
@ -89,22 +89,21 @@ NUMBERS: dict[str, tuple[NumberEntityDescription, ...]] = {
name="Delay time", name="Delay time",
icon="mdi:timer-plus", icon="mdi:timer-plus",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=UnitOfTime.MINUTES native_unit_of_measurement=UnitOfTime.MINUTES,
), ),
NumberEntityDescription( NumberEntityDescription(
key="startProgram.tempSel", key="startProgram.tempSel",
name="Target Temperature", name="Target Temperature",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
icon="mdi:thermometer", icon="mdi:thermometer",
native_unit_of_measurement=UnitOfTemperature.CELSIUS native_unit_of_measurement=UnitOfTemperature.CELSIUS,
), ),
NumberEntityDescription( NumberEntityDescription(
key="startProgram.prTime", key="startProgram.prTime",
name="Program Duration", name="Program Duration",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
icon="mdi:timelapse", icon="mdi:timelapse",
native_unit_of_measurement=UnitOfTime.MINUTES native_unit_of_measurement=UnitOfTime.MINUTES,
), ),
), ),
} }
@ -126,8 +125,8 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
for description in descriptions: for description in descriptions:
if not device.settings.get(description.key): if not device.settings.get(description.key):
continue continue
appliances.extend([ appliances.extend(
HonNumberEntity(hass, coordinator, entry, device, description)] [HonNumberEntity(hass, coordinator, entry, device, description)]
) )
async_add_entities(appliances) async_add_entities(appliances)

View file

@ -24,20 +24,20 @@ SELECTS = {
name="Spin speed", name="Spin speed",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
icon="mdi:numeric", icon="mdi:numeric",
unit_of_measurement=REVOLUTIONS_PER_MINUTE unit_of_measurement=REVOLUTIONS_PER_MINUTE,
), ),
SelectEntityDescription( SelectEntityDescription(
key="startProgram.temp", key="startProgram.temp",
name="Temperature", name="Temperature",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
icon="mdi:thermometer", icon="mdi:thermometer",
unit_of_measurement=UnitOfTemperature.CELSIUS unit_of_measurement=UnitOfTemperature.CELSIUS,
), ),
SelectEntityDescription( SelectEntityDescription(
key="startProgram.program", key="startProgram.program",
name="Program", name="Program",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
translation_key="programs" translation_key="programs",
), ),
), ),
"TD": ( "TD": (
@ -45,14 +45,14 @@ SELECTS = {
key="startProgram.program", key="startProgram.program",
name="Program", name="Program",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
translation_key="programs" translation_key="programs",
), ),
SelectEntityDescription( SelectEntityDescription(
key="startProgram.dryTimeMM", key="startProgram.dryTimeMM",
name="Time", name="Time",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
icon="mdi:timer", icon="mdi:timer",
unit_of_measurement=UnitOfTime.MINUTES unit_of_measurement=UnitOfTime.MINUTES,
), ),
), ),
"WD": ( "WD": (
@ -60,7 +60,7 @@ SELECTS = {
key="startProgram.program", key="startProgram.program",
name="Program", name="Program",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
translation_key="programs" translation_key="programs",
), ),
), ),
"OV": ( "OV": (
@ -72,7 +72,7 @@ SELECTS = {
SelectEntityDescription( SelectEntityDescription(
key="startProgram.preheatStatus", key="startProgram.preheatStatus",
name="Preheat", name="Preheat",
entity_category=EntityCategory.CONFIG entity_category=EntityCategory.CONFIG,
), ),
), ),
} }
@ -94,14 +94,16 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
for description in descriptions: for description in descriptions:
if not device.settings.get(description.key): if not device.settings.get(description.key):
continue continue
appliances.extend([ appliances.extend(
HonSelectEntity(hass, coordinator, entry, device, description)] [HonSelectEntity(hass, coordinator, entry, device, description)]
) )
async_add_entities(appliances) async_add_entities(appliances)
class HonSelectEntity(HonEntity, SelectEntity): class HonSelectEntity(HonEntity, SelectEntity):
def __init__(self, hass, coordinator, entry, device: HonAppliance, description) -> None: def __init__(
self, hass, coordinator, entry, device: HonAppliance, description
) -> None:
super().__init__(hass, entry, coordinator, device) super().__init__(hass, entry, coordinator, device)
self._coordinator = coordinator self._coordinator = coordinator
@ -128,7 +130,9 @@ class HonSelectEntity(HonEntity, SelectEntity):
@callback @callback
def _handle_coordinator_update(self): def _handle_coordinator_update(self):
setting = self._device.settings[self.entity_description.key] setting = self._device.settings[self.entity_description.key]
if not isinstance(self._device.settings[self.entity_description.key], HonParameterFixed): if not isinstance(
self._device.settings[self.entity_description.key], HonParameterFixed
):
self._attr_options: list[str] = setting.values self._attr_options: list[str] = setting.values
else: else:
self._attr_options = [setting.value] self._attr_options = [setting.value]

View file

@ -16,7 +16,7 @@ from homeassistant.const import (
UnitOfMass, UnitOfMass,
UnitOfPower, UnitOfPower,
UnitOfTime, UnitOfTime,
UnitOfTemperature UnitOfTemperature,
) )
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.entity import EntityCategory
@ -34,20 +34,20 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
name="Total Power", name="Total Power",
device_class=SensorDeviceClass.ENERGY, device_class=SensorDeviceClass.ENERGY,
state_class=SensorStateClass.TOTAL_INCREASING, state_class=SensorStateClass.TOTAL_INCREASING,
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
), ),
SensorEntityDescription( SensorEntityDescription(
key="totalWaterUsed", key="totalWaterUsed",
name="Total Water", name="Total Water",
device_class=SensorDeviceClass.WATER, device_class=SensorDeviceClass.WATER,
state_class=SensorStateClass.TOTAL_INCREASING, state_class=SensorStateClass.TOTAL_INCREASING,
native_unit_of_measurement=UnitOfVolume.LITERS native_unit_of_measurement=UnitOfVolume.LITERS,
), ),
SensorEntityDescription( SensorEntityDescription(
key="totalWashCycle", key="totalWashCycle",
name="Total Wash Cycle", name="Total Wash Cycle",
state_class=SensorStateClass.TOTAL_INCREASING, state_class=SensorStateClass.TOTAL_INCREASING,
icon="mdi:counter" icon="mdi:counter",
), ),
SensorEntityDescription( SensorEntityDescription(
key="currentElectricityUsed", key="currentElectricityUsed",
@ -55,13 +55,13 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.POWER, device_class=SensorDeviceClass.POWER,
native_unit_of_measurement=UnitOfPower.KILO_WATT, native_unit_of_measurement=UnitOfPower.KILO_WATT,
icon="mdi:lightning-bolt" icon="mdi:lightning-bolt",
), ),
SensorEntityDescription( SensorEntityDescription(
key="currentWaterUsed", key="currentWaterUsed",
name="Current Water Used", name="Current Water Used",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
icon="mdi:water" icon="mdi:water",
), ),
SensorEntityDescription( SensorEntityDescription(
key="startProgram.weight", key="startProgram.weight",
@ -69,19 +69,16 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=UnitOfMass.KILOGRAMS, native_unit_of_measurement=UnitOfMass.KILOGRAMS,
icon="mdi:weight-kilogram" icon="mdi:weight-kilogram",
), ),
SensorEntityDescription( SensorEntityDescription(
key="machMode", key="machMode",
name="Machine Status", name="Machine Status",
icon="mdi:information", icon="mdi:information",
translation_key="mode" translation_key="mode",
), ),
SensorEntityDescription( SensorEntityDescription(
key="errors", key="errors", name="Error", icon="mdi:math-log", translation_key="errors"
name="Error",
icon="mdi:math-log",
translation_key="errors"
), ),
SensorEntityDescription( SensorEntityDescription(
key="remainingTimeMM", key="remainingTimeMM",
@ -103,13 +100,10 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
key="machMode", key="machMode",
name="Machine Status", name="Machine Status",
icon="mdi:information", icon="mdi:information",
translation_key="mode" translation_key="mode",
), ),
SensorEntityDescription( SensorEntityDescription(
key="errors", key="errors", name="Error", icon="mdi:math-log", translation_key="errors"
name="Error",
icon="mdi:math-log",
translation_key="errors"
), ),
SensorEntityDescription( SensorEntityDescription(
key="remainingTimeMM", key="remainingTimeMM",
@ -129,25 +123,25 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
key="prCode", key="prCode",
name="Program", name="Program",
icon="mdi:tumble-dryer", icon="mdi:tumble-dryer",
translation_key="tumbledryerprogram" translation_key="tumbledryerprogram",
), ),
SensorEntityDescription( SensorEntityDescription(
key="prPhase", key="prPhase",
name="Program Phase", name="Program Phase",
icon="mdi:tumble-dryer", icon="mdi:tumble-dryer",
translation_key="tumbledryerprogramphase" translation_key="tumbledryerprogramphase",
), ),
SensorEntityDescription( SensorEntityDescription(
key="dryLevel", key="dryLevel",
name="Dry level", name="Dry level",
icon="mdi:hair-dryer", icon="mdi:hair-dryer",
translation_key="tumbledryerdrylevel" translation_key="tumbledryerdrylevel",
), ),
SensorEntityDescription( SensorEntityDescription(
key="tempLevel", key="tempLevel",
name="Temperature level", name="Temperature level",
icon="mdi:thermometer", icon="mdi:thermometer",
translation_key="tumbledryertemplevel" translation_key="tumbledryertemplevel",
), ),
), ),
"WD": ( "WD": (
@ -155,7 +149,7 @@ SENSORS: dict[str, tuple[SensorEntityDescription, ...]] = {
key="machMode", key="machMode",
name="Machine Status", name="Machine Status",
icon="mdi:information", icon="mdi:information",
translation_key="mode" translation_key="mode",
), ),
SensorEntityDescription( SensorEntityDescription(
key="spinSpeed", key="spinSpeed",
@ -245,10 +239,12 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
if descriptions := SENSORS.get(device.appliance_type): if descriptions := SENSORS.get(device.appliance_type):
for description in descriptions: for description in descriptions:
if not device.get(description.key): if not device.get(description.key):
_LOGGER.warning("[%s] Can't setup %s", device.appliance_type, description.key) _LOGGER.warning(
"[%s] Can't setup %s", device.appliance_type, description.key
)
continue continue
appliances.extend([ appliances.extend(
HonSensorEntity(hass, coordinator, entry, device, description)] [HonSensorEntity(hass, coordinator, entry, device, description)]
) )
async_add_entities(appliances) async_add_entities(appliances)

View file

@ -22,8 +22,8 @@ class HonSwitchEntityDescriptionMixin:
@dataclass @dataclass
class HonSwitchEntityDescription(HonSwitchEntityDescriptionMixin, class HonSwitchEntityDescription(
SwitchEntityDescription HonSwitchEntityDescriptionMixin, SwitchEntityDescription
): ):
pass pass
@ -48,13 +48,13 @@ SWITCHES: dict[str, tuple[HonSwitchEntityDescription, ...]] = {
key="startProgram.delayStatus", key="startProgram.delayStatus",
name="Delay Status", name="Delay Status",
icon="mdi:timer-check", icon="mdi:timer-check",
entity_category=EntityCategory.CONFIG entity_category=EntityCategory.CONFIG,
), ),
HonSwitchEntityDescription( HonSwitchEntityDescription(
key="startProgram.haier_SoakPrewashSelection", key="startProgram.haier_SoakPrewashSelection",
name="Soak Prewash Selection", name="Soak Prewash Selection",
icon="mdi:tshirt-crew", icon="mdi:tshirt-crew",
entity_category=EntityCategory.CONFIG entity_category=EntityCategory.CONFIG,
), ),
), ),
"TD": ( "TD": (
@ -106,12 +106,17 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
if descriptions := SWITCHES.get(device.appliance_type): if descriptions := SWITCHES.get(device.appliance_type):
for description in descriptions: for description in descriptions:
if device.get(description.key) is not None or device.commands.get(description.key) is not None: if (
appliances.extend([ device.get(description.key) is not None
HonSwitchEntity(hass, coordinator, entry, device, description)] or device.commands.get(description.key) is not None
):
appliances.extend(
[HonSwitchEntity(hass, coordinator, entry, device, description)]
) )
else: else:
_LOGGER.warning("[%s] Can't setup %s", device.appliance_type, description.key) _LOGGER.warning(
"[%s] Can't setup %s", device.appliance_type, description.key
)
async_add_entities(appliances) async_add_entities(appliances)
@ -119,7 +124,14 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
class HonSwitchEntity(HonEntity, SwitchEntity): class HonSwitchEntity(HonEntity, SwitchEntity):
entity_description: HonSwitchEntityDescription entity_description: HonSwitchEntityDescription
def __init__(self, hass, coordinator, entry, device: HonAppliance, description: HonSwitchEntityDescription) -> None: def __init__(
self,
hass,
coordinator,
entry,
device: HonAppliance,
description: HonSwitchEntityDescription,
) -> None:
super().__init__(hass, entry, coordinator, device) super().__init__(hass, entry, coordinator, device)
self._coordinator = coordinator self._coordinator = coordinator
self._device = device self._device = device
@ -128,7 +140,9 @@ class HonSwitchEntity(HonEntity, SwitchEntity):
def available(self) -> bool: def available(self) -> bool:
if self.entity_category == EntityCategory.CONFIG: if self.entity_category == EntityCategory.CONFIG:
return self._device.settings[self.entity_description.key].typology != "fixed" return (
self._device.settings[self.entity_description.key].typology != "fixed"
)
return True return True
@property @property
@ -136,7 +150,11 @@ class HonSwitchEntity(HonEntity, SwitchEntity):
"""Return True if entity is on.""" """Return True if entity is on."""
if self.entity_category == EntityCategory.CONFIG: if self.entity_category == EntityCategory.CONFIG:
setting = self._device.settings[self.entity_description.key] setting = self._device.settings[self.entity_description.key]
return setting.value == "1" or hasattr(setting, "min") and setting.value != setting.min return (
setting.value == "1"
or hasattr(setting, "min")
and setting.value != setting.min
)
return self._device.get(self.entity_description.key, False) return self._device.get(self.entity_description.key, False)
async def async_turn_on(self, **kwargs: Any) -> None: async def async_turn_on(self, **kwargs: Any) -> None: