From 64b588165268b9fb96112540f9dd09d3ffcfc3dd Mon Sep 17 00:00:00 2001 From: Michael <35783820+mib1185@users.noreply.github.com> Date: Sat, 4 May 2024 21:19:50 +0200 Subject: [PATCH] Store runtime data inside the config entry in OpenWeatherMap (#116788) --- .../components/openweathermap/__init__.py | 42 +++++++++---------- .../components/openweathermap/const.py | 2 - .../components/openweathermap/sensor.py | 12 +++--- .../components/openweathermap/weather.py | 12 +++--- 4 files changed, 31 insertions(+), 37 deletions(-) diff --git a/homeassistant/components/openweathermap/__init__.py b/homeassistant/components/openweathermap/__init__.py index ad99416e448..f740bf6c551 100644 --- a/homeassistant/components/openweathermap/__init__.py +++ b/homeassistant/components/openweathermap/__init__.py @@ -2,6 +2,7 @@ from __future__ import annotations +from dataclasses import dataclass import logging from typing import Any @@ -21,20 +22,28 @@ from homeassistant.core import HomeAssistant from .const import ( CONFIG_FLOW_VERSION, - DOMAIN, - ENTRY_NAME, - ENTRY_WEATHER_COORDINATOR, FORECAST_MODE_FREE_DAILY, FORECAST_MODE_ONECALL_DAILY, PLATFORMS, - UPDATE_LISTENER, ) from .weather_update_coordinator import WeatherUpdateCoordinator _LOGGER = logging.getLogger(__name__) +OpenweathermapConfigEntry = ConfigEntry["OpenweathermapData"] -async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: + +@dataclass +class OpenweathermapData: + """Runtime data definition.""" + + name: str + coordinator: WeatherUpdateCoordinator + + +async def async_setup_entry( + hass: HomeAssistant, entry: OpenweathermapConfigEntry +) -> bool: """Set up OpenWeatherMap as config entry.""" name = entry.data[CONF_NAME] api_key = entry.data[CONF_API_KEY] @@ -52,17 +61,12 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: await weather_coordinator.async_config_entry_first_refresh() - hass.data.setdefault(DOMAIN, {}) - hass.data[DOMAIN][entry.entry_id] = { - ENTRY_NAME: name, - ENTRY_WEATHER_COORDINATOR: weather_coordinator, - } + entry.async_on_unload(entry.add_update_listener(async_update_options)) + + entry.runtime_data = OpenweathermapData(name, weather_coordinator) await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) - update_listener = entry.add_update_listener(async_update_options) - hass.data[DOMAIN][entry.entry_id][UPDATE_LISTENER] = update_listener - return True @@ -93,15 +97,11 @@ async def async_update_options(hass: HomeAssistant, entry: ConfigEntry) -> None: await hass.config_entries.async_reload(entry.entry_id) -async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: +async def async_unload_entry( + hass: HomeAssistant, entry: OpenweathermapConfigEntry +) -> bool: """Unload a config entry.""" - unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) - if unload_ok: - update_listener = hass.data[DOMAIN][entry.entry_id][UPDATE_LISTENER] - update_listener() - hass.data[DOMAIN].pop(entry.entry_id) - - return unload_ok + return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) def _get_config_value(config_entry: ConfigEntry, key: str) -> Any: diff --git a/homeassistant/components/openweathermap/const.py b/homeassistant/components/openweathermap/const.py index dbd536a2556..cae21e8f054 100644 --- a/homeassistant/components/openweathermap/const.py +++ b/homeassistant/components/openweathermap/const.py @@ -26,8 +26,6 @@ DEFAULT_LANGUAGE = "en" ATTRIBUTION = "Data provided by OpenWeatherMap" MANUFACTURER = "OpenWeather" CONFIG_FLOW_VERSION = 2 -ENTRY_NAME = "name" -ENTRY_WEATHER_COORDINATOR = "weather_coordinator" ATTR_API_PRECIPITATION = "precipitation" ATTR_API_PRECIPITATION_KIND = "precipitation_kind" ATTR_API_DATETIME = "datetime" diff --git a/homeassistant/components/openweathermap/sensor.py b/homeassistant/components/openweathermap/sensor.py index 16d9c3064d7..70b21324b46 100644 --- a/homeassistant/components/openweathermap/sensor.py +++ b/homeassistant/components/openweathermap/sensor.py @@ -10,7 +10,6 @@ from homeassistant.components.sensor import ( SensorEntityDescription, SensorStateClass, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( DEGREE, PERCENTAGE, @@ -29,6 +28,7 @@ from homeassistant.helpers.typing import StateType from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from homeassistant.util import dt as dt_util +from . import OpenweathermapConfigEntry from .const import ( ATTR_API_CLOUDS, ATTR_API_CONDITION, @@ -57,8 +57,6 @@ from .const import ( ATTRIBUTION, DEFAULT_NAME, DOMAIN, - ENTRY_NAME, - ENTRY_WEATHER_COORDINATOR, MANUFACTURER, ) from .weather_update_coordinator import WeatherUpdateCoordinator @@ -222,13 +220,13 @@ FORECAST_SENSOR_TYPES: tuple[SensorEntityDescription, ...] = ( async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: OpenweathermapConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Set up OpenWeatherMap sensor entities based on a config entry.""" - domain_data = hass.data[DOMAIN][config_entry.entry_id] - name = domain_data[ENTRY_NAME] - weather_coordinator = domain_data[ENTRY_WEATHER_COORDINATOR] + domain_data = config_entry.runtime_data + name = domain_data.name + weather_coordinator = domain_data.coordinator entities: list[AbstractOpenWeatherMapSensor] = [ OpenWeatherMapSensor( diff --git a/homeassistant/components/openweathermap/weather.py b/homeassistant/components/openweathermap/weather.py index 62bf18ba813..406b1c8ad4b 100644 --- a/homeassistant/components/openweathermap/weather.py +++ b/homeassistant/components/openweathermap/weather.py @@ -21,7 +21,6 @@ from homeassistant.components.weather import ( SingleCoordinatorWeatherEntity, WeatherEntityFeature, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( UnitOfPrecipitationDepth, UnitOfPressure, @@ -32,6 +31,7 @@ from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback +from . import OpenweathermapConfigEntry from .const import ( ATTR_API_CLOUDS, ATTR_API_CONDITION, @@ -59,8 +59,6 @@ from .const import ( ATTRIBUTION, DEFAULT_NAME, DOMAIN, - ENTRY_NAME, - ENTRY_WEATHER_COORDINATOR, FORECAST_MODE_DAILY, FORECAST_MODE_ONECALL_DAILY, MANUFACTURER, @@ -85,13 +83,13 @@ FORECAST_MAP = { async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: OpenweathermapConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Set up OpenWeatherMap weather entity based on a config entry.""" - domain_data = hass.data[DOMAIN][config_entry.entry_id] - name = domain_data[ENTRY_NAME] - weather_coordinator = domain_data[ENTRY_WEATHER_COORDINATOR] + domain_data = config_entry.runtime_data + name = domain_data.name + weather_coordinator = domain_data.coordinator unique_id = f"{config_entry.unique_id}" owm_weather = OpenWeatherMapWeather(name, unique_id, weather_coordinator)