Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The keenetic_ndms2 component."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from homeassistant.config_entries import ConfigEntry
8 from homeassistant.const import CONF_HOST, CONF_SCAN_INTERVAL, Platform
9 from homeassistant.core import HomeAssistant
10 from homeassistant.helpers import device_registry as dr, entity_registry as er
11 
12 from .const import (
13  CONF_CONSIDER_HOME,
14  CONF_INCLUDE_ARP,
15  CONF_INCLUDE_ASSOCIATED,
16  CONF_INTERFACES,
17  CONF_TRY_HOTSPOT,
18  DEFAULT_CONSIDER_HOME,
19  DEFAULT_INTERFACE,
20  DEFAULT_SCAN_INTERVAL,
21  DOMAIN,
22  ROUTER,
23  UNDO_UPDATE_LISTENER,
24 )
25 from .router import KeeneticRouter
26 
27 PLATFORMS = [Platform.BINARY_SENSOR, Platform.DEVICE_TRACKER]
28 _LOGGER = logging.getLogger(__name__)
29 
30 
31 async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
32  """Set up the component."""
33  hass.data.setdefault(DOMAIN, {})
34  async_add_defaults(hass, entry)
35 
36  router = KeeneticRouter(hass, entry)
37  await router.async_setup()
38 
39  undo_listener = entry.add_update_listener(update_listener)
40 
41  hass.data[DOMAIN][entry.entry_id] = {
42  ROUTER: router,
43  UNDO_UPDATE_LISTENER: undo_listener,
44  }
45 
46  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
47 
48  return True
49 
50 
51 async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
52  """Unload a config entry."""
53  hass.data[DOMAIN][config_entry.entry_id][UNDO_UPDATE_LISTENER]()
54 
55  unload_ok = await hass.config_entries.async_unload_platforms(
56  config_entry, PLATFORMS
57  )
58 
59  router: KeeneticRouter = hass.data[DOMAIN][config_entry.entry_id][ROUTER]
60 
61  await router.async_teardown()
62 
63  hass.data[DOMAIN].pop(config_entry.entry_id)
64 
65  new_tracked_interfaces: set[str] = set(config_entry.options[CONF_INTERFACES])
66 
67  if router.tracked_interfaces - new_tracked_interfaces:
68  _LOGGER.debug(
69  "Cleaning device_tracker entities since some interfaces are now untracked:"
70  )
71  ent_reg = er.async_get(hass)
72  dev_reg = dr.async_get(hass)
73  # We keep devices currently connected to new_tracked_interfaces
74  keep_devices: set[str] = {
75  mac
76  for mac, device in router.last_devices.items()
77  if device.interface in new_tracked_interfaces
78  }
79  for entity_entry in ent_reg.entities.get_entries_for_config_entry_id(
80  config_entry.entry_id
81  ):
82  if entity_entry.domain == Platform.DEVICE_TRACKER:
83  mac = entity_entry.unique_id.partition("_")[0]
84  if mac not in keep_devices:
85  _LOGGER.debug("Removing entity %s", entity_entry.entity_id)
86 
87  ent_reg.async_remove(entity_entry.entity_id)
88  if entity_entry.device_id:
89  dev_reg.async_update_device(
90  entity_entry.device_id,
91  remove_config_entry_id=config_entry.entry_id,
92  )
93 
94  _LOGGER.debug("Finished cleaning device_tracker entities")
95 
96  return unload_ok
97 
98 
99 async def update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
100  """Handle options update."""
101  await hass.config_entries.async_reload(entry.entry_id)
102 
103 
104 def async_add_defaults(hass: HomeAssistant, entry: ConfigEntry):
105  """Populate default options."""
106  host: str = entry.data[CONF_HOST]
107  imported_options: dict = hass.data[DOMAIN].get(f"imported_options_{host}", {})
108  options = {
109  CONF_SCAN_INTERVAL: DEFAULT_SCAN_INTERVAL,
110  CONF_CONSIDER_HOME: DEFAULT_CONSIDER_HOME,
111  CONF_INTERFACES: [DEFAULT_INTERFACE],
112  CONF_TRY_HOTSPOT: True,
113  CONF_INCLUDE_ARP: True,
114  CONF_INCLUDE_ASSOCIATED: True,
115  **imported_options,
116  **entry.options,
117  }
118 
119  if options.keys() - entry.options.keys():
120  hass.config_entries.async_update_entry(entry, options=options)
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None update_listener(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:99
def async_add_defaults(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:104
bool async_unload_entry(HomeAssistant hass, ConfigEntry config_entry)
Definition: __init__.py:51
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:31