"""Number platform for LED Screen Controller (device & KC target brightness).""" from __future__ import annotations import logging from typing import Any from homeassistant.components.number import NumberEntity, NumberMode from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity from .const import DOMAIN, DATA_COORDINATOR, TARGET_TYPE_KEY_COLORS from .coordinator import WLEDScreenControllerCoordinator _LOGGER = logging.getLogger(__name__) async def async_setup_entry( hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Set up LED Screen Controller brightness numbers.""" data = hass.data[DOMAIN][entry.entry_id] coordinator: WLEDScreenControllerCoordinator = data[DATA_COORDINATOR] entities = [] if coordinator.data and "targets" in coordinator.data: devices = coordinator.data.get("devices") or {} for target_id, target_data in coordinator.data["targets"].items(): info = target_data["info"] if info.get("target_type") == TARGET_TYPE_KEY_COLORS: # KC target — brightness lives in key_colors_settings entities.append( WLEDScreenControllerKCBrightness( coordinator, target_id, entry.entry_id, ) ) continue # LED target — brightness lives on the device device_id = info.get("device_id", "") if not device_id: continue device_data = devices.get(device_id) if not device_data: continue capabilities = device_data.get("info", {}).get("capabilities") or [] if "brightness_control" not in capabilities or "static_color" in capabilities: continue entities.append( WLEDScreenControllerBrightness( coordinator, target_id, device_id, entry.entry_id, ) ) async_add_entities(entities) class WLEDScreenControllerBrightness(CoordinatorEntity, NumberEntity): """Brightness control for an LED device associated with a target.""" _attr_has_entity_name = True _attr_native_min_value = 0 _attr_native_max_value = 255 _attr_native_step = 1 _attr_mode = NumberMode.SLIDER _attr_icon = "mdi:brightness-6" def __init__( self, coordinator: WLEDScreenControllerCoordinator, target_id: str, device_id: str, entry_id: str, ) -> None: """Initialize the brightness number.""" super().__init__(coordinator) self._target_id = target_id self._device_id = device_id self._entry_id = entry_id self._attr_unique_id = f"{target_id}_brightness" self._attr_translation_key = "brightness" @property def device_info(self) -> dict[str, Any]: """Return device information.""" return {"identifiers": {(DOMAIN, self._target_id)}} @property def native_value(self) -> float | None: """Return the current brightness value.""" if not self.coordinator.data: return None device_data = self.coordinator.data.get("devices", {}).get(self._device_id) if not device_data: return None return device_data.get("brightness") @property def available(self) -> bool: """Return if entity is available.""" if not self.coordinator.data: return False targets = self.coordinator.data.get("targets", {}) devices = self.coordinator.data.get("devices", {}) return self._target_id in targets and self._device_id in devices async def async_set_native_value(self, value: float) -> None: """Set brightness value.""" await self.coordinator.set_brightness(self._device_id, int(value)) class WLEDScreenControllerKCBrightness(CoordinatorEntity, NumberEntity): """Brightness control for a Key Colors target.""" _attr_has_entity_name = True _attr_native_min_value = 0 _attr_native_max_value = 255 _attr_native_step = 1 _attr_mode = NumberMode.SLIDER _attr_icon = "mdi:brightness-6" def __init__( self, coordinator: WLEDScreenControllerCoordinator, target_id: str, entry_id: str, ) -> None: """Initialize the KC brightness number.""" super().__init__(coordinator) self._target_id = target_id self._entry_id = entry_id self._attr_unique_id = f"{target_id}_brightness" self._attr_translation_key = "brightness" @property def device_info(self) -> dict[str, Any]: """Return device information.""" return {"identifiers": {(DOMAIN, self._target_id)}} @property def native_value(self) -> float | None: """Return the current brightness value (0-255).""" if not self.coordinator.data: return None target_data = self.coordinator.data.get("targets", {}).get(self._target_id) if not target_data: return None kc_settings = target_data.get("info", {}).get("key_colors_settings") or {} brightness_float = kc_settings.get("brightness", 1.0) return round(brightness_float * 255) @property def available(self) -> bool: """Return if entity is available.""" if not self.coordinator.data: return False return self._target_id in self.coordinator.data.get("targets", {}) async def async_set_native_value(self, value: float) -> None: """Set brightness value.""" await self.coordinator.set_kc_brightness(self._target_id, int(value))