Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The Discovergy integration."""
2 
3 from __future__ import annotations
4 
5 from pydiscovergy import Discovergy
6 from pydiscovergy.authentication import BasicAuth
7 import pydiscovergy.error as discovergyError
8 
9 from homeassistant.config_entries import ConfigEntry
10 from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, Platform
11 from homeassistant.core import HomeAssistant
12 from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
13 from homeassistant.helpers.httpx_client import get_async_client
14 
15 from .coordinator import DiscovergyUpdateCoordinator
16 
17 PLATFORMS = [Platform.SENSOR]
18 
19 type DiscovergyConfigEntry = ConfigEntry[list[DiscovergyUpdateCoordinator]]
20 
21 
22 async def async_setup_entry(hass: HomeAssistant, entry: DiscovergyConfigEntry) -> bool:
23  """Set up Discovergy from a config entry."""
24  client = Discovergy(
25  email=entry.data[CONF_EMAIL],
26  password=entry.data[CONF_PASSWORD],
27  httpx_client=get_async_client(hass),
28  authentication=BasicAuth(),
29  )
30 
31  try:
32  # try to get meters from api to check if credentials are still valid and for later use
33  # if no exception is raised everything is fine to go
34  meters = await client.meters()
35  except discovergyError.InvalidLogin as err:
36  raise ConfigEntryAuthFailed("Invalid email or password") from err
37  except Exception as err:
38  raise ConfigEntryNotReady(
39  "Unexpected error while while getting meters"
40  ) from err
41 
42  # Init coordinators for meters
43  coordinators = []
44  for meter in meters:
45  # Create coordinator for meter, set config entry and fetch initial data,
46  # so we have data when entities are added
47  coordinator = DiscovergyUpdateCoordinator(
48  hass=hass,
49  meter=meter,
50  discovergy_client=client,
51  )
52  await coordinator.async_config_entry_first_refresh()
53  coordinators.append(coordinator)
54 
55  entry.runtime_data = coordinators
56  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
57 
58  entry.async_on_unload(entry.add_update_listener(async_reload_entry))
59 
60  return True
61 
62 
63 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
64  """Unload a config entry."""
65  return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
66 
67 
68 async def async_reload_entry(hass: HomeAssistant, entry: ConfigEntry) -> None:
69  """Handle an options update."""
70  await hass.config_entries.async_reload(entry.entry_id)
bool async_setup_entry(HomeAssistant hass, DiscovergyConfigEntry entry)
Definition: __init__.py:22
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:63
None async_reload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:68
httpx.AsyncClient get_async_client(HomeAssistant hass, bool verify_ssl=True)
Definition: httpx_client.py:41