Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for UV data from openuv.io."""
2 
3 from __future__ import annotations
4 
5 import asyncio
6 from typing import Any
7 
8 from pyopenuv import Client
9 
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.const import (
12  CONF_API_KEY,
13  CONF_BINARY_SENSORS,
14  CONF_ELEVATION,
15  CONF_LATITUDE,
16  CONF_LONGITUDE,
17  CONF_SENSORS,
18  Platform,
19 )
20 from homeassistant.core import HomeAssistant
21 from homeassistant.helpers import aiohttp_client
22 
23 from .const import (
24  CONF_FROM_WINDOW,
25  CONF_TO_WINDOW,
26  DATA_PROTECTION_WINDOW,
27  DATA_UV,
28  DEFAULT_FROM_WINDOW,
29  DEFAULT_TO_WINDOW,
30  DOMAIN,
31  LOGGER,
32 )
33 from .coordinator import OpenUvCoordinator
34 
35 PLATFORMS = [Platform.BINARY_SENSOR, Platform.SENSOR]
36 
37 
38 async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
39  """Set up OpenUV as config entry."""
40  websession = aiohttp_client.async_get_clientsession(hass)
41  client = Client(
42  entry.data[CONF_API_KEY],
43  entry.data.get(CONF_LATITUDE, hass.config.latitude),
44  entry.data.get(CONF_LONGITUDE, hass.config.longitude),
45  altitude=entry.data.get(CONF_ELEVATION, hass.config.elevation),
46  session=websession,
47  check_status_before_request=True,
48  )
49 
50  async def async_update_protection_data() -> dict[str, Any]:
51  """Update binary sensor (protection window) data."""
52  low = entry.options.get(CONF_FROM_WINDOW, DEFAULT_FROM_WINDOW)
53  high = entry.options.get(CONF_TO_WINDOW, DEFAULT_TO_WINDOW)
54  return await client.uv_protection_window(low=low, high=high)
55 
56  coordinators: dict[str, OpenUvCoordinator] = {
57  coordinator_name: OpenUvCoordinator(
58  hass,
59  entry=entry,
60  name=coordinator_name,
61  latitude=client.latitude,
62  longitude=client.longitude,
63  update_method=update_method,
64  )
65  for coordinator_name, update_method in (
66  (DATA_UV, client.uv_index),
67  (DATA_PROTECTION_WINDOW, async_update_protection_data),
68  )
69  }
70 
71  init_tasks = [
72  coordinator.async_config_entry_first_refresh()
73  for coordinator in coordinators.values()
74  ]
75  await asyncio.gather(*init_tasks)
76 
77  hass.data.setdefault(DOMAIN, {})
78  hass.data[DOMAIN][entry.entry_id] = coordinators
79 
80  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
81 
82  return True
83 
84 
85 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
86  """Unload an OpenUV config entry."""
87  unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
88  if unload_ok:
89  hass.data[DOMAIN].pop(entry.entry_id)
90 
91  return unload_ok
92 
93 
94 async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
95  """Migrate the config entry upon new versions."""
96  version = entry.version
97  data = {**entry.data}
98 
99  LOGGER.debug("Migrating from version %s", version)
100 
101  # 1 -> 2: Remove unused condition data:
102  if version == 1:
103  data.pop(CONF_BINARY_SENSORS, None)
104  data.pop(CONF_SENSORS, None)
105  version = 2
106  hass.config_entries.async_update_entry(entry, data=data, version=2)
107  LOGGER.debug("Migration to version %s successful", version)
108 
109  return True
bool async_migrate_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:94
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:85
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:38