Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The openweathermap component."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 import logging
7 
8 from pyopenweathermap import create_owm_client
9 
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.const import (
12  CONF_API_KEY,
13  CONF_LANGUAGE,
14  CONF_LATITUDE,
15  CONF_LONGITUDE,
16  CONF_MODE,
17  CONF_NAME,
18 )
19 from homeassistant.core import HomeAssistant
20 
21 from .const import CONFIG_FLOW_VERSION, OWM_MODE_V25, PLATFORMS
22 from .coordinator import WeatherUpdateCoordinator
23 from .repairs import async_create_issue, async_delete_issue
24 from .utils import build_data_and_options
25 
26 _LOGGER = logging.getLogger(__name__)
27 
28 type OpenweathermapConfigEntry = ConfigEntry[OpenweathermapData]
29 
30 
31 @dataclass
33  """Runtime data definition."""
34 
35  name: str
36  mode: str
37  coordinator: WeatherUpdateCoordinator
38 
39 
41  hass: HomeAssistant, entry: OpenweathermapConfigEntry
42 ) -> bool:
43  """Set up OpenWeatherMap as config entry."""
44  name = entry.data[CONF_NAME]
45  api_key = entry.data[CONF_API_KEY]
46  latitude = entry.data.get(CONF_LATITUDE, hass.config.latitude)
47  longitude = entry.data.get(CONF_LONGITUDE, hass.config.longitude)
48  language = entry.options[CONF_LANGUAGE]
49  mode = entry.options[CONF_MODE]
50 
51  if mode == OWM_MODE_V25:
52  async_create_issue(hass, entry.entry_id)
53  else:
54  async_delete_issue(hass, entry.entry_id)
55 
56  owm_client = create_owm_client(api_key, mode, lang=language)
57  weather_coordinator = WeatherUpdateCoordinator(
58  owm_client, latitude, longitude, hass
59  )
60 
61  await weather_coordinator.async_config_entry_first_refresh()
62 
63  entry.async_on_unload(entry.add_update_listener(async_update_options))
64 
65  entry.runtime_data = OpenweathermapData(name, mode, weather_coordinator)
66 
67  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
68 
69  return True
70 
71 
72 async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
73  """Migrate old entry."""
74  config_entries = hass.config_entries
75  data = entry.data
76  options = entry.options
77  version = entry.version
78 
79  _LOGGER.debug("Migrating OpenWeatherMap entry from version %s", version)
80 
81  if version < 5:
82  combined_data = {**data, **options, CONF_MODE: OWM_MODE_V25}
83  new_data, new_options = build_data_and_options(combined_data)
84  config_entries.async_update_entry(
85  entry,
86  data=new_data,
87  options=new_options,
88  version=CONFIG_FLOW_VERSION,
89  )
90 
91  _LOGGER.debug("Migration to version %s successful", CONFIG_FLOW_VERSION)
92 
93  return True
94 
95 
96 async def async_update_options(hass: HomeAssistant, entry: ConfigEntry) -> None:
97  """Update options."""
98  await hass.config_entries.async_reload(entry.entry_id)
99 
100 
102  hass: HomeAssistant, entry: OpenweathermapConfigEntry
103 ) -> bool:
104  """Unload a config entry."""
105  return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
None async_create_issue(HomeAssistant hass, str entry_id)
Definition: repairs.py:69
None async_delete_issue(HomeAssistant hass, str entry_id)
Definition: repairs.py:85
tuple[dict[str, Any], dict[str, Any]] build_data_and_options(dict[str, Any] combined_data)
Definition: utils.py:33
bool async_unload_entry(HomeAssistant hass, OpenweathermapConfigEntry entry)
Definition: __init__.py:103
bool async_migrate_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:72
bool async_setup_entry(HomeAssistant hass, OpenweathermapConfigEntry entry)
Definition: __init__.py:42
None async_update_options(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:96