From acb9d687064034d679f99f4c18c8039cfa122132 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 27 Jan 2025 10:16:33 +0100 Subject: [PATCH] Use runtime_data in dynalite (#136448) * Use runtime_data in dynalite * Delay listener --- homeassistant/components/dynalite/__init__.py | 23 ++++++++----------- homeassistant/components/dynalite/bridge.py | 3 +++ homeassistant/components/dynalite/cover.py | 5 ++-- homeassistant/components/dynalite/entity.py | 7 +++--- homeassistant/components/dynalite/light.py | 4 ++-- homeassistant/components/dynalite/services.py | 6 ++--- homeassistant/components/dynalite/switch.py | 4 ++-- 7 files changed, 24 insertions(+), 28 deletions(-) diff --git a/homeassistant/components/dynalite/__init__.py b/homeassistant/components/dynalite/__init__.py index a1a6a38c8ab..3411882b725 100644 --- a/homeassistant/components/dynalite/__init__.py +++ b/homeassistant/components/dynalite/__init__.py @@ -16,11 +16,11 @@ from .services import setup_services CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) +type DynaliteConfigEntry = ConfigEntry[DynaliteBridge] + async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the Dynalite platform.""" - hass.data[DOMAIN] = {} - setup_services(hass) await async_register_dynalite_frontend(hass) @@ -28,35 +28,30 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: return True -async def async_entry_changed(hass: HomeAssistant, entry: ConfigEntry) -> None: +async def async_entry_changed(hass: HomeAssistant, entry: DynaliteConfigEntry) -> None: """Reload entry since the data has changed.""" LOGGER.debug("Reconfiguring entry %s", entry.data) - bridge = hass.data[DOMAIN][entry.entry_id] + bridge = entry.runtime_data bridge.reload_config(entry.data) LOGGER.debug("Reconfiguring entry finished %s", entry.data) -async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: +async def async_setup_entry(hass: HomeAssistant, entry: DynaliteConfigEntry) -> bool: """Set up a bridge from a config entry.""" LOGGER.debug("Setting up entry %s", entry.data) bridge = DynaliteBridge(hass, convert_config(entry.data)) - # need to do it before the listener - hass.data[DOMAIN][entry.entry_id] = bridge - entry.async_on_unload(entry.add_update_listener(async_entry_changed)) if not await bridge.async_setup(): LOGGER.error("Could not set up bridge for entry %s", entry.data) - hass.data[DOMAIN][entry.entry_id] = None raise ConfigEntryNotReady + entry.runtime_data = bridge + entry.async_on_unload(entry.add_update_listener(async_entry_changed)) await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) return True -async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: +async def async_unload_entry(hass: HomeAssistant, entry: DynaliteConfigEntry) -> bool: """Unload a config entry.""" LOGGER.debug("Unloading entry %s", entry.data) - unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) - if unload_ok: - hass.data[DOMAIN].pop(entry.entry_id) - return unload_ok + return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) diff --git a/homeassistant/components/dynalite/bridge.py b/homeassistant/components/dynalite/bridge.py index 6f090371eee..0e491281619 100644 --- a/homeassistant/components/dynalite/bridge.py +++ b/homeassistant/components/dynalite/bridge.py @@ -16,6 +16,7 @@ from dynalite_devices_lib.dynalite_devices import ( DynaliteNotification, ) +from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_HOST from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_send @@ -23,6 +24,8 @@ from homeassistant.helpers.dispatcher import async_dispatcher_send from .const import ATTR_AREA, ATTR_HOST, ATTR_PACKET, ATTR_PRESET, LOGGER, PLATFORMS from .convert_config import convert_config +type DynaliteConfigEntry = ConfigEntry[DynaliteBridge] + class DynaliteBridge: """Manages a single Dynalite bridge.""" diff --git a/homeassistant/components/dynalite/cover.py b/homeassistant/components/dynalite/cover.py index d7f366d919c..17adf1947ec 100644 --- a/homeassistant/components/dynalite/cover.py +++ b/homeassistant/components/dynalite/cover.py @@ -7,18 +7,17 @@ from homeassistant.components.cover import ( CoverDeviceClass, CoverEntity, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.util.enum import try_parse_enum -from .bridge import DynaliteBridge +from .bridge import DynaliteBridge, DynaliteConfigEntry from .entity import DynaliteBase, async_setup_entry_base async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: DynaliteConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Record the async_add_entities function to add them later when received from Dynalite.""" diff --git a/homeassistant/components/dynalite/entity.py b/homeassistant/components/dynalite/entity.py index 62667dc19c3..7957e9c8515 100644 --- a/homeassistant/components/dynalite/entity.py +++ b/homeassistant/components/dynalite/entity.py @@ -6,27 +6,26 @@ from abc import ABC, abstractmethod from collections.abc import Callable from typing import Any -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.restore_state import RestoreEntity -from .bridge import DynaliteBridge +from .bridge import DynaliteBridge, DynaliteConfigEntry from .const import DOMAIN, LOGGER def async_setup_entry_base( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: DynaliteConfigEntry, async_add_entities: AddEntitiesCallback, platform: str, entity_from_device: Callable, ) -> None: """Record the async_add_entities function to add them later when received from Dynalite.""" LOGGER.debug("Setting up %s entry = %s", platform, config_entry.data) - bridge = hass.data[DOMAIN][config_entry.entry_id] + bridge = config_entry.runtime_data @callback def async_add_entities_platform(devices): diff --git a/homeassistant/components/dynalite/light.py b/homeassistant/components/dynalite/light.py index e0dd8b147aa..ea2bc2bc96f 100644 --- a/homeassistant/components/dynalite/light.py +++ b/homeassistant/components/dynalite/light.py @@ -3,16 +3,16 @@ from typing import Any from homeassistant.components.light import ATTR_BRIGHTNESS, ColorMode, LightEntity -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback +from .bridge import DynaliteConfigEntry from .entity import DynaliteBase, async_setup_entry_base async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: DynaliteConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Record the async_add_entities function to add them later when received from Dynalite.""" diff --git a/homeassistant/components/dynalite/services.py b/homeassistant/components/dynalite/services.py index 14160cced9d..d0d57a582b4 100644 --- a/homeassistant/components/dynalite/services.py +++ b/homeassistant/components/dynalite/services.py @@ -23,9 +23,9 @@ from .const import ( def _get_bridges(service_call: ServiceCall) -> list[DynaliteBridge]: host = service_call.data.get(ATTR_HOST, "") bridges = [ - bridge - for bridge in service_call.hass.data[DOMAIN].values() - if not host or bridge.host == host + entry.runtime_data + for entry in service_call.hass.config_entries.async_loaded_entries(DOMAIN) + if not host or entry.runtime_data.host == host ] LOGGER.debug("Selected bridges for service call: %s", bridges) return bridges diff --git a/homeassistant/components/dynalite/switch.py b/homeassistant/components/dynalite/switch.py index d24a098056a..dd6aad8670c 100644 --- a/homeassistant/components/dynalite/switch.py +++ b/homeassistant/components/dynalite/switch.py @@ -3,17 +3,17 @@ from typing import Any from homeassistant.components.switch import SwitchEntity -from homeassistant.config_entries import ConfigEntry from homeassistant.const import STATE_ON from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback +from .bridge import DynaliteConfigEntry from .entity import DynaliteBase, async_setup_entry_base async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: DynaliteConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Record the async_add_entities function to add them later when received from Dynalite."""