HEX
Server: Apache/2.4.63 (Unix)
System: Linux Synopilou92 4.4.302+ #72806 SMP Mon Jul 21 23:16:00 CST 2025 x86_64
User: pilou92 (1026)
PHP: 8.0.30
Disabled: NONE
Upload Files
File: /volume1/docker/homeassistant2025/custom_components/midea_dehumidifier_lan/switch.py
"""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)