Home Assistant Unofficial Reference 2024.12.1
device_tracker.py
Go to the documentation of this file.
1 """Support for ASUSWRT routers."""
2 
3 from __future__ import annotations
4 
5 from homeassistant.components.device_tracker import ScannerEntity
6 from homeassistant.core import HomeAssistant, callback
7 from homeassistant.helpers.dispatcher import async_dispatcher_connect
8 from homeassistant.helpers.entity_platform import AddEntitiesCallback
9 
10 from . import AsusWrtConfigEntry
11 from .router import AsusWrtDevInfo, AsusWrtRouter
12 
13 ATTR_LAST_TIME_REACHABLE = "last_time_reachable"
14 
15 DEFAULT_DEVICE_NAME = "Unknown device"
16 
17 
19  hass: HomeAssistant,
20  entry: AsusWrtConfigEntry,
21  async_add_entities: AddEntitiesCallback,
22 ) -> None:
23  """Set up device tracker for AsusWrt component."""
24  router = entry.runtime_data
25  tracked: set = set()
26 
27  @callback
28  def update_router() -> None:
29  """Update the values of the router."""
30  add_entities(router, async_add_entities, tracked)
31 
32  router.async_on_close(
33  async_dispatcher_connect(hass, router.signal_device_new, update_router)
34  )
35 
36  update_router()
37 
38 
39 @callback
41  router: AsusWrtRouter, async_add_entities: AddEntitiesCallback, tracked: set[str]
42 ) -> None:
43  """Add new tracker entities from the router."""
44  new_tracked = []
45 
46  for mac, device in router.devices.items():
47  if mac in tracked:
48  continue
49 
50  new_tracked.append(AsusWrtDevice(router, device))
51  tracked.add(mac)
52 
53  async_add_entities(new_tracked)
54 
55 
56 class AsusWrtDevice(ScannerEntity):
57  """Representation of a AsusWrt device."""
58 
59  _unrecorded_attributes = frozenset({ATTR_LAST_TIME_REACHABLE})
60 
61  _attr_should_poll = False
62 
63  def __init__(self, router: AsusWrtRouter, device: AsusWrtDevInfo) -> None:
64  """Initialize a AsusWrt device."""
65  self._router_router = router
66  self._device_device = device
67  self._attr_name_attr_name = device.name or DEFAULT_DEVICE_NAME
68 
69  @property
70  def is_connected(self) -> bool:
71  """Return true if the device is connected to the network."""
72  return self._device_device.is_connected
73 
74  @property
75  def hostname(self) -> str | None:
76  """Return the hostname of device."""
77  return self._device_device.name
78 
79  @property
80  def icon(self) -> str:
81  """Return device icon."""
82  return "mdi:lan-connect" if self._device_device.is_connected else "mdi:lan-disconnect"
83 
84  @property
85  def ip_address(self) -> str | None:
86  """Return the primary ip address of the device."""
87  return self._device_device.ip_address
88 
89  @property
90  def mac_address(self) -> str:
91  """Return the mac address of the device."""
92  return self._device_device.mac
93 
94  @callback
95  def async_on_demand_update(self) -> None:
96  """Update state."""
97  self._device_device = self._router_router.devices[self._device_device.mac]
98  self._attr_extra_state_attributes_attr_extra_state_attributes = {}
99  if self._device_device.last_activity:
100  self._attr_extra_state_attributes_attr_extra_state_attributes[ATTR_LAST_TIME_REACHABLE] = (
101  self._device_device.last_activity.isoformat(timespec="seconds")
102  )
103  self.async_write_ha_state()
104 
105  async def async_added_to_hass(self) -> None:
106  """Register state update callback."""
107  self.async_on_remove(
109  self.hass,
110  self._router_router.signal_device_update,
111  self.async_on_demand_updateasync_on_demand_update,
112  )
113  )
None __init__(self, AsusWrtRouter router, AsusWrtDevInfo device)
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
None async_setup_entry(HomeAssistant hass, AsusWrtConfigEntry entry, AddEntitiesCallback async_add_entities)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103