Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The Sonarr component."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from aiopyarr.models.host_configuration import PyArrHostConfiguration
8 from aiopyarr.sonarr_client import SonarrClient
9 
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.const import (
12  CONF_API_KEY,
13  CONF_HOST,
14  CONF_PORT,
15  CONF_SSL,
16  CONF_URL,
17  CONF_VERIFY_SSL,
18  Platform,
19 )
20 from homeassistant.core import HomeAssistant
21 from homeassistant.helpers.aiohttp_client import async_get_clientsession
22 
23 from .const import (
24  CONF_BASE_PATH,
25  CONF_UPCOMING_DAYS,
26  CONF_WANTED_MAX_ITEMS,
27  DEFAULT_UPCOMING_DAYS,
28  DEFAULT_WANTED_MAX_ITEMS,
29  DOMAIN,
30  LOGGER,
31 )
32 from .coordinator import (
33  CalendarDataUpdateCoordinator,
34  CommandsDataUpdateCoordinator,
35  DiskSpaceDataUpdateCoordinator,
36  QueueDataUpdateCoordinator,
37  SeriesDataUpdateCoordinator,
38  SonarrDataUpdateCoordinator,
39  StatusDataUpdateCoordinator,
40  WantedDataUpdateCoordinator,
41 )
42 
43 PLATFORMS = [Platform.SENSOR]
44 
45 
46 async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
47  """Set up Sonarr from a config entry."""
48  if not entry.options:
49  options = {
50  CONF_UPCOMING_DAYS: entry.data.get(
51  CONF_UPCOMING_DAYS, DEFAULT_UPCOMING_DAYS
52  ),
53  CONF_WANTED_MAX_ITEMS: entry.data.get(
54  CONF_WANTED_MAX_ITEMS, DEFAULT_WANTED_MAX_ITEMS
55  ),
56  }
57  hass.config_entries.async_update_entry(entry, options=options)
58 
59  host_configuration = PyArrHostConfiguration(
60  api_token=entry.data[CONF_API_KEY],
61  url=entry.data[CONF_URL],
62  verify_ssl=entry.data[CONF_VERIFY_SSL],
63  )
64  sonarr = SonarrClient(
65  host_configuration=host_configuration,
66  session=async_get_clientsession(hass),
67  )
68  entry.async_on_unload(entry.add_update_listener(_async_update_listener))
69  coordinators: dict[str, SonarrDataUpdateCoordinator[Any]] = {
70  "upcoming": CalendarDataUpdateCoordinator(hass, host_configuration, sonarr),
71  "commands": CommandsDataUpdateCoordinator(hass, host_configuration, sonarr),
72  "diskspace": DiskSpaceDataUpdateCoordinator(hass, host_configuration, sonarr),
73  "queue": QueueDataUpdateCoordinator(hass, host_configuration, sonarr),
74  "series": SeriesDataUpdateCoordinator(hass, host_configuration, sonarr),
75  "status": StatusDataUpdateCoordinator(hass, host_configuration, sonarr),
76  "wanted": WantedDataUpdateCoordinator(hass, host_configuration, sonarr),
77  }
78  # Temporary, until we add diagnostic entities
79  _version = None
80  for coordinator in coordinators.values():
81  await coordinator.async_config_entry_first_refresh()
82  if isinstance(coordinator, StatusDataUpdateCoordinator):
83  _version = coordinator.data.version
84  coordinator.system_version = _version
85  hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinators
86  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
87 
88  return True
89 
90 
91 async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
92  """Migrate old entry."""
93  LOGGER.debug("Migrating from version %s", entry.version)
94 
95  if entry.version == 1:
96  new_proto = "https" if entry.data[CONF_SSL] else "http"
97  new_host_port = f"{entry.data[CONF_HOST]}:{entry.data[CONF_PORT]}"
98 
99  new_path = ""
100 
101  if entry.data[CONF_BASE_PATH].rstrip("/") not in ("", "/", "/api"):
102  new_path = entry.data[CONF_BASE_PATH].rstrip("/")
103 
104  data = {
105  **entry.data,
106  CONF_URL: f"{new_proto}://{new_host_port}{new_path}",
107  }
108  hass.config_entries.async_update_entry(entry, data=data, version=2)
109 
110  LOGGER.debug("Migration to version %s successful", entry.version)
111 
112  return True
113 
114 
115 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
116  """Unload a config entry."""
117  unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
118 
119  if unload_ok:
120  hass.data[DOMAIN].pop(entry.entry_id)
121 
122  return unload_ok
123 
124 
125 async def _async_update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
126  """Handle options update."""
127  await hass.config_entries.async_reload(entry.entry_id)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:115
bool async_migrate_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:91
None _async_update_listener(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:125
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:46
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)