Home Assistant Unofficial Reference 2024.12.1
discovery.py
Go to the documentation of this file.
1 """The wiz integration discovery."""
2 
3 from __future__ import annotations
4 
5 import asyncio
6 from dataclasses import asdict
7 import logging
8 
9 from pywizlight.discovery import DiscoveredBulb, find_wizlights
10 
11 from homeassistant import config_entries
12 from homeassistant.components import network
13 from homeassistant.core import HomeAssistant, callback
14 from homeassistant.helpers import discovery_flow
15 
16 from .const import DOMAIN
17 
18 _LOGGER = logging.getLogger(__name__)
19 
20 
22  hass: HomeAssistant, timeout: int
23 ) -> list[DiscoveredBulb]:
24  """Discover wiz devices."""
25  broadcast_addrs = await network.async_get_ipv4_broadcast_addresses(hass)
26  targets = [str(address) for address in broadcast_addrs]
27  combined_discoveries: dict[str, DiscoveredBulb] = {}
28  for idx, discovered in enumerate(
29  await asyncio.gather(
30  *[find_wizlights(timeout, address) for address in targets],
31  return_exceptions=True,
32  )
33  ):
34  if isinstance(discovered, Exception):
35  _LOGGER.debug("Scanning %s failed with error: %s", targets[idx], discovered)
36  continue
37  if isinstance(discovered, BaseException):
38  raise discovered from None
39  for device in discovered:
40  assert isinstance(device, DiscoveredBulb)
41  combined_discoveries[device.ip_address] = device
42 
43  return list(combined_discoveries.values())
44 
45 
46 @callback
48  hass: HomeAssistant,
49  discovered_devices: list[DiscoveredBulb],
50 ) -> None:
51  """Trigger config flows for discovered devices."""
52  for device in discovered_devices:
53  discovery_flow.async_create_flow(
54  hass,
55  DOMAIN,
56  context={"source": config_entries.SOURCE_INTEGRATION_DISCOVERY},
57  data=asdict(device),
58  )
list[DiscoveredBulb] async_discover_devices(HomeAssistant hass, int timeout)
Definition: discovery.py:23
None async_trigger_discovery(HomeAssistant hass, list[DiscoveredBulb] discovered_devices)
Definition: discovery.py:50