mirror of https://github.com/home-assistant/core
73 lines
2.1 KiB
Python
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),
|
|
)
|