Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The Glances component."""
2 
3 import logging
4 from typing import Any
5 
6 from glances_api import Glances
7 from glances_api.exceptions import (
8  GlancesApiAuthorizationError,
9  GlancesApiError,
10  GlancesApiNoDataAvailable,
11 )
12 
13 from homeassistant.config_entries import ConfigEntry
14 from homeassistant.const import (
15  CONF_HOST,
16  CONF_PASSWORD,
17  CONF_PORT,
18  CONF_SSL,
19  CONF_USERNAME,
20  CONF_VERIFY_SSL,
21  Platform,
22 )
23 from homeassistant.core import HomeAssistant
24 from homeassistant.exceptions import (
25  ConfigEntryAuthFailed,
26  ConfigEntryError,
27  ConfigEntryNotReady,
28  HomeAssistantError,
29 )
30 from homeassistant.helpers.httpx_client import get_async_client
31 
32 from .coordinator import GlancesDataUpdateCoordinator
33 
34 PLATFORMS = [Platform.SENSOR]
35 
36 
37 _LOGGER = logging.getLogger(__name__)
38 
39 type GlancesConfigEntry = ConfigEntry[GlancesDataUpdateCoordinator]
40 
41 
43  hass: HomeAssistant, config_entry: GlancesConfigEntry
44 ) -> bool:
45  """Set up Glances from config entry."""
46  try:
47  api = await get_api(hass, dict(config_entry.data))
48  except GlancesApiAuthorizationError as err:
49  raise ConfigEntryAuthFailed from err
50  except GlancesApiError as err:
51  raise ConfigEntryNotReady from err
52  except ServerVersionMismatch as err:
53  raise ConfigEntryError(err) from err
54  coordinator = GlancesDataUpdateCoordinator(hass, config_entry, api)
55  await coordinator.async_config_entry_first_refresh()
56 
57  config_entry.runtime_data = coordinator
58 
59  await hass.config_entries.async_forward_entry_setups(config_entry, PLATFORMS)
60 
61  return True
62 
63 
64 async def async_unload_entry(hass: HomeAssistant, entry: GlancesConfigEntry) -> bool:
65  """Unload a config entry."""
66  return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
67 
68 
69 async def get_api(hass: HomeAssistant, entry_data: dict[str, Any]) -> Glances:
70  """Return the api from glances_api."""
71  httpx_client = get_async_client(hass, verify_ssl=entry_data[CONF_VERIFY_SSL])
72  for version in (4, 3):
73  api = Glances(
74  host=entry_data[CONF_HOST],
75  port=entry_data[CONF_PORT],
76  version=version,
77  ssl=entry_data[CONF_SSL],
78  username=entry_data.get(CONF_USERNAME),
79  password=entry_data.get(CONF_PASSWORD),
80  httpx_client=httpx_client,
81  )
82  try:
83  await api.get_ha_sensor_data()
84  except GlancesApiNoDataAvailable as err:
85  _LOGGER.debug("Failed to connect to Glances API v%s: %s", version, err)
86  continue
87  _LOGGER.debug("Connected to Glances API v%s", version)
88  return api
89  raise ServerVersionMismatch("Could not connect to Glances API version 3 or 4")
90 
91 
93  """Raise exception if we fail to connect to Glances API."""
bool async_unload_entry(HomeAssistant hass, GlancesConfigEntry entry)
Definition: __init__.py:64
Glances get_api(HomeAssistant hass, dict[str, Any] entry_data)
Definition: __init__.py:69
bool async_setup_entry(HomeAssistant hass, GlancesConfigEntry config_entry)
Definition: __init__.py:44
httpx.AsyncClient get_async_client(HomeAssistant hass, bool verify_ssl=True)
Definition: httpx_client.py:41