Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for UpCloud."""
2 
3 from __future__ import annotations
4 
5 import dataclasses
6 from datetime import timedelta
7 import logging
8 
9 import requests.exceptions
10 import upcloud_api
11 
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.const import (
14  CONF_PASSWORD,
15  CONF_SCAN_INTERVAL,
16  CONF_USERNAME,
17  Platform,
18 )
19 from homeassistant.core import HomeAssistant
20 from homeassistant.exceptions import ConfigEntryNotReady
22  async_dispatcher_connect,
23  async_dispatcher_send,
24 )
25 
26 from .const import (
27  CONFIG_ENTRY_UPDATE_SIGNAL_TEMPLATE,
28  DATA_UPCLOUD,
29  DEFAULT_SCAN_INTERVAL,
30 )
31 from .coordinator import UpCloudDataUpdateCoordinator
32 
33 _LOGGER = logging.getLogger(__name__)
34 
35 PLATFORMS = [Platform.BINARY_SENSOR, Platform.SWITCH]
36 
37 
38 @dataclasses.dataclass
40  """Home Assistant UpCloud runtime data."""
41 
42  coordinators: dict[str, UpCloudDataUpdateCoordinator] = dataclasses.field(
43  default_factory=dict
44  )
45 
46 
47 def _config_entry_update_signal_name(config_entry: ConfigEntry) -> str:
48  """Get signal name for updates to a config entry."""
49  return CONFIG_ENTRY_UPDATE_SIGNAL_TEMPLATE.format(config_entry.unique_id)
50 
51 
53  hass: HomeAssistant, config_entry: ConfigEntry
54 ) -> None:
55  """Signal config entry options update."""
57  hass, _config_entry_update_signal_name(config_entry), config_entry
58  )
59 
60 
61 async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
62  """Set up the UpCloud config entry."""
63 
64  manager = upcloud_api.CloudManager(
65  entry.data[CONF_USERNAME], entry.data[CONF_PASSWORD]
66  )
67 
68  try:
69  await hass.async_add_executor_job(manager.authenticate)
70  except upcloud_api.UpCloudAPIError:
71  _LOGGER.exception("Authentication failed")
72  return False
73  except requests.exceptions.RequestException as err:
74  _LOGGER.exception("Failed to connect")
75  raise ConfigEntryNotReady from err
76 
77  if entry.options.get(CONF_SCAN_INTERVAL):
78  update_interval = timedelta(seconds=entry.options[CONF_SCAN_INTERVAL])
79  else:
80  update_interval = DEFAULT_SCAN_INTERVAL
81 
82  coordinator = UpCloudDataUpdateCoordinator(
83  hass,
84  update_interval=update_interval,
85  cloud_manager=manager,
86  username=entry.data[CONF_USERNAME],
87  )
88 
89  # Call the UpCloud API to refresh data
90  await coordinator.async_config_entry_first_refresh()
91 
92  # Listen to config entry updates
93  entry.async_on_unload(entry.add_update_listener(_async_signal_options_update))
94  entry.async_on_unload(
96  hass,
98  coordinator.async_update_config,
99  )
100  )
101 
102  hass.data[DATA_UPCLOUD] = UpCloudHassData()
103  hass.data[DATA_UPCLOUD].coordinators[entry.data[CONF_USERNAME]] = coordinator
104 
105  # Forward entry setup
106  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
107 
108  return True
109 
110 
111 async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
112  """Unload the config entry."""
113  unload_ok = await hass.config_entries.async_unload_platforms(
114  config_entry, PLATFORMS
115  )
116 
117  hass.data[DATA_UPCLOUD].coordinators.pop(config_entry.data[CONF_USERNAME])
118 
119  return unload_ok
None _async_signal_options_update(HomeAssistant hass, ConfigEntry config_entry)
Definition: __init__.py:54
str _config_entry_update_signal_name(ConfigEntry config_entry)
Definition: __init__.py:47
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:61
bool async_unload_entry(HomeAssistant hass, ConfigEntry config_entry)
Definition: __init__.py:111
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103
None async_dispatcher_send(HomeAssistant hass, str signal, *Any args)
Definition: dispatcher.py:193