diff --git a/homeassistant/components/aemet/__init__.py b/homeassistant/components/aemet/__init__.py index f019325fb79..da536fb9f8c 100644 --- a/homeassistant/components/aemet/__init__.py +++ b/homeassistant/components/aemet/__init__.py @@ -1,5 +1,6 @@ """The AEMET OpenData component.""" +from dataclasses import dataclass import logging from aemet_opendata.exceptions import AemetError, TownNotFound @@ -11,19 +12,23 @@ from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import aiohttp_client -from .const import ( - CONF_STATION_UPDATES, - DOMAIN, - ENTRY_NAME, - ENTRY_WEATHER_COORDINATOR, - PLATFORMS, -) +from .const import CONF_STATION_UPDATES, PLATFORMS from .coordinator import WeatherUpdateCoordinator _LOGGER = logging.getLogger(__name__) +AemetConfigEntry = ConfigEntry["AemetData"] -async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: + +@dataclass +class AemetData: + """Aemet runtime data.""" + + name: str + coordinator: WeatherUpdateCoordinator + + +async def async_setup_entry(hass: HomeAssistant, entry: AemetConfigEntry) -> bool: """Set up AEMET OpenData as config entry.""" name = entry.data[CONF_NAME] api_key = entry.data[CONF_API_KEY] @@ -44,11 +49,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: weather_coordinator = WeatherUpdateCoordinator(hass, aemet) 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.runtime_data = AemetData(name=name, coordinator=weather_coordinator) await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) @@ -64,9 +65,4 @@ async def async_update_options(hass: HomeAssistant, entry: ConfigEntry) -> None: 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 + return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) diff --git a/homeassistant/components/aemet/const.py b/homeassistant/components/aemet/const.py index 337b7e0790c..665075c4093 100644 --- a/homeassistant/components/aemet/const.py +++ b/homeassistant/components/aemet/const.py @@ -55,8 +55,6 @@ CONF_STATION_UPDATES = "station_updates" PLATFORMS = [Platform.SENSOR, Platform.WEATHER] DEFAULT_NAME = "AEMET" DOMAIN = "aemet" -ENTRY_NAME = "name" -ENTRY_WEATHER_COORDINATOR = "weather_coordinator" ATTR_API_CONDITION = "condition" ATTR_API_FORECAST_CONDITION = "condition" diff --git a/homeassistant/components/aemet/diagnostics.py b/homeassistant/components/aemet/diagnostics.py index 20b6c208514..cc39d1adc32 100644 --- a/homeassistant/components/aemet/diagnostics.py +++ b/homeassistant/components/aemet/diagnostics.py @@ -7,7 +7,6 @@ from typing import Any from aemet_opendata.const import AOD_COORDS from homeassistant.components.diagnostics.util import async_redact_data -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( CONF_API_KEY, CONF_LATITUDE, @@ -16,8 +15,7 @@ from homeassistant.const import ( ) from homeassistant.core import HomeAssistant -from .const import DOMAIN, ENTRY_WEATHER_COORDINATOR -from .coordinator import WeatherUpdateCoordinator +from . import AemetConfigEntry TO_REDACT_CONFIG = [ CONF_API_KEY, @@ -32,11 +30,10 @@ TO_REDACT_COORD = [ async def async_get_config_entry_diagnostics( - hass: HomeAssistant, config_entry: ConfigEntry + hass: HomeAssistant, config_entry: AemetConfigEntry ) -> dict[str, Any]: """Return diagnostics for a config entry.""" - aemet_entry = hass.data[DOMAIN][config_entry.entry_id] - coordinator: WeatherUpdateCoordinator = aemet_entry[ENTRY_WEATHER_COORDINATOR] + coordinator = config_entry.runtime_data.coordinator return { "api_data": coordinator.aemet.raw_data(), diff --git a/homeassistant/components/aemet/sensor.py b/homeassistant/components/aemet/sensor.py index 0952af19d43..268112070e8 100644 --- a/homeassistant/components/aemet/sensor.py +++ b/homeassistant/components/aemet/sensor.py @@ -56,6 +56,7 @@ from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.util import dt as dt_util +from . import AemetConfigEntry from .const import ( ATTR_API_CONDITION, ATTR_API_FORECAST_CONDITION, @@ -87,9 +88,6 @@ from .const import ( ATTR_API_WIND_SPEED, ATTRIBUTION, CONDITIONS_MAP, - DOMAIN, - ENTRY_NAME, - ENTRY_WEATHER_COORDINATOR, ) from .coordinator import WeatherUpdateCoordinator from .entity import AemetEntity @@ -360,13 +358,13 @@ WEATHER_SENSORS: Final[tuple[AemetSensorEntityDescription, ...]] = ( async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: AemetConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Set up AEMET OpenData sensor entities based on a config entry.""" - domain_data = hass.data[DOMAIN][config_entry.entry_id] - name: str = domain_data[ENTRY_NAME] - coordinator: WeatherUpdateCoordinator = domain_data[ENTRY_WEATHER_COORDINATOR] + domain_data = config_entry.runtime_data + name = domain_data.name + coordinator = domain_data.coordinator async_add_entities( AemetSensor( diff --git a/homeassistant/components/aemet/weather.py b/homeassistant/components/aemet/weather.py index 0d5abdcf967..4df0b1081f5 100644 --- a/homeassistant/components/aemet/weather.py +++ b/homeassistant/components/aemet/weather.py @@ -18,7 +18,6 @@ from homeassistant.components.weather import ( SingleCoordinatorWeatherEntity, WeatherEntityFeature, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( UnitOfPrecipitationDepth, UnitOfPressure, @@ -28,32 +27,24 @@ from homeassistant.const import ( from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .const import ( - ATTRIBUTION, - CONDITIONS_MAP, - DOMAIN, - ENTRY_NAME, - ENTRY_WEATHER_COORDINATOR, -) +from . import AemetConfigEntry +from .const import ATTRIBUTION, CONDITIONS_MAP from .coordinator import WeatherUpdateCoordinator from .entity import AemetEntity async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: AemetConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Set up AEMET OpenData weather entity based on a config entry.""" - domain_data = hass.data[DOMAIN][config_entry.entry_id] - weather_coordinator = domain_data[ENTRY_WEATHER_COORDINATOR] + domain_data = config_entry.runtime_data + name = domain_data.name + weather_coordinator = domain_data.coordinator async_add_entities( - [ - AemetWeather( - domain_data[ENTRY_NAME], config_entry.unique_id, weather_coordinator - ) - ], + [AemetWeather(name, config_entry.unique_id, weather_coordinator)], False, ) diff --git a/tests/components/aemet/test_diagnostics.py b/tests/components/aemet/test_diagnostics.py index f57ff8e89a1..0d94995a85b 100644 --- a/tests/components/aemet/test_diagnostics.py +++ b/tests/components/aemet/test_diagnostics.py @@ -23,7 +23,6 @@ async def test_config_entry_diagnostics( """Test config entry diagnostics.""" await async_init_integration(hass) - assert hass.data[DOMAIN] config_entry = hass.config_entries.async_entries(DOMAIN)[0] with patch( diff --git a/tests/components/aemet/util.py b/tests/components/aemet/util.py index 81a184864a4..e6c468ec5fa 100644 --- a/tests/components/aemet/util.py +++ b/tests/components/aemet/util.py @@ -5,7 +5,7 @@ from unittest.mock import patch from aemet_opendata.const import ATTR_DATA -from homeassistant.components.aemet import DOMAIN +from homeassistant.components.aemet.const import DOMAIN from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME from homeassistant.core import HomeAssistant