"""Support for 1-Wire environment select entities.""" from datetime import timedelta import os from typing import override from homeassistant.components.select import SelectEntity, SelectEntityDescription from homeassistant.const import EntityCategory from homeassistant.core import HomeAssistant from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .entity import OneWireEntity from .onewirehub import ( SIGNAL_NEW_DEVICE_CONNECTED, OneWireConfigEntry, OneWireHub, OWDeviceDescription, ) # the library uses non-persistent connections # and concurrent access to the bus is managed by the server PARALLEL_UPDATES = 0 SCAN_INTERVAL = timedelta(seconds=30) ENTITY_DESCRIPTIONS: dict[str, tuple[SelectEntityDescription, ...]] = { "28": ( SelectEntityDescription( key="tempres", entity_category=EntityCategory.CONFIG, options=["9", "10", "11", "12"], translation_key="tempres", entity_registry_enabled_default=False, ), ), } async def async_setup_entry( hass: HomeAssistant, config_entry: OneWireConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up 1-Wire platform.""" async def _add_entities( hub: OneWireHub, devices: list[OWDeviceDescription] ) -> None: """Add 1-Wire entities for all devices.""" if not devices: return async_add_entities(get_entities(hub, devices), True) hub = config_entry.runtime_data await _add_entities(hub, hub.devices) config_entry.async_on_unload( async_dispatcher_connect(hass, SIGNAL_NEW_DEVICE_CONNECTED, _add_entities) ) def get_entities( onewire_hub: OneWireHub, devices: list[OWDeviceDescription] ) -> list[OneWireSelectEntity]: """Get a list of entities.""" entities: list[OneWireSelectEntity] = [] for device in devices: family = device.family device_id = device.id device_info = device.device_info if family not in ENTITY_DESCRIPTIONS: continue for description in ENTITY_DESCRIPTIONS[family]: device_file = os.path.join(os.path.split(device.path)[0], description.key) entities.append( OneWireSelectEntity( description=description, device_id=device_id, device_file=device_file, device_info=device_info, owproxy=onewire_hub.owproxy, ) ) return entities class OneWireSelectEntity(OneWireEntity, SelectEntity): """Implementation of a 1-Wire switch.""" @property @override def current_option(self) -> str | None: """Return the selected entity option to represent the entity state.""" return self._state @override async def async_select_option(self, option: str) -> None: """Change the selected option.""" await self._write_value(option.encode("ascii"))