"""The WLED Screen Controller integration.""" from __future__ import annotations import logging from datetime import timedelta from urllib.parse import urlparse from homeassistant.config_entries import ConfigEntry from homeassistant.const import Platform, CONF_NAME from homeassistant.core import HomeAssistant from homeassistant.helpers import device_registry as dr from homeassistant.helpers.aiohttp_client import async_get_clientsession from .const import DOMAIN, CONF_SERVER_URL, DEFAULT_SCAN_INTERVAL from .coordinator import WLEDScreenControllerCoordinator _LOGGER = logging.getLogger(__name__) PLATFORMS: list[Platform] = [ Platform.SWITCH, Platform.SENSOR, Platform.SELECT, ] async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up WLED Screen Controller from a config entry.""" server_url = entry.data[CONF_SERVER_URL] server_name = entry.data.get(CONF_NAME, "WLED Screen Controller") session = async_get_clientsession(hass) coordinator = WLEDScreenControllerCoordinator( hass, session, server_url, update_interval=timedelta(seconds=DEFAULT_SCAN_INTERVAL), ) # Fetch initial data await coordinator.async_config_entry_first_refresh() # Create hub device (the server PC) device_registry = dr.async_get(hass) # Parse URL for hub identifier parsed_url = urlparse(server_url) hub_identifier = f"{parsed_url.hostname}:{parsed_url.port or (443 if parsed_url.scheme == 'https' else 80)}" hub_device = device_registry.async_get_or_create( config_entry_id=entry.entry_id, identifiers={(DOMAIN, hub_identifier)}, name=server_name, manufacturer="WLED Screen Controller", model="Server", sw_version=coordinator.server_version, configuration_url=server_url, ) # Create device entries for each WLED device if coordinator.data and "devices" in coordinator.data: for device_id, device_data in coordinator.data["devices"].items(): device_info = device_data["info"] device_registry.async_get_or_create( config_entry_id=entry.entry_id, identifiers={(DOMAIN, device_id)}, name=device_info["name"], manufacturer="WLED", model="Screen Ambient Lighting", sw_version=f"{device_info.get('led_count', 0)} LEDs", via_device=(DOMAIN, hub_identifier), # Link to hub configuration_url=device_info.get("url"), ) # Store coordinator and hub info hass.data.setdefault(DOMAIN, {}) hass.data[DOMAIN][entry.entry_id] = { "coordinator": coordinator, "hub_device_id": hub_device.id, } # Setup platforms await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) return True async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) if unload_ok: hass.data[DOMAIN].pop(entry.entry_id) return unload_ok async def async_reload_entry(hass: HomeAssistant, entry: ConfigEntry) -> None: """Reload config entry.""" await async_unload_entry(hass, entry) await async_setup_entry(hass, entry)