UniFi streamline loading platforms (#100071)

* Streamline loading platforms

* Move platform registration logic to UnifiController class
This commit is contained in:
Robert Svensson 2023-09-11 15:55:27 +02:00 committed by GitHub
parent 791482406c
commit d8445a79fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 57 additions and 79 deletions

View File

@ -24,7 +24,6 @@ from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN as UNIFI_DOMAIN
from .controller import UniFiController from .controller import UniFiController
from .entity import ( from .entity import (
HandlerT, HandlerT,
@ -87,13 +86,13 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up button platform for UniFi Network integration.""" """Set up button platform for UniFi Network integration."""
controller: UniFiController = hass.data[UNIFI_DOMAIN][config_entry.entry_id] UniFiController.register_platform(
hass,
if not controller.is_admin: config_entry,
return async_add_entities,
UnifiButtonEntity,
controller.register_platform_add_entities( ENTITY_DESCRIPTIONS,
UnifiButtonEntity, ENTITY_DESCRIPTIONS, async_add_entities requires_admin=True,
) )

View File

@ -21,14 +21,9 @@ from homeassistant.const import (
CONF_PORT, CONF_PORT,
CONF_USERNAME, CONF_USERNAME,
CONF_VERIFY_SSL, CONF_VERIFY_SSL,
Platform,
) )
from homeassistant.core import CALLBACK_TYPE, Event, HomeAssistant, callback from homeassistant.core import CALLBACK_TYPE, Event, HomeAssistant, callback
from homeassistant.helpers import ( from homeassistant.helpers import aiohttp_client, device_registry as dr
aiohttp_client,
device_registry as dr,
entity_registry as er,
)
from homeassistant.helpers.device_registry import ( from homeassistant.helpers.device_registry import (
DeviceEntry, DeviceEntry,
DeviceEntryType, DeviceEntryType,
@ -39,13 +34,11 @@ from homeassistant.helpers.dispatcher import (
async_dispatcher_send, async_dispatcher_send,
) )
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.entity_registry import async_entries_for_config_entry
from homeassistant.helpers.event import async_call_later, async_track_time_interval from homeassistant.helpers.event import async_call_later, async_track_time_interval
import homeassistant.util.dt as dt_util import homeassistant.util.dt as dt_util
from .const import ( from .const import (
ATTR_MANUFACTURER, ATTR_MANUFACTURER,
BLOCK_SWITCH,
CONF_ALLOW_BANDWIDTH_SENSORS, CONF_ALLOW_BANDWIDTH_SENSORS,
CONF_ALLOW_UPTIME_SENSORS, CONF_ALLOW_UPTIME_SENSORS,
CONF_BLOCK_CLIENT, CONF_BLOCK_CLIENT,
@ -162,6 +155,24 @@ class UniFiController:
host: str = self.config_entry.data[CONF_HOST] host: str = self.config_entry.data[CONF_HOST]
return host return host
@callback
@staticmethod
def register_platform(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
entity_class: type[UnifiEntity],
descriptions: tuple[UnifiEntityDescription, ...],
requires_admin: bool = False,
) -> None:
"""Register platform for UniFi entity management."""
controller: UniFiController = hass.data[UNIFI_DOMAIN][config_entry.entry_id]
if requires_admin and not controller.is_admin:
return
controller.register_platform_add_entities(
entity_class, descriptions, async_add_entities
)
@callback @callback
def register_platform_add_entities( def register_platform_add_entities(
self, self,
@ -251,30 +262,9 @@ class UniFiController:
assert self.config_entry.unique_id is not None assert self.config_entry.unique_id is not None
self.is_admin = self.api.sites[self.config_entry.unique_id].role == "admin" self.is_admin = self.api.sites[self.config_entry.unique_id].role == "admin"
# Restore clients that are not a part of active clients list. for mac in self.option_block_clients:
entity_registry = er.async_get(self.hass) if mac not in self.api.clients and mac in self.api.clients_all:
for entry in async_entries_for_config_entry( self.api.clients.process_raw([dict(self.api.clients_all[mac].raw)])
entity_registry, self.config_entry.entry_id
):
if entry.domain == Platform.DEVICE_TRACKER:
mac = entry.unique_id.split("-", 1)[0]
elif entry.domain == Platform.SWITCH and entry.unique_id.startswith(
BLOCK_SWITCH
):
mac = entry.unique_id.split("-", 1)[1]
else:
continue
if mac in self.api.clients or mac not in self.api.clients_all:
continue
client = self.api.clients_all[mac]
self.api.clients.process_raw([dict(client.raw)])
LOGGER.debug(
"Restore disconnected client %s (%s)",
entry.entity_id,
client.mac,
)
self.wireless_clients.update_clients(set(self.api.clients.values())) self.wireless_clients.update_clients(set(self.api.clients.values()))

View File

@ -24,7 +24,6 @@ from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
import homeassistant.util.dt as dt_util import homeassistant.util.dt as dt_util
from .const import DOMAIN as UNIFI_DOMAIN
from .controller import UniFiController from .controller import UniFiController
from .entity import ( from .entity import (
HandlerT, HandlerT,
@ -206,9 +205,8 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up device tracker for UniFi Network integration.""" """Set up device tracker for UniFi Network integration."""
controller: UniFiController = hass.data[UNIFI_DOMAIN][config_entry.entry_id] UniFiController.register_platform(
controller.register_platform_add_entities( hass, config_entry, async_add_entities, UnifiScannerEntity, ENTITY_DESCRIPTIONS
UnifiScannerEntity, ENTITY_DESCRIPTIONS, async_add_entities
) )

View File

@ -20,7 +20,6 @@ from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
import homeassistant.util.dt as dt_util import homeassistant.util.dt as dt_util
from .const import DOMAIN as UNIFI_DOMAIN
from .controller import UniFiController from .controller import UniFiController
from .entity import ( from .entity import (
HandlerT, HandlerT,
@ -83,13 +82,13 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up image platform for UniFi Network integration.""" """Set up image platform for UniFi Network integration."""
controller: UniFiController = hass.data[UNIFI_DOMAIN][config_entry.entry_id] UniFiController.register_platform(
hass,
if not controller.is_admin: config_entry,
return async_add_entities,
UnifiImageEntity,
controller.register_platform_add_entities( ENTITY_DESCRIPTIONS,
UnifiImageEntity, ENTITY_DESCRIPTIONS, async_add_entities requires_admin=True,
) )

View File

@ -35,7 +35,6 @@ from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
import homeassistant.util.dt as dt_util import homeassistant.util.dt as dt_util
from .const import DOMAIN as UNIFI_DOMAIN
from .controller import UniFiController from .controller import UniFiController
from .entity import ( from .entity import (
HandlerT, HandlerT,
@ -329,9 +328,8 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up sensors for UniFi Network integration.""" """Set up sensors for UniFi Network integration."""
controller: UniFiController = hass.data[UNIFI_DOMAIN][config_entry.entry_id] UniFiController.register_platform(
controller.register_platform_add_entities( hass, config_entry, async_add_entities, UnifiSensorEntity, ENTITY_DESCRIPTIONS
UnifiSensorEntity, ENTITY_DESCRIPTIONS, async_add_entities
) )

View File

@ -43,7 +43,7 @@ from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import ATTR_MANUFACTURER, DOMAIN as UNIFI_DOMAIN from .const import ATTR_MANUFACTURER
from .controller import UniFiController from .controller import UniFiController
from .entity import ( from .entity import (
HandlerT, HandlerT,
@ -320,19 +320,13 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up switches for UniFi Network integration.""" """Set up switches for UniFi Network integration."""
controller: UniFiController = hass.data[UNIFI_DOMAIN][config_entry.entry_id] UniFiController.register_platform(
hass,
if not controller.is_admin: config_entry,
return async_add_entities,
UnifiSwitchEntity,
for mac in controller.option_block_clients: ENTITY_DESCRIPTIONS,
if mac not in controller.api.clients and mac in controller.api.clients_all: requires_admin=True,
controller.api.clients.process_raw(
[dict(controller.api.clients_all[mac].raw)]
)
controller.register_platform_add_entities(
UnifiSwitchEntity, ENTITY_DESCRIPTIONS, async_add_entities
) )

View File

@ -4,7 +4,7 @@ from __future__ import annotations
from collections.abc import Callable, Coroutine from collections.abc import Callable, Coroutine
from dataclasses import dataclass from dataclasses import dataclass
import logging import logging
from typing import TYPE_CHECKING, Any, Generic, TypeVar from typing import Any, Generic, TypeVar
import aiounifi import aiounifi
from aiounifi.interfaces.api_handlers import ItemEvent from aiounifi.interfaces.api_handlers import ItemEvent
@ -21,7 +21,7 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN as UNIFI_DOMAIN from .controller import UniFiController
from .entity import ( from .entity import (
UnifiEntity, UnifiEntity,
UnifiEntityDescription, UnifiEntityDescription,
@ -29,9 +29,6 @@ from .entity import (
async_device_device_info_fn, async_device_device_info_fn,
) )
if TYPE_CHECKING:
from .controller import UniFiController
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)
_DataT = TypeVar("_DataT", bound=Device) _DataT = TypeVar("_DataT", bound=Device)
@ -88,9 +85,12 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up update entities for UniFi Network integration.""" """Set up update entities for UniFi Network integration."""
controller: UniFiController = hass.data[UNIFI_DOMAIN][config_entry.entry_id] UniFiController.register_platform(
controller.register_platform_add_entities( hass,
UnifiDeviceUpdateEntity, ENTITY_DESCRIPTIONS, async_add_entities config_entry,
async_add_entities,
UnifiDeviceUpdateEntity,
ENTITY_DESCRIPTIONS,
) )

View File

@ -946,7 +946,7 @@ async def test_restoring_client(
await setup_unifi_integration( await setup_unifi_integration(
hass, hass,
aioclient_mock, aioclient_mock,
options={CONF_BLOCK_CLIENT: True}, options={CONF_BLOCK_CLIENT: [restored["mac"]]},
clients_response=[client], clients_response=[client],
clients_all_response=[restored, not_restored], clients_all_response=[restored, not_restored],
) )