"""Select platform for the jvc_projector integration.""" from __future__ import annotations from collections.abc import Awaitable, Callable from dataclasses import dataclass from typing import Final from jvcprojector import JvcProjector, const from homeassistant.components.select import SelectEntity, SelectEntityDescription from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from . import JvcProjectorDataUpdateCoordinator from .const import DOMAIN from .entity import JvcProjectorEntity @dataclass(frozen=True, kw_only=True) class JvcProjectorSelectDescription(SelectEntityDescription): """Describes JVC Projector select entities.""" command: Callable[[JvcProjector, str], Awaitable[None]] OPTIONS: Final[dict[str, dict[str, str]]] = { "input": {const.HDMI1: const.REMOTE_HDMI_1, const.HDMI2: const.REMOTE_HDMI_2} } SELECTS: Final[list[JvcProjectorSelectDescription]] = [ JvcProjectorSelectDescription( key="input", translation_key="input", options=list(OPTIONS["input"]), command=lambda device, option: device.remote(OPTIONS["input"][option]), ) ] async def async_setup_entry( hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Set up the JVC Projector platform from a config entry.""" coordinator: JvcProjectorDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] async_add_entities( JvcProjectorSelectEntity(coordinator, description) for description in SELECTS ) class JvcProjectorSelectEntity(JvcProjectorEntity, SelectEntity): """Representation of a JVC Projector select entity.""" entity_description: JvcProjectorSelectDescription def __init__( self, coordinator: JvcProjectorDataUpdateCoordinator, description: JvcProjectorSelectDescription, ) -> None: """Initialize the entity.""" super().__init__(coordinator) self.entity_description = description self._attr_unique_id = f"{coordinator.unique_id}_{description.key}" @property def current_option(self) -> str | None: """Return the selected entity option to represent the entity state.""" return self.coordinator.data[self.entity_description.key] async def async_select_option(self, option: str) -> None: """Change the selected option.""" await self.entity_description.command(self.coordinator.device, option)