Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for Open-Meteo."""
2 
3 from __future__ import annotations
4 
5 from open_meteo import (
6  DailyParameters,
7  Forecast,
8  HourlyParameters,
9  OpenMeteo,
10  OpenMeteoError,
11  PrecipitationUnit,
12  TemperatureUnit,
13  WindSpeedUnit,
14 )
15 
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.const import ATTR_LATITUDE, ATTR_LONGITUDE, CONF_ZONE, Platform
18 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers.aiohttp_client import async_get_clientsession
20 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
21 
22 from .const import DOMAIN, LOGGER, SCAN_INTERVAL
23 
24 PLATFORMS = [Platform.WEATHER]
25 
26 
27 async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
28  """Set up Open-Meteo from a config entry."""
29  session = async_get_clientsession(hass)
30  open_meteo = OpenMeteo(session=session)
31 
32  async def async_update_forecast() -> Forecast:
33  if (zone := hass.states.get(entry.data[CONF_ZONE])) is None:
34  raise UpdateFailed(f"Zone '{entry.data[CONF_ZONE]}' not found")
35 
36  try:
37  return await open_meteo.forecast(
38  latitude=zone.attributes[ATTR_LATITUDE],
39  longitude=zone.attributes[ATTR_LONGITUDE],
40  current_weather=True,
41  daily=[
42  DailyParameters.PRECIPITATION_SUM,
43  DailyParameters.TEMPERATURE_2M_MAX,
44  DailyParameters.TEMPERATURE_2M_MIN,
45  DailyParameters.WEATHER_CODE,
46  DailyParameters.WIND_DIRECTION_10M_DOMINANT,
47  DailyParameters.WIND_SPEED_10M_MAX,
48  ],
49  hourly=[
50  HourlyParameters.PRECIPITATION,
51  HourlyParameters.TEMPERATURE_2M,
52  HourlyParameters.WEATHER_CODE,
53  ],
54  precipitation_unit=PrecipitationUnit.MILLIMETERS,
55  temperature_unit=TemperatureUnit.CELSIUS,
56  timezone="UTC",
57  wind_speed_unit=WindSpeedUnit.KILOMETERS_PER_HOUR,
58  )
59  except OpenMeteoError as err:
60  raise UpdateFailed("Open-Meteo API communication error") from err
61 
62  coordinator: DataUpdateCoordinator[Forecast] = DataUpdateCoordinator(
63  hass,
64  LOGGER,
65  config_entry=entry,
66  name=f"{DOMAIN}_{entry.data[CONF_ZONE]}",
67  update_interval=SCAN_INTERVAL,
68  update_method=async_update_forecast,
69  )
70  await coordinator.async_config_entry_first_refresh()
71 
72  hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator
73  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
74 
75  return True
76 
77 
78 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
79  """Unload Open-Meteo config entry."""
80  unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
81  if unload_ok:
82  del hass.data[DOMAIN][entry.entry_id]
83  return unload_ok
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:27
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:78
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)