Home Assistant Unofficial Reference 2024.12.1
discovery.py
Go to the documentation of this file.
1 """The unifiprotect integration discovery."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import asdict
6 from datetime import timedelta
7 import logging
8 from typing import Any
9 
10 from unifi_discovery import AIOUnifiScanner, UnifiDevice, UnifiService
11 
12 from homeassistant import config_entries
13 from homeassistant.core import HomeAssistant, callback
14 from homeassistant.helpers import discovery_flow
15 from homeassistant.helpers.event import async_track_time_interval
16 
17 from .const import DOMAIN
18 
19 _LOGGER = logging.getLogger(__name__)
20 
21 DISCOVERY = "discovery"
22 DISCOVERY_INTERVAL = timedelta(minutes=60)
23 
24 
25 @callback
26 def async_start_discovery(hass: HomeAssistant) -> None:
27  """Start discovery."""
28  domain_data = hass.data.setdefault(DOMAIN, {})
29  if DISCOVERY in domain_data:
30  return
31  domain_data[DISCOVERY] = True
32 
33  async def _async_discovery() -> None:
35 
36  @callback
37  def _async_start_background_discovery(*_: Any) -> None:
38  """Run discovery in the background."""
39  hass.async_create_background_task(_async_discovery(), "unifiprotect-discovery")
40 
41  # Do not block startup since discovery takes 31s or more
42  _async_start_background_discovery()
44  hass,
45  _async_start_background_discovery,
46  DISCOVERY_INTERVAL,
47  cancel_on_shutdown=True,
48  )
49 
50 
51 async def async_discover_devices() -> list[UnifiDevice]:
52  """Discover devices."""
53  scanner = AIOUnifiScanner()
54  devices = await scanner.async_scan()
55  _LOGGER.debug("Found devices: %s", devices)
56  return devices
57 
58 
59 @callback
61  hass: HomeAssistant,
62  discovered_devices: list[UnifiDevice],
63 ) -> None:
64  """Trigger config flows for discovered devices."""
65  for device in discovered_devices:
66  if device.services[UnifiService.Protect] and device.hw_addr:
67  discovery_flow.async_create_flow(
68  hass,
69  DOMAIN,
70  context={"source": config_entries.SOURCE_INTEGRATION_DISCOVERY},
71  data=asdict(device),
72  )
None async_trigger_discovery(HomeAssistant hass, list[UnifiDevice] discovered_devices)
Definition: discovery.py:63
None async_start_discovery(HomeAssistant hass)
Definition: discovery.py:26
CALLBACK_TYPE async_track_time_interval(HomeAssistant hass, Callable[[datetime], Coroutine[Any, Any, None]|None] action, timedelta interval, *str|None name=None, bool|None cancel_on_shutdown=None)
Definition: event.py:1679