Home Assistant Unofficial Reference 2024.12.1
device_tracker.py
Go to the documentation of this file.
1 """Support for FRITZ!Box devices."""
2 
3 from __future__ import annotations
4 
5 import datetime
6 import logging
7 
8 from homeassistant.components.device_tracker import ScannerEntity
9 from homeassistant.config_entries import ConfigEntry
10 from homeassistant.core import HomeAssistant, callback
11 from homeassistant.helpers.dispatcher import async_dispatcher_connect
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 
14 from .const import DATA_FRITZ, DOMAIN
15 from .coordinator import (
16  AvmWrapper,
17  FritzData,
18  FritzDevice,
19  device_filter_out_from_trackers,
20 )
21 from .entity import FritzDeviceBase
22 
23 _LOGGER = logging.getLogger(__name__)
24 
25 
27  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
28 ) -> None:
29  """Set up device tracker for FRITZ!Box component."""
30  _LOGGER.debug("Starting FRITZ!Box device tracker")
31  avm_wrapper: AvmWrapper = hass.data[DOMAIN][entry.entry_id]
32  data_fritz: FritzData = hass.data[DATA_FRITZ]
33 
34  @callback
35  def update_avm_device() -> None:
36  """Update the values of AVM device."""
37  _async_add_entities(avm_wrapper, async_add_entities, data_fritz)
38 
39  entry.async_on_unload(
40  async_dispatcher_connect(hass, avm_wrapper.signal_device_new, update_avm_device)
41  )
42 
43  update_avm_device()
44 
45 
46 @callback
48  avm_wrapper: AvmWrapper,
49  async_add_entities: AddEntitiesCallback,
50  data_fritz: FritzData,
51 ) -> None:
52  """Add new tracker entities from the AVM device."""
53 
54  new_tracked = []
55  if avm_wrapper.unique_id not in data_fritz.tracked:
56  data_fritz.tracked[avm_wrapper.unique_id] = set()
57 
58  for mac, device in avm_wrapper.devices.items():
59  if device_filter_out_from_trackers(mac, device, data_fritz.tracked.values()):
60  continue
61 
62  new_tracked.append(FritzBoxTracker(avm_wrapper, device))
63  data_fritz.tracked[avm_wrapper.unique_id].add(mac)
64 
65  async_add_entities(new_tracked)
66 
67 
68 class FritzBoxTracker(FritzDeviceBase, ScannerEntity):
69  """Class which queries a FRITZ!Box device."""
70 
71  def __init__(self, avm_wrapper: AvmWrapper, device: FritzDevice) -> None:
72  """Initialize a FRITZ!Box device."""
73  super().__init__(avm_wrapper, device)
74  self._last_activity_last_activity: datetime.datetime | None = device.last_activity
75 
76  @property
77  def is_connected(self) -> bool:
78  """Return device status."""
79  return self._avm_wrapper_avm_wrapper.devices[self._mac].is_connected
80 
81  @property
82  def unique_id(self) -> str:
83  """Return device unique id."""
84  return f"{self._mac}_tracker"
85 
86  @property
87  def mac_address(self) -> str:
88  """Return mac_address."""
89  return self._mac
90 
91  @property
92  def icon(self) -> str:
93  """Return device icon."""
94  if self.is_connectedis_connected:
95  return "mdi:lan-connect"
96  return "mdi:lan-disconnect"
97 
98  @property
99  def extra_state_attributes(self) -> dict[str, str]:
100  """Return the attributes."""
101  attrs: dict[str, str] = {}
102  device = self._avm_wrapper_avm_wrapper.devices[self._mac]
103  self._last_activity_last_activity = device.last_activity
104  if self._last_activity_last_activity is not None:
105  attrs["last_time_reachable"] = self._last_activity_last_activity.isoformat(
106  timespec="seconds"
107  )
108  if device.connected_to:
109  attrs["connected_to"] = device.connected_to
110  if device.connection_type:
111  attrs["connection_type"] = device.connection_type
112  if device.ssid:
113  attrs["ssid"] = device.ssid
114  return attrs
None __init__(self, AvmWrapper avm_wrapper, FritzDevice device)
bool add(self, _T matcher)
Definition: match.py:185
bool device_filter_out_from_trackers(str mac, FritzDevice device, ValuesView current_devices)
Definition: coordinator.py:65
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
None _async_add_entities(AvmWrapper avm_wrapper, AddEntitiesCallback async_add_entities, FritzData data_fritz)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103