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

84 lines
2.7 KiB
Python

"""Support for Synology DSM select entities."""
from dataclasses import dataclass
from typing import override
from synology_dsm.api.core.hardware import FanSpeed, SynoCoreHardware
from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import SynoApi
from .coordinator import SynologyDSMCentralUpdateCoordinator, SynologyDSMConfigEntry
from .entity import SynologyDSMBaseEntity, SynologyDSMEntityDescription
FAN_SPEED_MAP = {
FanSpeed.QUIET_STOP: "low_power",
FanSpeed.QUIET: "quiet",
FanSpeed.COOL: "cool",
FanSpeed.FULL: "full_speed",
}
FAN_SPEED_MAP_INVERSE = {v: k for k, v in FAN_SPEED_MAP.items()}
@dataclass(frozen=True, kw_only=True)
class SynologyDSMSelectEntityDescription(
SynologyDSMEntityDescription, SelectEntityDescription
):
"""Describes Synology DSM select entity."""
async def async_setup_entry(
hass: HomeAssistant,
entry: SynologyDSMConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set select entities for device."""
data = entry.runtime_data
if data.api.hardware is not None:
async_add_entities(
[SynologyDSMFanSpeedMode(data.api, data.coordinator_central)]
)
class SynologyDSMFanSpeedMode(
SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator], SelectEntity
):
"""Represent a Synology DSM fan speed mode select entity."""
entity_description: SynologyDSMSelectEntityDescription
def __init__(
self,
api: SynoApi,
coordinator: SynologyDSMCentralUpdateCoordinator,
) -> None:
"""Initialize a Synology DSM select entity."""
description = SynologyDSMSelectEntityDescription(
api_key=SynoCoreHardware.API_KEY,
key="fan_speed_mode",
translation_key="fan_speed_mode",
entity_category=EntityCategory.CONFIG,
)
self._attr_options = [
val
for fs, val in FAN_SPEED_MAP.items()
if fs in api.dsm.hardware.supported_fan_speeds
]
super().__init__(api, coordinator, description)
@property
@override
def current_option(self) -> str | None:
"""Return the selected entity option to represent the entity state."""
return FAN_SPEED_MAP[self._api.dsm.hardware.fan_speed]
@override
async def async_select_option(self, option: str) -> None:
"""Set the fan speed mode."""
await self._api.dsm.hardware.set_fan_speed(FAN_SPEED_MAP_INVERSE[option])
await self._api.dsm.hardware.update()
self.async_write_ha_state()