Files
srv-docker/homeassistant/config/custom_components/midea_dehumidifier_lan/switch.py
2026-03-07 17:28:59 +00:00

183 lines
5.0 KiB
Python

"""Support for different Midea appliances switches"""
from dataclasses import dataclass
from typing import Final
from homeassistant.components.switch import SwitchEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from custom_components.midea_dehumidifier_lan.hub import (
Hub,
)
from custom_components.midea_dehumidifier_lan.appliance_coordinator import (
ApplianceEntity,
ApplianceUpdateCoordinator,
)
from custom_components.midea_dehumidifier_lan.const import (
ENTITY_DISABLED_BY_DEFAULT,
DOMAIN,
UNIQUE_CLIMATE_PREFIX,
UNIQUE_DEHUMIDIFIER_PREFIX,
)
from custom_components.midea_dehumidifier_lan.util import is_enabled_by_capabilities
@dataclass
class _MideaSwitchDescriptor:
attr: str
name: str
icon: str
capability: str
prefix: str
ION_MODE_SWITCH: Final = _MideaSwitchDescriptor(
attr="ion_mode",
name="Ion Mode",
icon="mdi:air-purifier",
capability="ion",
prefix=UNIQUE_DEHUMIDIFIER_PREFIX,
)
PUMP_SWITCH: Final = _MideaSwitchDescriptor(
attr="pump",
name="Pump",
icon="mdi:pump",
capability="pump",
prefix=UNIQUE_DEHUMIDIFIER_PREFIX,
)
PUMP_SWITCH_ENABLED: Final = _MideaSwitchDescriptor(
attr="pump_enabled",
name="Pump Enabled",
icon="mdi:electric-switch",
capability="pump",
prefix=UNIQUE_DEHUMIDIFIER_PREFIX,
)
DEHUMIDIFIER_BEEP_SWITCH: Final = _MideaSwitchDescriptor(
attr="beep_prompt",
name="Beep",
icon="mdi:bell-check",
capability=ENTITY_DISABLED_BY_DEFAULT,
prefix=UNIQUE_DEHUMIDIFIER_PREFIX,
)
DEHUMIDIFER_SWITCHES: Final = [
DEHUMIDIFIER_BEEP_SWITCH,
ION_MODE_SWITCH,
PUMP_SWITCH,
PUMP_SWITCH_ENABLED,
]
# Climate
CLIMATE_BEEP_SWITCH: Final = _MideaSwitchDescriptor(
attr="beep_prompt",
name="Beep",
icon="mdi:bell-check",
capability=ENTITY_DISABLED_BY_DEFAULT,
prefix=UNIQUE_CLIMATE_PREFIX,
)
FAHRENHEIT_SWITCH: Final = _MideaSwitchDescriptor(
attr="fahrenheit",
name="Fahrenheit",
icon="mdi:temperature-fahrenheit",
capability="fahrenheit",
prefix=UNIQUE_CLIMATE_PREFIX,
)
DRYER_SWITCH: Final = _MideaSwitchDescriptor(
attr="dryer",
name="Dry Mode",
icon="mdi:water-opacity",
capability="_DISABLED_BY_DEFAULT",
prefix=UNIQUE_CLIMATE_PREFIX,
)
PURIFIER_SWITCH: Final = _MideaSwitchDescriptor(
attr="purifier",
name="Purifier",
icon="mdi:air-purifier",
capability="anion",
prefix=UNIQUE_CLIMATE_PREFIX,
)
TURBO_FAN_SWITCH: Final = _MideaSwitchDescriptor(
attr="turbo_fan",
name="Turbo Fan",
icon="mdi:fan-alert",
capability="strong_fan",
prefix=UNIQUE_CLIMATE_PREFIX,
)
# SCREEN_SWITCH: Final = _MideaSwitchDescriptor(
# attr="show_screen",
# name="Show Screen",
# icon="mdi:clock-digital",
# capability="screen_display",
# prefix=UNIQUE_CLIMATE_PREFIX,
# )
CLIMATE_SWITCHES: Final = [
CLIMATE_BEEP_SWITCH,
DRYER_SWITCH,
FAHRENHEIT_SWITCH,
# SCREEN_SWITCH,
PURIFIER_SWITCH,
TURBO_FAN_SWITCH,
]
def _is_enabled(
coordinator: ApplianceUpdateCoordinator, switch: _MideaSwitchDescriptor
) -> bool:
return is_enabled_by_capabilities(
coordinator.appliance.state.capabilities, switch.capability
)
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Sets up appliance switches"""
hub: Hub = hass.data[DOMAIN][config_entry.entry_id]
switches = []
# Dehumidifier sensors
for switch in DEHUMIDIFER_SWITCHES:
for coord in hub.coordinators:
if coord.is_dehumidifier() and _is_enabled(coord, switch):
switches.append(MideaSwitch(coord, switch))
# Air conditioner entities
for switch in CLIMATE_SWITCHES:
for coord in hub.coordinators:
if coord.is_climate() and _is_enabled(coord, switch):
switches.append(MideaSwitch(coord, switch))
async_add_entities(switches)
# pylint: disable=too-many-ancestors
class MideaSwitch(ApplianceEntity, SwitchEntity):
"""Generic attr based switch"""
def __init__(
self,
coordinator: ApplianceUpdateCoordinator,
descriptor: _MideaSwitchDescriptor,
) -> None:
self._switch_descriptor = descriptor
self._capability_attr = descriptor.capability
self._unique_id_prefix = descriptor.prefix
self._name_suffix = " " + descriptor.name.strip()
super().__init__(coordinator)
self._attr_icon = descriptor.icon
self._attribute_name = descriptor.attr
def on_update(self) -> None:
self._attr_is_on = getattr(self.appliance.state, self._attribute_name, None)
def turn_on(self, **kwargs) -> None:
"""Turn the entity on."""
self.apply(self._attribute_name, True)
def turn_off(self, **kwargs) -> None:
"""Turn the entity off."""
self.apply(self._attribute_name, False)