Store runtime data inside the config entry in OpenWeatherMap (#116788)

This commit is contained in:
Michael 2024-05-04 21:19:50 +02:00 committed by GitHub
parent 8bc5a798ca
commit 64b5881652
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 31 additions and 37 deletions

View File

@ -2,6 +2,7 @@
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass
import logging import logging
from typing import Any from typing import Any
@ -21,20 +22,28 @@ from homeassistant.core import HomeAssistant
from .const import ( from .const import (
CONFIG_FLOW_VERSION, CONFIG_FLOW_VERSION,
DOMAIN,
ENTRY_NAME,
ENTRY_WEATHER_COORDINATOR,
FORECAST_MODE_FREE_DAILY, FORECAST_MODE_FREE_DAILY,
FORECAST_MODE_ONECALL_DAILY, FORECAST_MODE_ONECALL_DAILY,
PLATFORMS, PLATFORMS,
UPDATE_LISTENER,
) )
from .weather_update_coordinator import WeatherUpdateCoordinator from .weather_update_coordinator import WeatherUpdateCoordinator
_LOGGER = logging.getLogger(__name__) _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.""" """Set up OpenWeatherMap as config entry."""
name = entry.data[CONF_NAME] name = entry.data[CONF_NAME]
api_key = entry.data[CONF_API_KEY] 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() await weather_coordinator.async_config_entry_first_refresh()
hass.data.setdefault(DOMAIN, {}) entry.async_on_unload(entry.add_update_listener(async_update_options))
hass.data[DOMAIN][entry.entry_id] = {
ENTRY_NAME: name, entry.runtime_data = OpenweathermapData(name, weather_coordinator)
ENTRY_WEATHER_COORDINATOR: weather_coordinator,
}
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) 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 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) 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 a config entry."""
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) return 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
def _get_config_value(config_entry: ConfigEntry, key: str) -> Any: def _get_config_value(config_entry: ConfigEntry, key: str) -> Any:

View File

@ -26,8 +26,6 @@ DEFAULT_LANGUAGE = "en"
ATTRIBUTION = "Data provided by OpenWeatherMap" ATTRIBUTION = "Data provided by OpenWeatherMap"
MANUFACTURER = "OpenWeather" MANUFACTURER = "OpenWeather"
CONFIG_FLOW_VERSION = 2 CONFIG_FLOW_VERSION = 2
ENTRY_NAME = "name"
ENTRY_WEATHER_COORDINATOR = "weather_coordinator"
ATTR_API_PRECIPITATION = "precipitation" ATTR_API_PRECIPITATION = "precipitation"
ATTR_API_PRECIPITATION_KIND = "precipitation_kind" ATTR_API_PRECIPITATION_KIND = "precipitation_kind"
ATTR_API_DATETIME = "datetime" ATTR_API_DATETIME = "datetime"

View File

@ -10,7 +10,6 @@ from homeassistant.components.sensor import (
SensorEntityDescription, SensorEntityDescription,
SensorStateClass, SensorStateClass,
) )
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ( from homeassistant.const import (
DEGREE, DEGREE,
PERCENTAGE, PERCENTAGE,
@ -29,6 +28,7 @@ from homeassistant.helpers.typing import StateType
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
from . import OpenweathermapConfigEntry
from .const import ( from .const import (
ATTR_API_CLOUDS, ATTR_API_CLOUDS,
ATTR_API_CONDITION, ATTR_API_CONDITION,
@ -57,8 +57,6 @@ from .const import (
ATTRIBUTION, ATTRIBUTION,
DEFAULT_NAME, DEFAULT_NAME,
DOMAIN, DOMAIN,
ENTRY_NAME,
ENTRY_WEATHER_COORDINATOR,
MANUFACTURER, MANUFACTURER,
) )
from .weather_update_coordinator import WeatherUpdateCoordinator from .weather_update_coordinator import WeatherUpdateCoordinator
@ -222,13 +220,13 @@ FORECAST_SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: OpenweathermapConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up OpenWeatherMap sensor entities based on a config entry.""" """Set up OpenWeatherMap sensor entities based on a config entry."""
domain_data = hass.data[DOMAIN][config_entry.entry_id] domain_data = config_entry.runtime_data
name = domain_data[ENTRY_NAME] name = domain_data.name
weather_coordinator = domain_data[ENTRY_WEATHER_COORDINATOR] weather_coordinator = domain_data.coordinator
entities: list[AbstractOpenWeatherMapSensor] = [ entities: list[AbstractOpenWeatherMapSensor] = [
OpenWeatherMapSensor( OpenWeatherMapSensor(

View File

@ -21,7 +21,6 @@ from homeassistant.components.weather import (
SingleCoordinatorWeatherEntity, SingleCoordinatorWeatherEntity,
WeatherEntityFeature, WeatherEntityFeature,
) )
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ( from homeassistant.const import (
UnitOfPrecipitationDepth, UnitOfPrecipitationDepth,
UnitOfPressure, UnitOfPressure,
@ -32,6 +31,7 @@ from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import OpenweathermapConfigEntry
from .const import ( from .const import (
ATTR_API_CLOUDS, ATTR_API_CLOUDS,
ATTR_API_CONDITION, ATTR_API_CONDITION,
@ -59,8 +59,6 @@ from .const import (
ATTRIBUTION, ATTRIBUTION,
DEFAULT_NAME, DEFAULT_NAME,
DOMAIN, DOMAIN,
ENTRY_NAME,
ENTRY_WEATHER_COORDINATOR,
FORECAST_MODE_DAILY, FORECAST_MODE_DAILY,
FORECAST_MODE_ONECALL_DAILY, FORECAST_MODE_ONECALL_DAILY,
MANUFACTURER, MANUFACTURER,
@ -85,13 +83,13 @@ FORECAST_MAP = {
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: OpenweathermapConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up OpenWeatherMap weather entity based on a config entry.""" """Set up OpenWeatherMap weather entity based on a config entry."""
domain_data = hass.data[DOMAIN][config_entry.entry_id] domain_data = config_entry.runtime_data
name = domain_data[ENTRY_NAME] name = domain_data.name
weather_coordinator = domain_data[ENTRY_WEATHER_COORDINATOR] weather_coordinator = domain_data.coordinator
unique_id = f"{config_entry.unique_id}" unique_id = f"{config_entry.unique_id}"
owm_weather = OpenWeatherMapWeather(name, unique_id, weather_coordinator) owm_weather = OpenWeatherMapWeather(name, unique_id, weather_coordinator)