mirror of
https://github.com/home-assistant/core.git
synced 2026-09-08 06:31:35 +01:00
84 lines
2.7 KiB
Python
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()
|