UniFi WLAN availability affected by WLAN enabled (#98020)

This commit is contained in:
Robert Svensson 2023-08-09 18:52:35 +02:00 committed by GitHub
parent 138854a9cc
commit 02c27d8ad2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 10 deletions

View File

@ -44,6 +44,13 @@ def async_device_available_fn(controller: UniFiController, obj_id: str) -> bool:
return controller.available and not device.disabled return controller.available and not device.disabled
@callback
def async_wlan_available_fn(controller: UniFiController, obj_id: str) -> bool:
"""Check if WLAN is available."""
wlan = controller.api.wlans[obj_id]
return controller.available and wlan.enabled
@callback @callback
def async_device_device_info_fn(api: aiounifi.Controller, obj_id: str) -> DeviceInfo: def async_device_device_info_fn(api: aiounifi.Controller, obj_id: str) -> DeviceInfo:
"""Create device registry entry for device.""" """Create device registry entry for device."""

View File

@ -26,6 +26,7 @@ from .entity import (
HandlerT, HandlerT,
UnifiEntity, UnifiEntity,
UnifiEntityDescription, UnifiEntityDescription,
async_wlan_available_fn,
async_wlan_device_info_fn, async_wlan_device_info_fn,
) )
@ -61,11 +62,11 @@ ENTITY_DESCRIPTIONS: tuple[UnifiImageEntityDescription, ...] = (
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
allowed_fn=lambda controller, obj_id: True, allowed_fn=lambda controller, obj_id: True,
api_handler_fn=lambda api: api.wlans, api_handler_fn=lambda api: api.wlans,
available_fn=lambda controller, _: controller.available, available_fn=async_wlan_available_fn,
device_info_fn=async_wlan_device_info_fn, device_info_fn=async_wlan_device_info_fn,
event_is_on=None, event_is_on=None,
event_to_subscribe=None, event_to_subscribe=None,
name_fn=lambda _: "QR Code", name_fn=lambda wlan: "QR Code",
object_fn=lambda api, obj_id: api.wlans[obj_id], object_fn=lambda api, obj_id: api.wlans[obj_id],
should_poll=False, should_poll=False,
supported_fn=lambda controller, obj_id: True, supported_fn=lambda controller, obj_id: True,

View File

@ -39,6 +39,7 @@ from .entity import (
async_client_device_info_fn, async_client_device_info_fn,
async_device_available_fn, async_device_available_fn,
async_device_device_info_fn, async_device_device_info_fn,
async_wlan_available_fn,
async_wlan_device_info_fn, async_wlan_device_info_fn,
) )
@ -179,16 +180,16 @@ ENTITY_DESCRIPTIONS: tuple[UnifiSensorEntityDescription, ...] = (
key="WLAN clients", key="WLAN clients",
entity_category=EntityCategory.DIAGNOSTIC, entity_category=EntityCategory.DIAGNOSTIC,
has_entity_name=True, has_entity_name=True,
allowed_fn=lambda controller, _: True, allowed_fn=lambda controller, obj_id: True,
api_handler_fn=lambda api: api.wlans, api_handler_fn=lambda api: api.wlans,
available_fn=lambda controller, obj_id: controller.available, available_fn=async_wlan_available_fn,
device_info_fn=async_wlan_device_info_fn, device_info_fn=async_wlan_device_info_fn,
event_is_on=None, event_is_on=None,
event_to_subscribe=None, event_to_subscribe=None,
name_fn=lambda client: None, name_fn=lambda wlan: None,
object_fn=lambda api, obj_id: api.wlans[obj_id], object_fn=lambda api, obj_id: api.wlans[obj_id],
should_poll=True, should_poll=True,
supported_fn=lambda controller, _: True, supported_fn=lambda controller, obj_id: True,
unique_id_fn=lambda controller, obj_id: f"wlan_clients-{obj_id}", unique_id_fn=lambda controller, obj_id: f"wlan_clients-{obj_id}",
value_fn=async_wlan_client_value_fn, value_fn=async_wlan_client_value_fn,
), ),

View File

