mirror of
https://github.com/home-assistant/core.git
synced 2026-09-06 05:22:44 +01:00
164 lines
4.8 KiB
Python
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)
|