1
0
mirror of https://github.com/home-assistant/core.git synced 2026-07-08 23:34:22 +01:00
Files
core/homeassistant/components/switchbot/select.py
T
2026-06-30 10:25:37 +02:00

123 lines
4.3 KiB
Python

"""Select platform for SwitchBot."""
from datetime import timedelta
import logging
from typing import override
import switchbot
from switchbot import NightLightState, SwitchbotOperationError
from homeassistant.components.select import SelectEntity
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .coordinator import SwitchbotConfigEntry, SwitchbotDataUpdateCoordinator
from .entity import SwitchbotEntity, exception_handler
_LOGGER = logging.getLogger(__name__)
PARALLEL_UPDATES = 0
SCAN_INTERVAL = timedelta(days=7)
TIME_FORMAT_12H = "12h"
TIME_FORMAT_24H = "24h"
TIME_FORMAT_OPTIONS = [TIME_FORMAT_12H, TIME_FORMAT_24H]
async def async_setup_entry(
hass: HomeAssistant,
entry: SwitchbotConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up SwitchBot select platform."""
coordinator = entry.runtime_data
if isinstance(coordinator.device, switchbot.SwitchbotMeterProCO2):
async_add_entities([SwitchBotMeterProCO2TimeFormatSelect(coordinator)], True)
elif isinstance(coordinator.device, switchbot.SwitchbotStandingFan):
async_add_entities([SwitchBotStandingFanNightLightSelect(coordinator)])
class SwitchBotMeterProCO2TimeFormatSelect(SwitchbotEntity, SelectEntity):
"""Select entity to set time display format on Meter Pro CO2."""
_attr_should_poll = True
_attr_entity_registry_enabled_default = False
_device: switchbot.SwitchbotMeterProCO2
_attr_entity_category = EntityCategory.CONFIG
_attr_translation_key = "time_format"
_attr_options = TIME_FORMAT_OPTIONS
def __init__(self, coordinator: SwitchbotDataUpdateCoordinator) -> None:
"""Initialize the select entity."""
super().__init__(coordinator)
self._attr_unique_id = f"{coordinator.base_unique_id}_time_format"
@exception_handler
@override
async def async_select_option(self, option: str) -> None:
"""Change the time display format."""
_LOGGER.debug("Setting time format to %s for %s", option, self._address)
is_12h_mode = option == TIME_FORMAT_12H
await self._device.set_time_display_format(is_12h_mode)
self._attr_current_option = option
self.async_write_ha_state()
@override
async def async_update(self) -> None:
"""Fetch the latest time format from the device."""
try:
device_time = await self._device.get_datetime()
except SwitchbotOperationError:
_LOGGER.debug(
"Failed to update time format for %s", self._address, exc_info=True
)
return
self._attr_current_option = (
TIME_FORMAT_12H if device_time["12h_mode"] else TIME_FORMAT_24H
)
NIGHT_LIGHT_OFF = "off"
NIGHT_LIGHT_LEVEL_1 = "level_1"
NIGHT_LIGHT_LEVEL_2 = "level_2"
NIGHT_LIGHT_OPTIONS = [NIGHT_LIGHT_OFF, NIGHT_LIGHT_LEVEL_1, NIGHT_LIGHT_LEVEL_2]
NIGHT_LIGHT_TO_STATE: dict[str, NightLightState] = {
NIGHT_LIGHT_OFF: NightLightState.OFF,
NIGHT_LIGHT_LEVEL_1: NightLightState.LEVEL_1,
NIGHT_LIGHT_LEVEL_2: NightLightState.LEVEL_2,
}
NIGHT_LIGHT_FROM_STATE: dict[int, str] = {
state.value: option for option, state in NIGHT_LIGHT_TO_STATE.items()
}
class SwitchBotStandingFanNightLightSelect(SwitchbotEntity, SelectEntity):
"""Select entity for night light on Standing Fan."""
_device: switchbot.SwitchbotStandingFan
_attr_entity_category = EntityCategory.CONFIG
_attr_translation_key = "night_light"
_attr_options = NIGHT_LIGHT_OPTIONS
def __init__(self, coordinator: SwitchbotDataUpdateCoordinator) -> None:
"""Initialize the select entity."""
super().__init__(coordinator)
self._attr_unique_id = f"{coordinator.base_unique_id}_night_light"
@property
@override
def current_option(self) -> str | None:
"""Return current night light state."""
state = self._device.get_night_light_state()
if state is None:
return None
return NIGHT_LIGHT_FROM_STATE.get(state)
@exception_handler
@override
async def async_select_option(self, option: str) -> None:
"""Set night light state."""
await self._device.set_night_light(NIGHT_LIGHT_TO_STATE[option])
self.async_write_ha_state()