@ -5,13 +5,12 @@ from datetime import timedelta
from http import HTTPStatus from http import HTTPStatus
from aiounifi.models.message import MessageKey from aiounifi.models.message import MessageKey
from aiounifi.websocket import WebsocketState
from syrupy.assertion import SnapshotAssertion from syrupy.assertion import SnapshotAssertion
from homeassistant.components.image import DOMAIN as IMAGE_DOMAIN from homeassistant.components.image import DOMAIN as IMAGE_DOMAIN
from homeassistant.config_entries import RELOAD_AFTER_UPDATE_DELAY from homeassistant.config_entries import RELOAD_AFTER_UPDATE_DELAY
from homeassistant.const import ( from homeassistant.const import STATE_UNAVAILABLE, EntityCategory
EntityCategory,
)
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er from homeassistant.helpers import entity_registry as er
from homeassistant.helpers.entity_registry import RegistryEntryDisabler from homeassistant.helpers.entity_registry import RegistryEntryDisabler
@ -106,7 +105,7 @@ async def test_wlan_qr_code(
image_state_2 = hass.states.get("image.ssid_1_qr_code") image_state_2 = hass.states.get("image.ssid_1_qr_code")
assert image_state_1.state == image_state_2.state assert image_state_1.state == image_state_2.state
# Update state object - changeed password - new state # Update state object - changed password - new state
data = deepcopy(WLAN) data = deepcopy(WLAN)
data["x_passphrase"] = "new password" data["x_passphrase"] = "new password"
mock_unifi_websocket(message=MessageKey.WLAN_CONF_UPDATED, data=data) mock_unifi_websocket(message=MessageKey.WLAN_CONF_UPDATED, data=data)
@ -120,3 +119,28 @@ async def test_wlan_qr_code(
assert resp.status == HTTPStatus.OK assert resp.status == HTTPStatus.OK
body = await resp.read() body = await resp.read()
assert body == snapshot assert body == snapshot
# Availability signalling
# Controller disconnects
mock_unifi_websocket(state=WebsocketState.DISCONNECTED)
await hass.async_block_till_done()
assert hass.states.get("image.ssid_1_qr_code").state == STATE_UNAVAILABLE
# Controller reconnects
mock_unifi_websocket(state=WebsocketState.RUNNING)
await hass.async_block_till_done()
assert hass.states.get("image.ssid_1_qr_code").state != STATE_UNAVAILABLE
# WLAN gets disabled
wlan_1 = deepcopy(WLAN)
wlan_1["enabled"] = False
mock_unifi_websocket(message=MessageKey.WLAN_CONF_UPDATED, data=wlan_1)
await hass.async_block_till_done()
assert hass.states.get("image.ssid_1_qr_code").state == STATE_UNAVAILABLE
# WLAN gets re-enabled
wlan_1["enabled"] = True
mock_unifi_websocket(message=MessageKey.WLAN_CONF_UPDATED, data=wlan_1)
await hass.async_block_till_done()
assert hass.states.get("image.ssid_1_qr_code").state != STATE_UNAVAILABLE

View File

@ -558,3 +558,16 @@ async def test_wlan_client_sensors(
mock_unifi_websocket(state=WebsocketState.RUNNING) mock_unifi_websocket(state=WebsocketState.RUNNING)
await hass.async_block_till_done() await hass.async_block_till_done()
assert hass.states.get("sensor.ssid_1").state == "0" assert hass.states.get("sensor.ssid_1").state == "0"
# WLAN gets disabled
wlan_1 = deepcopy(WLAN)
wlan_1["enabled"] = False
mock_unifi_websocket(message=MessageKey.WLAN_CONF_UPDATED, data=wlan_1)
await hass.async_block_till_done()
assert hass.states.get("sensor.ssid_1").state == STATE_UNAVAILABLE
# WLAN gets re-enabled
wlan_1["enabled"] = True
mock_unifi_websocket(message=MessageKey.WLAN_CONF_UPDATED, data=wlan_1)
await hass.async_block_till_done()
assert hass.states.get("sensor.ssid_1").state == "0"