Fritz honor sys option pref_disable_new_entities (#56740)
This commit is contained in:
parent
4513a46248
commit
34ef47db55
3 changed files with 66 additions and 23 deletions
|
@ -1,6 +1,7 @@
|
||||||
"""Support for AVM FRITZ!Box classes."""
|
"""Support for AVM FRITZ!Box classes."""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from collections.abc import ValuesView
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
import logging
|
import logging
|
||||||
|
@ -42,6 +43,36 @@ from .const import (
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def _is_tracked(mac: str, current_devices: ValuesView) -> bool:
|
||||||
|
"""Check if device is already tracked."""
|
||||||
|
for tracked in current_devices:
|
||||||
|
if mac in tracked:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def device_filter_out_from_trackers(
|
||||||
|
mac: str,
|
||||||
|
device: FritzDevice,
|
||||||
|
pref_disable_new_entities: bool,
|
||||||
|
current_devices: ValuesView,
|
||||||
|
) -> bool:
|
||||||
|
"""Check if device should be filtered out from trackers."""
|
||||||
|
reason: str | None = None
|
||||||
|
if device.ip_address == "":
|
||||||
|
reason = "Missing IP"
|
||||||
|
elif _is_tracked(mac, current_devices):
|
||||||
|
reason = "Already tracked"
|
||||||
|
elif pref_disable_new_entities:
|
||||||
|
reason = "Disabled System Options"
|
||||||
|
|
||||||
|
if reason:
|
||||||
|
_LOGGER.debug(
|
||||||
|
"Skip adding device %s [%s], reason: %s", device.hostname, mac, reason
|
||||||
|
)
|
||||||
|
return bool(reason)
|
||||||
|
|
||||||
|
|
||||||
class ClassSetupMissing(Exception):
|
class ClassSetupMissing(Exception):
|
||||||
"""Raised when a Class func is called before setup."""
|
"""Raised when a Class func is called before setup."""
|
||||||
|
|
||||||
|
@ -170,7 +201,7 @@ class FritzBoxTools:
|
||||||
return self._unique_id
|
return self._unique_id
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def devices(self) -> dict[str, Any]:
|
def devices(self) -> dict[str, FritzDevice]:
|
||||||
"""Return devices."""
|
"""Return devices."""
|
||||||
return self._devices
|
return self._devices
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,13 @@ from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
|
|
||||||
from .common import FritzBoxTools, FritzData, FritzDevice, FritzDeviceBase
|
from .common import (
|
||||||
|
FritzBoxTools,
|
||||||
|
FritzData,
|
||||||
|
FritzDevice,
|
||||||
|
FritzDeviceBase,
|
||||||
|
device_filter_out_from_trackers,
|
||||||
|
)
|
||||||
from .const import DATA_FRITZ, DOMAIN
|
from .const import DATA_FRITZ, DOMAIN
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
@ -74,7 +80,9 @@ async def async_setup_entry(
|
||||||
@callback
|
@callback
|
||||||
def update_router() -> None:
|
def update_router() -> None:
|
||||||
"""Update the values of the router."""
|
"""Update the values of the router."""
|
||||||
_async_add_entities(router, async_add_entities, data_fritz)
|
_async_add_entities(
|
||||||
|
router, async_add_entities, data_fritz, entry.pref_disable_new_entities
|
||||||
|
)
|
||||||
|
|
||||||
entry.async_on_unload(
|
entry.async_on_unload(
|
||||||
async_dispatcher_connect(hass, router.signal_device_new, update_router)
|
async_dispatcher_connect(hass, router.signal_device_new, update_router)
|
||||||
|
@ -88,22 +96,18 @@ def _async_add_entities(
|
||||||
router: FritzBoxTools,
|
router: FritzBoxTools,
|
||||||
async_add_entities: AddEntitiesCallback,
|
async_add_entities: AddEntitiesCallback,
|
||||||
data_fritz: FritzData,
|
data_fritz: FritzData,
|
||||||
|
pref_disable_new_entities: bool,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Add new tracker entities from the router."""
|
"""Add new tracker entities from the router."""
|
||||||
|
|
||||||
def _is_tracked(mac: str) -> bool:
|
|
||||||
for tracked in data_fritz.tracked.values():
|
|
||||||
if mac in tracked:
|
|
||||||
return True
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
new_tracked = []
|
new_tracked = []
|
||||||
if router.unique_id not in data_fritz.tracked:
|
if router.unique_id not in data_fritz.tracked:
|
||||||
data_fritz.tracked[router.unique_id] = set()
|
data_fritz.tracked[router.unique_id] = set()
|
||||||
|
|
||||||
for mac, device in router.devices.items():
|
for mac, device in router.devices.items():
|
||||||
if device.ip_address == "" or _is_tracked(mac):
|
if device_filter_out_from_trackers(
|
||||||
|
mac, device, pref_disable_new_entities, data_fritz.tracked.values()
|
||||||
|
):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
new_tracked.append(FritzBoxTracker(router, device))
|
new_tracked.append(FritzBoxTracker(router, device))
|
||||||
|
|
|
@ -31,6 +31,7 @@ from .common import (
|
||||||
FritzDevice,
|
FritzDevice,
|
||||||
FritzDeviceBase,
|
FritzDeviceBase,
|
||||||
SwitchInfo,
|
SwitchInfo,
|
||||||
|
device_filter_out_from_trackers,
|
||||||
)
|
)
|
||||||
from .const import (
|
from .const import (
|
||||||
DATA_FRITZ,
|
DATA_FRITZ,
|
||||||
|
@ -267,17 +268,12 @@ def wifi_entities_list(
|
||||||
|
|
||||||
|
|
||||||
def profile_entities_list(
|
def profile_entities_list(
|
||||||
router: FritzBoxTools, data_fritz: FritzData
|
router: FritzBoxTools,
|
||||||
|
data_fritz: FritzData,
|
||||||
|
pref_disable_new_entities: bool,
|
||||||
) -> list[FritzBoxProfileSwitch]:
|
) -> list[FritzBoxProfileSwitch]:
|
||||||
"""Add new tracker entities from the router."""
|
"""Add new tracker entities from the router."""
|
||||||
|
|
||||||
def _is_tracked(mac: str) -> bool:
|
|
||||||
for tracked in data_fritz.profile_switches.values():
|
|
||||||
if mac in tracked:
|
|
||||||
return True
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
new_profiles: list[FritzBoxProfileSwitch] = []
|
new_profiles: list[FritzBoxProfileSwitch] = []
|
||||||
|
|
||||||
if "X_AVM-DE_HostFilter1" not in router.connection.services:
|
if "X_AVM-DE_HostFilter1" not in router.connection.services:
|
||||||
|
@ -287,7 +283,9 @@ def profile_entities_list(
|
||||||
data_fritz.profile_switches[router.unique_id] = set()
|
data_fritz.profile_switches[router.unique_id] = set()
|
||||||
|
|
||||||
for mac, device in router.devices.items():
|
for mac, device in router.devices.items():
|
||||||
if device.ip_address == "" or _is_tracked(mac):
|
if device_filter_out_from_trackers(
|
||||||
|
mac, device, pref_disable_new_entities, data_fritz.profile_switches.values()
|
||||||
|
):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
new_profiles.append(FritzBoxProfileSwitch(router, device))
|
new_profiles.append(FritzBoxProfileSwitch(router, device))
|
||||||
|
@ -301,13 +299,14 @@ def all_entities_list(
|
||||||
device_friendly_name: str,
|
device_friendly_name: str,
|
||||||
data_fritz: FritzData,
|
data_fritz: FritzData,
|
||||||
local_ip: str,
|
local_ip: str,
|
||||||
|
pref_disable_new_entities: bool,
|
||||||
) -> list[Entity]:
|
) -> list[Entity]:
|
||||||
"""Get a list of all entities."""
|
"""Get a list of all entities."""
|
||||||
return [
|
return [
|
||||||
*deflection_entities_list(fritzbox_tools, device_friendly_name),
|
*deflection_entities_list(fritzbox_tools, device_friendly_name),
|
||||||
*port_entities_list(fritzbox_tools, device_friendly_name, local_ip),
|
*port_entities_list(fritzbox_tools, device_friendly_name, local_ip),
|
||||||
*wifi_entities_list(fritzbox_tools, device_friendly_name),
|
*wifi_entities_list(fritzbox_tools, device_friendly_name),
|
||||||
*profile_entities_list(fritzbox_tools, data_fritz),
|
*profile_entities_list(fritzbox_tools, data_fritz, pref_disable_new_entities),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -326,7 +325,12 @@ async def async_setup_entry(
|
||||||
)
|
)
|
||||||
|
|
||||||
entities_list = await hass.async_add_executor_job(
|
entities_list = await hass.async_add_executor_job(
|
||||||
all_entities_list, fritzbox_tools, entry.title, data_fritz, local_ip
|
all_entities_list,
|
||||||
|
fritzbox_tools,
|
||||||
|
entry.title,
|
||||||
|
data_fritz,
|
||||||
|
local_ip,
|
||||||
|
entry.pref_disable_new_entities,
|
||||||
)
|
)
|
||||||
|
|
||||||
async_add_entities(entities_list)
|
async_add_entities(entities_list)
|
||||||
|
@ -334,7 +338,11 @@ async def async_setup_entry(
|
||||||
@callback
|
@callback
|
||||||
def update_router() -> None:
|
def update_router() -> None:
|
||||||
"""Update the values of the router."""
|
"""Update the values of the router."""
|
||||||
async_add_entities(profile_entities_list(fritzbox_tools, data_fritz))
|
async_add_entities(
|
||||||
|
profile_entities_list(
|
||||||
|
fritzbox_tools, data_fritz, entry.pref_disable_new_entities
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
entry.async_on_unload(
|
entry.async_on_unload(
|
||||||
async_dispatcher_connect(hass, fritzbox_tools.signal_device_new, update_router)
|
async_dispatcher_connect(hass, fritzbox_tools.signal_device_new, update_router)
|
||||||
|
|
Loading…
Add table
Reference in a new issue