Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions homeassistant/components/unifi/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
CONF_BLOCK_CLIENT,
CONF_CONTROLLER,
CONF_DETECTION_TIME,
CONF_DONT_TRACK_CLIENTS,
CONF_DONT_TRACK_DEVICES,
CONF_SITE_ID,
CONF_SSID_FILTER,
CONTROLLER_ID,
Expand All @@ -28,6 +30,8 @@
vol.Optional(CONF_BLOCK_CLIENT, default=[]): vol.All(
cv.ensure_list, [cv.string]
),
vol.Optional(CONF_DONT_TRACK_CLIENTS): cv.boolean,
vol.Optional(CONF_DONT_TRACK_DEVICES): cv.boolean,
vol.Optional(CONF_DETECTION_TIME): vol.All(
cv.time_period, cv.positive_timedelta
),
Expand Down
2 changes: 2 additions & 0 deletions homeassistant/components/unifi/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

CONF_BLOCK_CLIENT = "block_client"
CONF_DETECTION_TIME = "detection_time"
CONF_DONT_TRACK_CLIENTS = "dont_track_clients"
CONF_DONT_TRACK_DEVICES = "dont_track_devices"
CONF_SSID_FILTER = "ssid_filter"

ATTR_MANUFACTURER = "Ubiquiti Networks"
12 changes: 12 additions & 0 deletions homeassistant/components/unifi/controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
from .const import (
CONF_BLOCK_CLIENT,
CONF_CONTROLLER,
CONF_DONT_TRACK_CLIENTS,
CONF_DONT_TRACK_DEVICES,
CONF_SITE_ID,
CONTROLLER_ID,
LOGGER,
Expand Down Expand Up @@ -63,6 +65,16 @@ def block_clients(self):
"""Return list of clients to block."""
return self.unifi_config.get(CONF_BLOCK_CLIENT, [])

@property
def dont_track_clients(self):
"""Return if clients should be tracked."""
return self.unifi_config.get(CONF_DONT_TRACK_CLIENTS, False)
Comment thread
Kane610 marked this conversation as resolved.
Outdated

@property
def dont_track_devices(self):
"""Return if devices should be tracked."""
return self.unifi_config.get(CONF_DONT_TRACK_DEVICES, False)
Comment thread
Kane610 marked this conversation as resolved.
Outdated

@property
def mac(self):
"""Return the mac address of this controller."""
Expand Down
68 changes: 37 additions & 31 deletions homeassistant/components/unifi/device_tracker.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,46 +154,52 @@ def update_items(controller, async_add_entities, tracked):
"""Update tracked device state from the controller."""
new_tracked = []

for client_id in controller.api.clients:
if not controller.dont_track_clients:

if client_id in tracked:
LOGGER.debug(
"Updating UniFi tracked client %s (%s)",
tracked[client_id].entity_id,
tracked[client_id].client.mac,
)
tracked[client_id].async_schedule_update_ha_state()
continue

client = controller.api.clients[client_id]
for client_id in controller.api.clients:

if (
not client.is_wired
and CONF_SSID_FILTER in controller.unifi_config
and client.essid not in controller.unifi_config[CONF_SSID_FILTER]
):
continue
if client_id in tracked:
LOGGER.debug(
"Updating UniFi tracked client %s (%s)",
tracked[client_id].entity_id,
tracked[client_id].client.mac,
)
tracked[client_id].async_schedule_update_ha_state()
continue

tracked[client_id] = UniFiClientTracker(client, controller)
new_tracked.append(tracked[client_id])
LOGGER.debug("New UniFi client tracker %s (%s)", client.hostname, client.mac)
client = controller.api.clients[client_id]

for device_id in controller.api.devices:
if (
not client.is_wired
and CONF_SSID_FILTER in controller.unifi_config
and client.essid not in controller.unifi_config[CONF_SSID_FILTER]
):
continue

if device_id in tracked:
tracked[client_id] = UniFiClientTracker(client, controller)
new_tracked.append(tracked[client_id])
LOGGER.debug(
"Updating UniFi tracked device %s (%s)",
tracked[device_id].entity_id,
tracked[device_id].device.mac,
"New UniFi client tracker %s (%s)", client.hostname, client.mac
)
tracked[device_id].async_schedule_update_ha_state()
continue

device = controller.api.devices[device_id]
if not controller.dont_track_devices:

for device_id in controller.api.devices:

if device_id in tracked:
LOGGER.debug(
"Updating UniFi tracked device %s (%s)",
tracked[device_id].entity_id,
tracked[device_id].device.mac,
)
tracked[device_id].async_schedule_update_ha_state()
continue

device = controller.api.devices[device_id]

tracked[device_id] = UniFiDeviceTracker(device, controller)
new_tracked.append(tracked[device_id])
LOGGER.debug("New UniFi device tracker %s (%s)", device.name, device.mac)
tracked[device_id] = UniFiDeviceTracker(device, controller)
new_tracked.append(tracked[device_id])
LOGGER.debug("New UniFi device tracker %s (%s)", device.name, device.mac)

if new_tracked:
async_add_entities(new_tracked)
Expand Down
39 changes: 38 additions & 1 deletion tests/components/unifi/test_device_tracker.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
CONF_PORT,
CONF_USERNAME,
CONF_VERIFY_SSL,
STATE_UNAVAILABLE,
)
from homeassistant.helpers import entity_registry
from homeassistant.setup import async_setup_component
Expand Down Expand Up @@ -211,7 +212,7 @@ async def test_tracked_devices(hass, mock_controller):
await hass.async_block_till_done()

device_1 = hass.states.get("device_tracker.device_1")
assert device_1.state == "unavailable"
assert device_1.state == STATE_UNAVAILABLE


async def test_restoring_client(hass, mock_controller):
Expand Down Expand Up @@ -243,3 +244,39 @@ async def test_restoring_client(hass, mock_controller):

device_1 = hass.states.get("device_tracker.client_1")
assert device_1 is not None


async def test_dont_track_clients(hass, mock_controller):
"""Test the update_items function with some clients."""
Comment thread
Kane610 marked this conversation as resolved.
Outdated
mock_controller.mock_client_responses.append([CLIENT_1])
mock_controller.mock_device_responses.append([DEVICE_1])
mock_controller.unifi_config = {unifi.CONF_DONT_TRACK_CLIENTS: True}

await setup_controller(hass, mock_controller)
assert len(mock_controller.mock_requests) == 2
assert len(hass.states.async_all()) == 3

client_1 = hass.states.get("device_tracker.client_1")
assert client_1 is None

device_1 = hass.states.get("device_tracker.device_1")
assert device_1 is not None
assert device_1.state == "not_home"


async def test_dont_track_devices(hass, mock_controller):
"""Test the update_items function with some clients."""
Comment thread
Kane610 marked this conversation as resolved.
Outdated
mock_controller.mock_client_responses.append([CLIENT_1])
mock_controller.mock_device_responses.append([DEVICE_1])
mock_controller.unifi_config = {unifi.CONF_DONT_TRACK_DEVICES: True}

await setup_controller(hass, mock_controller)
assert len(mock_controller.mock_requests) == 2
assert len(hass.states.async_all()) == 3

client_1 = hass.states.get("device_tracker.client_1")
assert client_1 is not None
assert client_1.state == "not_home"

device_1 = hass.states.get("device_tracker.device_1")
assert device_1 is None