mirror of
https://github.com/home-assistant/core.git
synced 2025-07-14 00:37:13 +00:00
UniFi device tracker restore clients (#25532)
This commit is contained in:
parent
3a91c8f285
commit
891f19b43f
@ -6,12 +6,13 @@ import voluptuous as vol
|
|||||||
|
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
from homeassistant.components import unifi
|
from homeassistant.components import unifi
|
||||||
from homeassistant.components.device_tracker import PLATFORM_SCHEMA
|
from homeassistant.components.device_tracker import DOMAIN, PLATFORM_SCHEMA
|
||||||
from homeassistant.components.device_tracker.config_entry import ScannerEntity
|
from homeassistant.components.device_tracker.config_entry import ScannerEntity
|
||||||
from homeassistant.components.device_tracker.const import SOURCE_TYPE_ROUTER
|
from homeassistant.components.device_tracker.const import SOURCE_TYPE_ROUTER
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_HOST, CONF_USERNAME, CONF_PASSWORD, CONF_PORT, CONF_VERIFY_SSL)
|
CONF_HOST, CONF_USERNAME, CONF_PASSWORD, CONF_PORT, CONF_VERIFY_SSL)
|
||||||
|
from homeassistant.helpers import entity_registry
|
||||||
from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC
|
from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC
|
||||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||||
|
|
||||||
@ -80,6 +81,23 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
|
|||||||
controller = hass.data[unifi.DOMAIN][controller_id]
|
controller = hass.data[unifi.DOMAIN][controller_id]
|
||||||
tracked = {}
|
tracked = {}
|
||||||
|
|
||||||
|
registry = await entity_registry.async_get_registry(hass)
|
||||||
|
|
||||||
|
# Restore clients that is not a part of active clients list.
|
||||||
|
for entity in registry.entities.values():
|
||||||
|
|
||||||
|
if entity.config_entry_id == config_entry.entry_id and \
|
||||||
|
entity.domain == DOMAIN:
|
||||||
|
|
||||||
|
mac, _ = entity.unique_id.split('-', 1)
|
||||||
|
|
||||||
|
if mac in controller.api.clients or \
|
||||||
|
mac not in controller.api.clients_all:
|
||||||
|
continue
|
||||||
|
|
||||||
|
client = controller.api.clients_all[mac]
|
||||||
|
controller.api.clients.process_raw([client.raw])
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def update_controller():
|
def update_controller():
|
||||||
"""Update the values of the controller."""
|
"""Update the values of the controller."""
|
||||||
|
@ -6,7 +6,7 @@ from datetime import timedelta
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from aiounifi.clients import Clients
|
from aiounifi.clients import Clients, ClientsAll
|
||||||
from aiounifi.devices import Devices
|
from aiounifi.devices import Devices
|
||||||
|
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
@ -15,6 +15,7 @@ from homeassistant.components.unifi.const import (
|
|||||||
CONF_CONTROLLER, CONF_SITE_ID, UNIFI_CONFIG)
|
CONF_CONTROLLER, CONF_SITE_ID, UNIFI_CONFIG)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_USERNAME, CONF_VERIFY_SSL)
|
CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_USERNAME, CONF_VERIFY_SSL)
|
||||||
|
from homeassistant.helpers import entity_registry
|
||||||
from homeassistant.setup import async_setup_component
|
from homeassistant.setup import async_setup_component
|
||||||
|
|
||||||
import homeassistant.components.device_tracker as device_tracker
|
import homeassistant.components.device_tracker as device_tracker
|
||||||
@ -75,6 +76,7 @@ def mock_controller(hass):
|
|||||||
|
|
||||||
controller.mock_client_responses = deque()
|
controller.mock_client_responses = deque()
|
||||||
controller.mock_device_responses = deque()
|
controller.mock_device_responses = deque()
|
||||||
|
controller.mock_client_all_responses = deque()
|
||||||
|
|
||||||
async def mock_request(method, path, **kwargs):
|
async def mock_request(method, path, **kwargs):
|
||||||
kwargs['method'] = method
|
kwargs['method'] = method
|
||||||
@ -84,10 +86,13 @@ def mock_controller(hass):
|
|||||||
return controller.mock_client_responses.popleft()
|
return controller.mock_client_responses.popleft()
|
||||||
if path == 's/{site}/stat/device':
|
if path == 's/{site}/stat/device':
|
||||||
return controller.mock_device_responses.popleft()
|
return controller.mock_device_responses.popleft()
|
||||||
|
if path == 's/{site}/rest/user':
|
||||||
|
return controller.mock_client_all_responses.popleft()
|
||||||
return None
|
return None
|
||||||
|
|
||||||
controller.api.clients = Clients({}, mock_request)
|
controller.api.clients = Clients({}, mock_request)
|
||||||
controller.api.devices = Devices({}, mock_request)
|
controller.api.devices = Devices({}, mock_request)
|
||||||
|
controller.api.clients_all = ClientsAll({}, mock_request)
|
||||||
|
|
||||||
return controller
|
return controller
|
||||||
|
|
||||||
@ -98,7 +103,7 @@ async def setup_controller(hass, mock_controller):
|
|||||||
hass.data[unifi.DOMAIN] = {CONTROLLER_ID: mock_controller}
|
hass.data[unifi.DOMAIN] = {CONTROLLER_ID: mock_controller}
|
||||||
config_entry = config_entries.ConfigEntry(
|
config_entry = config_entries.ConfigEntry(
|
||||||
1, unifi.DOMAIN, 'Mock Title', ENTRY_CONFIG, 'test',
|
1, unifi.DOMAIN, 'Mock Title', ENTRY_CONFIG, 'test',
|
||||||
config_entries.CONN_CLASS_LOCAL_POLL)
|
config_entries.CONN_CLASS_LOCAL_POLL, entry_id=1)
|
||||||
mock_controller.config_entry = config_entry
|
mock_controller.config_entry = config_entry
|
||||||
|
|
||||||
await mock_controller.async_update()
|
await mock_controller.async_update()
|
||||||
@ -159,3 +164,30 @@ async def test_tracked_devices(hass, mock_controller):
|
|||||||
|
|
||||||
device_1 = hass.states.get('device_tracker.client_1')
|
device_1 = hass.states.get('device_tracker.client_1')
|
||||||
assert device_1.state == 'home'
|
assert device_1.state == 'home'
|
||||||
|
|
||||||
|
|
||||||
|
async def test_restoring_client(hass, mock_controller):
|
||||||
|
"""Test the update_items function with some clients."""
|
||||||
|
mock_controller.mock_client_responses.append([CLIENT_2])
|
||||||
|
mock_controller.mock_device_responses.append({})
|
||||||
|
mock_controller.mock_client_all_responses.append([CLIENT_1])
|
||||||
|
mock_controller.unifi_config = {
|
||||||
|
unifi.CONF_BLOCK_CLIENT: True
|
||||||
|
}
|
||||||
|
|
||||||
|
registry = await entity_registry.async_get_registry(hass)
|
||||||
|
registry.async_get_or_create(
|
||||||
|
device_tracker.DOMAIN, unifi_dt.UNIFI_DOMAIN,
|
||||||
|
'{}-mock-site'.format(CLIENT_1['mac']),
|
||||||
|
suggested_object_id=CLIENT_1['hostname'], config_entry_id=1)
|
||||||
|
registry.async_get_or_create(
|
||||||
|
device_tracker.DOMAIN, unifi_dt.UNIFI_DOMAIN,
|
||||||
|
'{}-mock-site'.format(CLIENT_2['mac']),
|
||||||
|
suggested_object_id=CLIENT_2['hostname'], config_entry_id=1)
|
||||||
|
|
||||||
|
await setup_controller(hass, mock_controller)
|
||||||
|
assert len(mock_controller.mock_requests) == 3
|
||||||
|
assert len(hass.states.async_all()) == 4
|
||||||
|
|
||||||
|
device_1 = hass.states.get('device_tracker.client_1')
|
||||||
|
assert device_1 is not None
|
||||||
|
Loading…
x
Reference in New Issue
Block a user