Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The WattTime integration."""
2 
3 from __future__ import annotations
4 
5 from datetime import timedelta
6 
7 from aiowatttime import Client
8 from aiowatttime.emissions import RealTimeEmissionsResponseType
9 from aiowatttime.errors import InvalidCredentialsError, WattTimeError
10 
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.const import (
13  CONF_LATITUDE,
14  CONF_LONGITUDE,
15  CONF_PASSWORD,
16  CONF_USERNAME,
17  Platform,
18 )
19 from homeassistant.core import HomeAssistant
20 from homeassistant.exceptions import ConfigEntryAuthFailed
21 from homeassistant.helpers import aiohttp_client
22 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
23 
24 from .const import DOMAIN, LOGGER
25 
26 DEFAULT_UPDATE_INTERVAL = timedelta(minutes=5)
27 
28 PLATFORMS: list[Platform] = [Platform.SENSOR]
29 
30 
31 async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
32  """Set up WattTime from a config entry."""
33  session = aiohttp_client.async_get_clientsession(hass)
34 
35  try:
36  client = await Client.async_login(
37  entry.data[CONF_USERNAME], entry.data[CONF_PASSWORD], session=session
38  )
39  except InvalidCredentialsError as err:
40  raise ConfigEntryAuthFailed("Invalid username/password") from err
41  except WattTimeError as err:
42  LOGGER.error("Error while authenticating with WattTime: %s", err)
43  return False
44 
45  async def async_update_data() -> RealTimeEmissionsResponseType:
46  """Get the latest realtime emissions data."""
47  try:
48  return await client.emissions.async_get_realtime_emissions(
49  entry.data[CONF_LATITUDE], entry.data[CONF_LONGITUDE]
50  )
51  except InvalidCredentialsError as err:
52  raise ConfigEntryAuthFailed("Invalid username/password") from err
53  except WattTimeError as err:
54  raise UpdateFailed(
55  f"Error while requesting data from WattTime: {err}"
56  ) from err
57 
58  coordinator = DataUpdateCoordinator(
59  hass,
60  LOGGER,
61  config_entry=entry,
62  name=entry.title,
63  update_interval=DEFAULT_UPDATE_INTERVAL,
64  update_method=async_update_data,
65  )
66 
67  await coordinator.async_config_entry_first_refresh()
68  hass.data.setdefault(DOMAIN, {})
69  hass.data[DOMAIN][entry.entry_id] = coordinator
70 
71  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
72 
73  entry.async_on_unload(entry.add_update_listener(async_reload_entry))
74 
75  return True
76 
77 
78 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
79  """Unload a config entry."""
80  unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
81  if unload_ok:
82  hass.data[DOMAIN].pop(entry.entry_id)
83 
84  return unload_ok
85 
86 
87 async def async_reload_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> None:
88  """Handle an options update."""
89  await hass.config_entries.async_reload(config_entry.entry_id)
None async_reload_entry(HomeAssistant hass, ConfigEntry config_entry)
Definition: __init__.py:87
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:31
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:78