core/homeassistant/components/unifiprotect/discovery.py

73 lines
2.1 KiB
Python

"""The unifiprotect integration discovery."""
from __future__ import annotations
from dataclasses import asdict
from datetime import timedelta
import logging
from typing import Any
from unifi_discovery import AIOUnifiScanner, UnifiDevice, UnifiService
from homeassistant import config_entries
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import discovery_flow
from homeassistant.helpers.event import async_track_time_interval
from .const import DOMAIN
_LOGGER = logging.getLogger(__name__)
DISCOVERY = "discovery"
DISCOVERY_INTERVAL = timedelta(minutes=60)
@callback
def async_start_discovery(hass: HomeAssistant) -> None:
"""Start discovery."""
domain_data = hass.data.setdefault(DOMAIN, {})
if DISCOVERY in domain_data:
return
domain_data[DISCOVERY] = True
async def _async_discovery() -> None:
async_trigger_discovery(hass, await async_discover_devices())
@callback
def _async_start_background_discovery(*_: Any) -> None:
"""Run discovery in the background."""
hass.async_create_background_task(_async_discovery(), "unifiprotect-discovery")
# Do not block startup since discovery takes 31s or more
_async_start_background_discovery()
async_track_time_interval(
hass,
_async_start_background_discovery,
DISCOVERY_INTERVAL,
cancel_on_shutdown=True,
)
async def async_discover_devices() -> list[UnifiDevice]:
"""Discover devices."""
scanner = AIOUnifiScanner()
devices = await scanner.async_scan()
_LOGGER.debug("Found devices: %s", devices)
return devices
@callback
def async_trigger_discovery(
hass: HomeAssistant,
discovered_devices: list[UnifiDevice],
) -> None:
"""Trigger config flows for discovered devices."""
for device in discovered_devices:
if device.services[UnifiService.Protect] and device.hw_addr:
discovery_flow.async_create_flow(
hass,
DOMAIN,
context={"source": config_entries.SOURCE_INTEGRATION_DISCOVERY},
data=asdict(device),
)