Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The Nettigo Air Monitor component."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import TYPE_CHECKING
7 
8 from aiohttp.client_exceptions import ClientConnectorError, ClientError
9 from nettigo_air_monitor import (
10  ApiError,
11  AuthFailedError,
12  ConnectionOptions,
13  NettigoAirMonitor,
14 )
15 
16 from homeassistant.components.air_quality import DOMAIN as AIR_QUALITY_PLATFORM
17 from homeassistant.config_entries import ConfigEntry
18 from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME, Platform
19 from homeassistant.core import HomeAssistant
20 from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
21 from homeassistant.helpers import entity_registry as er
22 from homeassistant.helpers.aiohttp_client import async_get_clientsession
23 
24 from .const import ATTR_SDS011, ATTR_SPS30, DOMAIN
25 from .coordinator import NAMDataUpdateCoordinator
26 
27 _LOGGER = logging.getLogger(__name__)
28 
29 PLATFORMS = [Platform.BUTTON, Platform.SENSOR]
30 
31 type NAMConfigEntry = ConfigEntry[NAMDataUpdateCoordinator]
32 
33 
34 async def async_setup_entry(hass: HomeAssistant, entry: NAMConfigEntry) -> bool:
35  """Set up Nettigo as config entry."""
36  host: str = entry.data[CONF_HOST]
37  username: str | None = entry.data.get(CONF_USERNAME)
38  password: str | None = entry.data.get(CONF_PASSWORD)
39 
40  websession = async_get_clientsession(hass)
41 
42  options = ConnectionOptions(host=host, username=username, password=password)
43  try:
44  nam = await NettigoAirMonitor.create(websession, options)
45  except (ApiError, ClientError, ClientConnectorError, TimeoutError) as err:
46  raise ConfigEntryNotReady from err
47 
48  try:
49  await nam.async_check_credentials()
50  except ApiError as err:
51  raise ConfigEntryNotReady from err
52  except AuthFailedError as err:
53  raise ConfigEntryAuthFailed from err
54 
55  if TYPE_CHECKING:
56  assert entry.unique_id
57 
58  coordinator = NAMDataUpdateCoordinator(hass, nam, entry.unique_id)
59  await coordinator.async_config_entry_first_refresh()
60 
61  entry.runtime_data = coordinator
62 
63  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
64 
65  # Remove air_quality entities from registry if they exist
66  ent_reg = er.async_get(hass)
67  for sensor_type in ("sds", ATTR_SDS011, ATTR_SPS30):
68  unique_id = f"{coordinator.unique_id}-{sensor_type}"
69  if entity_id := ent_reg.async_get_entity_id(
70  AIR_QUALITY_PLATFORM, DOMAIN, unique_id
71  ):
72  _LOGGER.debug("Removing deprecated air_quality entity %s", entity_id)
73  ent_reg.async_remove(entity_id)
74 
75  return True
76 
77 
78 async def async_unload_entry(hass: HomeAssistant, entry: NAMConfigEntry) -> bool:
79  """Unload a config entry."""
80  return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
bool async_unload_entry(HomeAssistant hass, NAMConfigEntry entry)
Definition: __init__.py:78
bool async_setup_entry(HomeAssistant hass, NAMConfigEntry entry)
Definition: __init__.py:34
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)