"""Select platform for SwitchBot.""" from __future__ import annotations from datetime import timedelta import logging import switchbot from switchbot.devices.device import 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) 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 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() 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 )