From dfa3fddd355de065b92de56cc41d91ca2066336e Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 23 Jun 2025 19:09:38 +0200 Subject: [PATCH] Migrate livisi to use runtime_data (#147352) --- homeassistant/components/livisi/__init__.py | 19 ++++++------------- .../components/livisi/binary_sensor.py | 13 ++++++------- homeassistant/components/livisi/climate.py | 10 ++++------ .../components/livisi/coordinator.py | 6 ++++-- homeassistant/components/livisi/entity.py | 5 ++--- homeassistant/components/livisi/switch.py | 11 +++++------ 6 files changed, 27 insertions(+), 37 deletions(-) diff --git a/homeassistant/components/livisi/__init__.py b/homeassistant/components/livisi/__init__.py index fc9e381a1c3..befbe6858ef 100644 --- a/homeassistant/components/livisi/__init__.py +++ b/homeassistant/components/livisi/__init__.py @@ -8,19 +8,18 @@ from aiohttp import ClientConnectorError from livisi.aiolivisi import AioLivisi from homeassistant import core -from homeassistant.config_entries import ConfigEntry from homeassistant.const import Platform from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import aiohttp_client, device_registry as dr from .const import DOMAIN -from .coordinator import LivisiDataUpdateCoordinator +from .coordinator import LivisiConfigEntry, LivisiDataUpdateCoordinator PLATFORMS: Final = [Platform.BINARY_SENSOR, Platform.CLIMATE, Platform.SWITCH] -async def async_setup_entry(hass: core.HomeAssistant, entry: ConfigEntry) -> bool: +async def async_setup_entry(hass: core.HomeAssistant, entry: LivisiConfigEntry) -> bool: """Set up Livisi Smart Home from a config entry.""" web_session = aiohttp_client.async_get_clientsession(hass) aiolivisi = AioLivisi(web_session) @@ -31,7 +30,7 @@ async def async_setup_entry(hass: core.HomeAssistant, entry: ConfigEntry) -> boo except ClientConnectorError as exception: raise ConfigEntryNotReady from exception - hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator + entry.runtime_data = coordinator device_registry = dr.async_get(hass) device_registry.async_get_or_create( config_entry_id=entry.entry_id, @@ -45,16 +44,10 @@ async def async_setup_entry(hass: core.HomeAssistant, entry: ConfigEntry) -> boo entry.async_create_background_task( hass, coordinator.ws_connect(), "livisi-ws_connect" ) + entry.async_on_unload(coordinator.websocket.disconnect) return True -async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: +async def async_unload_entry(hass: HomeAssistant, entry: LivisiConfigEntry) -> bool: """Unload a config entry.""" - coordinator = hass.data[DOMAIN][entry.entry_id] - - unload_success = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) - await coordinator.websocket.disconnect() - if unload_success: - hass.data[DOMAIN].pop(entry.entry_id) - - return unload_success + return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) diff --git a/homeassistant/components/livisi/binary_sensor.py b/homeassistant/components/livisi/binary_sensor.py index 50eb4cd28b9..ea61e7741b8 100644 --- a/homeassistant/components/livisi/binary_sensor.py +++ b/homeassistant/components/livisi/binary_sensor.py @@ -8,23 +8,22 @@ from homeassistant.components.binary_sensor import ( BinarySensorDeviceClass, BinarySensorEntity, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback -from .const import DOMAIN, LIVISI_STATE_CHANGE, LOGGER, WDS_DEVICE_TYPE -from .coordinator import LivisiDataUpdateCoordinator +from .const import LIVISI_STATE_CHANGE, LOGGER, WDS_DEVICE_TYPE +from .coordinator import LivisiConfigEntry, LivisiDataUpdateCoordinator from .entity import LivisiEntity async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: LivisiConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up binary_sensor device.""" - coordinator: LivisiDataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id] + coordinator = config_entry.runtime_data known_devices = set() @callback @@ -53,7 +52,7 @@ class LivisiBinarySensor(LivisiEntity, BinarySensorEntity): def __init__( self, - config_entry: ConfigEntry, + config_entry: LivisiConfigEntry, coordinator: LivisiDataUpdateCoordinator, device: dict[str, Any], capability_name: str, @@ -86,7 +85,7 @@ class LivisiWindowDoorSensor(LivisiBinarySensor): def __init__( self, - config_entry: ConfigEntry, + config_entry: LivisiConfigEntry, coordinator: LivisiDataUpdateCoordinator, device: dict[str, Any], ) -> None: diff --git a/homeassistant/components/livisi/climate.py b/homeassistant/components/livisi/climate.py index 1f5e3360c7d..05539043d74 100644 --- a/homeassistant/components/livisi/climate.py +++ b/homeassistant/components/livisi/climate.py @@ -11,7 +11,6 @@ from homeassistant.components.climate import ( ClimateEntityFeature, HVACMode, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature from homeassistant.core import HomeAssistant, callback from homeassistant.exceptions import HomeAssistantError @@ -19,24 +18,23 @@ from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .const import ( - DOMAIN, LIVISI_STATE_CHANGE, LOGGER, MAX_TEMPERATURE, MIN_TEMPERATURE, VRCC_DEVICE_TYPE, ) -from .coordinator import LivisiDataUpdateCoordinator +from .coordinator import LivisiConfigEntry, LivisiDataUpdateCoordinator from .entity import LivisiEntity async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: LivisiConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up climate device.""" - coordinator: LivisiDataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id] + coordinator = config_entry.runtime_data @callback def handle_coordinator_update() -> None: @@ -71,7 +69,7 @@ class LivisiClimate(LivisiEntity, ClimateEntity): def __init__( self, - config_entry: ConfigEntry, + config_entry: LivisiConfigEntry, coordinator: LivisiDataUpdateCoordinator, device: dict[str, Any], ) -> None: diff --git a/homeassistant/components/livisi/coordinator.py b/homeassistant/components/livisi/coordinator.py index 6557416ed3a..8d490dca952 100644 --- a/homeassistant/components/livisi/coordinator.py +++ b/homeassistant/components/livisi/coordinator.py @@ -26,14 +26,16 @@ from .const import ( LOGGER, ) +type LivisiConfigEntry = ConfigEntry[LivisiDataUpdateCoordinator] + class LivisiDataUpdateCoordinator(DataUpdateCoordinator[list[dict[str, Any]]]): """Class to manage fetching LIVISI data API.""" - config_entry: ConfigEntry + config_entry: LivisiConfigEntry def __init__( - self, hass: HomeAssistant, config_entry: ConfigEntry, aiolivisi: AioLivisi + self, hass: HomeAssistant, config_entry: LivisiConfigEntry, aiolivisi: AioLivisi ) -> None: """Initialize my coordinator.""" super().__init__( diff --git a/homeassistant/components/livisi/entity.py b/homeassistant/components/livisi/entity.py index af588b0e360..79af35c1f8c 100644 --- a/homeassistant/components/livisi/entity.py +++ b/homeassistant/components/livisi/entity.py @@ -7,14 +7,13 @@ from typing import Any from livisi.const import CAPABILITY_MAP -from homeassistant.config_entries import ConfigEntry from homeassistant.core import callback from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.update_coordinator import CoordinatorEntity from .const import DOMAIN, LIVISI_REACHABILITY_CHANGE -from .coordinator import LivisiDataUpdateCoordinator +from .coordinator import LivisiConfigEntry, LivisiDataUpdateCoordinator class LivisiEntity(CoordinatorEntity[LivisiDataUpdateCoordinator]): @@ -24,7 +23,7 @@ class LivisiEntity(CoordinatorEntity[LivisiDataUpdateCoordinator]): def __init__( self, - config_entry: ConfigEntry, + config_entry: LivisiConfigEntry, coordinator: LivisiDataUpdateCoordinator, device: dict[str, Any], *, diff --git a/homeassistant/components/livisi/switch.py b/homeassistant/components/livisi/switch.py index 5599a4af0d4..e053923f551 100644 --- a/homeassistant/components/livisi/switch.py +++ b/homeassistant/components/livisi/switch.py @@ -5,24 +5,23 @@ from __future__ import annotations from typing import Any from homeassistant.components.switch import SwitchEntity -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback -from .const import DOMAIN, LIVISI_STATE_CHANGE, LOGGER, SWITCH_DEVICE_TYPES -from .coordinator import LivisiDataUpdateCoordinator +from .const import LIVISI_STATE_CHANGE, LOGGER, SWITCH_DEVICE_TYPES +from .coordinator import LivisiConfigEntry, LivisiDataUpdateCoordinator from .entity import LivisiEntity async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: LivisiConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up switch device.""" - coordinator: LivisiDataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id] + coordinator = config_entry.runtime_data @callback def handle_coordinator_update() -> None: @@ -52,7 +51,7 @@ class LivisiSwitch(LivisiEntity, SwitchEntity): def __init__( self, - config_entry: ConfigEntry, + config_entry: LivisiConfigEntry, coordinator: LivisiDataUpdateCoordinator, device: dict[str, Any], ) -> None: