diff --git a/homeassistant/components/openweathermap/__init__.py b/homeassistant/components/openweathermap/__init__.py index 44c5179f227..7aea6aafe20 100644 --- a/homeassistant/components/openweathermap/__init__.py +++ b/homeassistant/components/openweathermap/__init__.py @@ -4,7 +4,6 @@ from __future__ import annotations from dataclasses import dataclass import logging -from typing import Any from pyopenweathermap import OWMClient @@ -22,6 +21,7 @@ from homeassistant.core import HomeAssistant from .const import CONFIG_FLOW_VERSION, OWM_MODE_V25, PLATFORMS from .coordinator import WeatherUpdateCoordinator from .repairs import async_create_issue, async_delete_issue +from .utils import build_data_and_options _LOGGER = logging.getLogger(__name__) @@ -44,8 +44,8 @@ async def async_setup_entry( api_key = entry.data[CONF_API_KEY] latitude = entry.data.get(CONF_LATITUDE, hass.config.latitude) longitude = entry.data.get(CONF_LONGITUDE, hass.config.longitude) - language = _get_config_value(entry, CONF_LANGUAGE) - mode = _get_config_value(entry, CONF_MODE) + language = entry.options[CONF_LANGUAGE] + mode = entry.options[CONF_MODE] if mode == OWM_MODE_V25: async_create_issue(hass, entry.entry_id) @@ -77,10 +77,14 @@ async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: _LOGGER.debug("Migrating OpenWeatherMap entry from version %s", version) - if version < 4: - new_data = {**data, **options, CONF_MODE: OWM_MODE_V25} + if version < 5: + combined_data = {**data, **options, CONF_MODE: OWM_MODE_V25} + new_data, new_options = build_data_and_options(combined_data) config_entries.async_update_entry( - entry, data=new_data, options={}, version=CONFIG_FLOW_VERSION + entry, + data=new_data, + options=new_options, + version=CONFIG_FLOW_VERSION, ) _LOGGER.info("Migration to version %s successful", CONFIG_FLOW_VERSION) @@ -98,9 +102,3 @@ async def async_unload_entry( ) -> bool: """Unload a config entry.""" return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) - - -def _get_config_value(config_entry: ConfigEntry, key: str) -> Any: - if config_entry.options and key in config_entry.options: - return config_entry.options[key] - return config_entry.data[key] diff --git a/homeassistant/components/openweathermap/config_flow.py b/homeassistant/components/openweathermap/config_flow.py index 3090af94979..5fe06ea2dcd 100644 --- a/homeassistant/components/openweathermap/config_flow.py +++ b/homeassistant/components/openweathermap/config_flow.py @@ -30,7 +30,7 @@ from .const import ( LANGUAGES, OWM_MODES, ) -from .utils import validate_api_key +from .utils import build_data_and_options, validate_api_key class OpenWeatherMapConfigFlow(ConfigFlow, domain=DOMAIN): @@ -64,8 +64,9 @@ class OpenWeatherMapConfigFlow(ConfigFlow, domain=DOMAIN): ) if not errors: + data, options = build_data_and_options(user_input) return self.async_create_entry( - title=user_input[CONF_NAME], data=user_input + title=user_input[CONF_NAME], data=data, options=options ) schema = vol.Schema( diff --git a/homeassistant/components/openweathermap/const.py b/homeassistant/components/openweathermap/const.py index c074640ebc7..456ec05b038 100644 --- a/homeassistant/components/openweathermap/const.py +++ b/homeassistant/components/openweathermap/const.py @@ -25,7 +25,7 @@ DEFAULT_NAME = "OpenWeatherMap" DEFAULT_LANGUAGE = "en" ATTRIBUTION = "Data provided by OpenWeatherMap" MANUFACTURER = "OpenWeather" -CONFIG_FLOW_VERSION = 4 +CONFIG_FLOW_VERSION = 5 ATTR_API_PRECIPITATION = "precipitation" ATTR_API_PRECIPITATION_KIND = "precipitation_kind" ATTR_API_DATETIME = "datetime" diff --git a/homeassistant/components/openweathermap/utils.py b/homeassistant/components/openweathermap/utils.py index cbdd1eab815..7f2391b21a1 100644 --- a/homeassistant/components/openweathermap/utils.py +++ b/homeassistant/components/openweathermap/utils.py @@ -1,7 +1,15 @@ """Util functions for OpenWeatherMap.""" +from typing import Any + from pyopenweathermap import OWMClient, RequestError +from homeassistant.const import CONF_LANGUAGE, CONF_MODE + +from .const import DEFAULT_LANGUAGE, DEFAULT_OWM_MODE + +OPTION_DEFAULTS = {CONF_LANGUAGE: DEFAULT_LANGUAGE, CONF_MODE: DEFAULT_OWM_MODE} + async def validate_api_key(api_key, mode): """Validate API key.""" @@ -18,3 +26,15 @@ async def validate_api_key(api_key, mode): errors["base"] = "invalid_api_key" return errors, description_placeholders + + +def build_data_and_options( + combined_data: dict[str, Any], +) -> tuple[dict[str, Any], dict[str, Any]]: + """Split combined data and options.""" + data = {k: v for k, v in combined_data.items() if k not in OPTION_DEFAULTS} + options = { + option: combined_data.get(option, default) + for option, default in OPTION_DEFAULTS.items() + } + return (data, options)