1 """Support for Open-Meteo."""
3 from __future__
import annotations
5 from open_meteo
import (
22 from .const
import DOMAIN, LOGGER, SCAN_INTERVAL
24 PLATFORMS = [Platform.WEATHER]
28 """Set up Open-Meteo from a config entry."""
30 open_meteo = OpenMeteo(session=session)
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")
37 return await open_meteo.forecast(
38 latitude=zone.attributes[ATTR_LATITUDE],
39 longitude=zone.attributes[ATTR_LONGITUDE],
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,
50 HourlyParameters.PRECIPITATION,
51 HourlyParameters.TEMPERATURE_2M,
52 HourlyParameters.WEATHER_CODE,
54 precipitation_unit=PrecipitationUnit.MILLIMETERS,
55 temperature_unit=TemperatureUnit.CELSIUS,
57 wind_speed_unit=WindSpeedUnit.KILOMETERS_PER_HOUR,
59 except OpenMeteoError
as err:
60 raise UpdateFailed(
"Open-Meteo API communication error")
from err
66 name=f
"{DOMAIN}_{entry.data[CONF_ZONE]}",
67 update_interval=SCAN_INTERVAL,
68 update_method=async_update_forecast,
70 await coordinator.async_config_entry_first_refresh()
72 hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator
73 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
79 """Unload Open-Meteo config entry."""
80 unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
82 del hass.data[DOMAIN][entry.entry_id]
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
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)