"""Szenenauswahl eines ninstrip.""" from __future__ import annotations from homeassistant.components.select import SelectEntity from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .coordinator import NinstripConfigEntry, NinstripCoordinator from .entity import NinstripEntity # Wird angezeigt, wenn keine Szene aufgeschaltet ist oder jemand die Segmente # seit dem Aufschalten veraendert hat. NONE_OPTION = "—" async def async_setup_entry( hass: HomeAssistant, entry: NinstripConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: async_add_entities([NinstripPresetSelect(entry.runtime_data)]) class NinstripPresetSelect(NinstripEntity, SelectEntity): """Waehlt eine der belegten Szenen aus.""" _attr_translation_key = "preset" _attr_icon = "mdi:playlist-play" def __init__(self, coordinator: NinstripCoordinator) -> None: super().__init__(coordinator, "preset") def _used(self) -> list[dict]: presets = self.coordinator.data.presets.get("presets") or [] return [p for p in presets if p.get("used")] @property def options(self) -> list[str]: return [NONE_OPTION] + [str(p.get("name") or f"Szene {p['id'] + 1}") for p in self._used()] @property def current_option(self) -> str: """Nach einer Aenderung an den Segmenten passt keine Szene mehr - dann '—'.""" state = self.coordinator.data.state if state.get("preset_modified"): return NONE_OPTION aktiv = state.get("preset") if aktiv is None: return NONE_OPTION for p in self._used(): if p.get("id") == aktiv: return str(p.get("name") or f"Szene {aktiv + 1}") return NONE_OPTION async def async_select_option(self, option: str) -> None: if option == NONE_OPTION: # Es gibt kein "Szene abwaehlen" - das Gegenstueck ist Ausschalten. await self.coordinator.async_set_state(on=False) return for p in self._used(): name = str(p.get("name") or f"Szene {p['id'] + 1}") if name == option: index = int(p["id"]) await self.coordinator.async_call(lambda c: c.apply_preset(index)) await self.coordinator.async_after_change() return