UniFi - Make clients proper push based (#35273)
* Improve client tracker to be more comprehensible and streamlined Improve block switches Improve tests * Small clean up * Add descriptions on ssid test * Improve test * Make polling default off, only POE clients left to verify * Minor improvements * On removal cancel scheduled updates * POE works without polling now * Combine else and if to an elif
This commit is contained in:
parent
efb52961f0
commit
c8deae6445
6 changed files with 367 additions and 168 deletions
|
@ -2,37 +2,12 @@
|
|||
|
||||
import logging
|
||||
|
||||
from aiounifi.api import SOURCE_EVENT
|
||||
from aiounifi.events import (
|
||||
WIRED_CLIENT_BLOCKED,
|
||||
WIRED_CLIENT_CONNECTED,
|
||||
WIRED_CLIENT_DISCONNECTED,
|
||||
WIRED_CLIENT_UNBLOCKED,
|
||||
WIRELESS_CLIENT_BLOCKED,
|
||||
WIRELESS_CLIENT_CONNECTED,
|
||||
WIRELESS_CLIENT_DISCONNECTED,
|
||||
WIRELESS_CLIENT_ROAM,
|
||||
WIRELESS_CLIENT_ROAMRADIO,
|
||||
WIRELESS_CLIENT_UNBLOCKED,
|
||||
)
|
||||
|
||||
from homeassistant.core import callback
|
||||
from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC
|
||||
|
||||
from .unifi_entity_base import UniFiBase
|
||||
|
||||
LOGGER = logging.getLogger(__name__)
|
||||
|
||||
CLIENT_BLOCKED = (WIRED_CLIENT_BLOCKED, WIRELESS_CLIENT_BLOCKED)
|
||||
CLIENT_UNBLOCKED = (WIRED_CLIENT_UNBLOCKED, WIRELESS_CLIENT_UNBLOCKED)
|
||||
WIRED_CLIENT = (WIRED_CLIENT_CONNECTED, WIRED_CLIENT_DISCONNECTED)
|
||||
WIRELESS_CLIENT = (
|
||||
WIRELESS_CLIENT_CONNECTED,
|
||||
WIRELESS_CLIENT_DISCONNECTED,
|
||||
WIRELESS_CLIENT_ROAM,
|
||||
WIRELESS_CLIENT_ROAMRADIO,
|
||||
)
|
||||
|
||||
|
||||
class UniFiClient(UniFiBase):
|
||||
"""Base class for UniFi clients."""
|
||||
|
@ -43,9 +18,6 @@ class UniFiClient(UniFiBase):
|
|||
super().__init__(controller)
|
||||
|
||||
self._is_wired = self.client.mac not in controller.wireless_clients
|
||||
self.is_blocked = self.client.blocked
|
||||
self.wired_connection = None
|
||||
self.wireless_connection = None
|
||||
|
||||
@property
|
||||
def mac(self):
|
||||
|
@ -59,33 +31,8 @@ class UniFiClient(UniFiBase):
|
|||
|
||||
async def async_will_remove_from_hass(self) -> None:
|
||||
"""Disconnect client object when removed."""
|
||||
await super().async_will_remove_from_hass()
|
||||
self.client.remove_callback(self.async_update_callback)
|
||||
|
||||
@callback
|
||||
def async_update_callback(self) -> None:
|
||||
"""Update the clients state."""
|
||||
if self._is_wired and self.client.mac in self.controller.wireless_clients:
|
||||
self._is_wired = False
|
||||
|
||||
if self.client.last_updated == SOURCE_EVENT:
|
||||
if self.client.event.event in WIRELESS_CLIENT:
|
||||
self.wireless_connection = self.client.event.event in (
|
||||
WIRELESS_CLIENT_CONNECTED,
|
||||
WIRELESS_CLIENT_ROAM,
|
||||
WIRELESS_CLIENT_ROAMRADIO,
|
||||
)
|
||||
|
||||
elif self.client.event.event in WIRED_CLIENT:
|
||||
self.wired_connection = (
|
||||
self.client.event.event == WIRED_CLIENT_CONNECTED
|
||||
)
|
||||
|
||||
elif self.client.event.event in CLIENT_BLOCKED + CLIENT_UNBLOCKED:
|
||||
self.is_blocked = self.client.event.event in CLIENT_BLOCKED
|
||||
|
||||
LOGGER.debug("Updating client %s (%s)", self.entity_id, self.client.mac)
|
||||
self.async_write_ha_state()
|
||||
await super().async_will_remove_from_hass()
|
||||
|
||||
@property
|
||||
def is_wired(self):
|
||||
|
@ -93,6 +40,9 @@ class UniFiClient(UniFiBase):
|
|||
|
||||
Allows disabling logic to keep track of clients affected by UniFi wired bug marking wireless devices as wired. This is useful when running a network not only containing UniFi APs.
|
||||
"""
|
||||
if self._is_wired and self.client.mac in self.controller.wireless_clients:
|
||||
self._is_wired = False
|
||||
|
||||
if self.controller.option_ignore_wired_bug:
|
||||
return self.client.is_wired
|
||||
return self._is_wired
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue