Files
core/homeassistant/components/midea/select.py
T

164 lines
4.8 KiB
Python

"""Select for Midea."""
from dataclasses import dataclass
from typing import override
from midealocal.const import DeviceType
from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .entity import MideaConfigEntry, MideaEntity, midea_api_call
PARALLEL_UPDATES = 0
@dataclass(kw_only=True, frozen=True)
class MideaSelectEntityDescription(SelectEntityDescription):
"""Description for a Midea select entity."""
models: list[DeviceType]
options_attribute: str
"""Device property name returning the list of valid option strings."""
requires_power: bool = False
"""Entity is only operable while the device's ``power`` attribute is on."""
SELECTS: list[MideaSelectEntityDescription] = [
MideaSelectEntityDescription(
key="direction",
translation_key="direction",
models=[DeviceType.X40],
options_attribute="directions",
),
MideaSelectEntityDescription(
key="fan_speed",
translation_key="fan_speed",
models=[DeviceType.A1, DeviceType.FC, DeviceType.FD],
options_attribute="fan_speeds",
),
MideaSelectEntityDescription(
key="water_level_set",
translation_key="water_level_set",
models=[DeviceType.A1],
options_attribute="water_level_sets",
),
MideaSelectEntityDescription(
key="wind_lr_angle",
translation_key="wind_lr_angle",
models=[DeviceType.AC],
options_attribute="wind_lr_angles",
requires_power=True,
),
MideaSelectEntityDescription(
key="wind_ud_angle",
translation_key="wind_ud_angle",
models=[DeviceType.AC],
options_attribute="wind_ud_angles",
requires_power=True,
),
MideaSelectEntityDescription(
key="rate_select",
translation_key="rate_select",
models=[DeviceType.AC],
options_attribute="rate_selects",
requires_power=True,
),
MideaSelectEntityDescription(
key="silent_level",
translation_key="silent_level",
models=[DeviceType.C3],
options_attribute="silent_modes",
),
MideaSelectEntityDescription(
key="oscillation_mode",
translation_key="oscillation_mode",
models=[DeviceType.FA],
options_attribute="oscillation_modes",
),
MideaSelectEntityDescription(
key="oscillation_angle",
translation_key="oscillation_angle",
models=[DeviceType.FA],
options_attribute="oscillation_angles",
),
MideaSelectEntityDescription(
key="tilting_angle",
translation_key="tilting_angle",
models=[DeviceType.FA],
options_attribute="tilting_angles",
),
MideaSelectEntityDescription(
key="detect_mode",
translation_key="detect_mode",
models=[DeviceType.FC],
options_attribute="detect_modes",
),
MideaSelectEntityDescription(
key="mode",
translation_key="mode",
models=[DeviceType.FC],
options_attribute="modes",
),
MideaSelectEntityDescription(
key="screen_display",
translation_key="screen_display",
models=[DeviceType.FC, DeviceType.FD],
options_attribute="screen_displays",
),
]
async def async_setup_entry(
hass: HomeAssistant,
config_entry: MideaConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up selects for device."""
device = config_entry.runtime_data
async_add_entities(
MideaSelect(device, description)
for description in SELECTS
if device.device_type in description.models
and description.key in device.attributes
)
class MideaSelect(MideaEntity, SelectEntity):
"""Represent a Midea select."""
entity_description: MideaSelectEntityDescription
@property
@override
def available(self) -> bool:
"""Return entity availability."""
if not super().available:
return False
if self.entity_description.requires_power:
return bool(self._device.get_attribute("power"))
return True
@property
@override
def options(self) -> list[str]:
"""Return the list of valid options."""
return getattr(self._device, self.entity_description.options_attribute)
@property
@override
def current_option(self) -> str | None:
"""Return the currently selected option."""
value = self._device.get_attribute(self.entity_description.key)
if not isinstance(value, str):
return None
return value
@override
def select_option(self, option: str) -> None:
"""Select an option."""
with midea_api_call():
self._device.set_attribute(attr=self.entity_description.key, value=option)