Home Assistant Unofficial Reference 2024.12.1
device_tracker.py
Go to the documentation of this file.
1 """Support for Ruckus devices."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from homeassistant.components.device_tracker import ScannerEntity
8 from homeassistant.config_entries import ConfigEntry
9 from homeassistant.core import HomeAssistant, callback
10 from homeassistant.helpers import entity_registry as er
11 from homeassistant.helpers.entity_platform import AddEntitiesCallback
12 from homeassistant.helpers.update_coordinator import CoordinatorEntity
13 
14 from .const import (
15  API_CLIENT_HOSTNAME,
16  API_CLIENT_IP,
17  COORDINATOR,
18  DOMAIN,
19  KEY_SYS_CLIENTS,
20  UNDO_UPDATE_LISTENERS,
21 )
22 from .coordinator import RuckusDataUpdateCoordinator
23 
24 _LOGGER = logging.getLogger(__package__)
25 
26 
28  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
29 ) -> None:
30  """Set up device tracker for Ruckus component."""
31  coordinator = hass.data[DOMAIN][entry.entry_id][COORDINATOR]
32 
33  tracked: set[str] = set()
34 
35  @callback
36  def router_update():
37  """Update the values of the router."""
38  add_new_entities(coordinator, async_add_entities, tracked)
39 
40  router_update()
41 
42  hass.data[DOMAIN][entry.entry_id][UNDO_UPDATE_LISTENERS].append(
43  coordinator.async_add_listener(router_update)
44  )
45 
46  registry = er.async_get(hass)
47  restore_entities(registry, coordinator, entry, async_add_entities, tracked)
48 
49 
50 @callback
51 def add_new_entities(coordinator, async_add_entities, tracked):
52  """Add new tracker entities from the router."""
53  new_tracked = []
54 
55  for mac in coordinator.data[KEY_SYS_CLIENTS]:
56  if mac in tracked:
57  continue
58 
59  device = coordinator.data[KEY_SYS_CLIENTS][mac]
60  _LOGGER.debug("adding new device: [%s] %s", mac, device[API_CLIENT_HOSTNAME])
61  new_tracked.append(RuckusDevice(coordinator, mac, device[API_CLIENT_HOSTNAME]))
62  tracked.add(mac)
63 
64  async_add_entities(new_tracked)
65 
66 
67 @callback
69  registry: er.EntityRegistry,
70  coordinator: RuckusDataUpdateCoordinator,
71  entry: ConfigEntry,
72  async_add_entities: AddEntitiesCallback,
73  tracked: set[str],
74 ) -> None:
75  """Restore clients that are not a part of active clients list."""
76  missing: list[RuckusDevice] = []
77 
78  for entity in registry.entities.get_entries_for_config_entry_id(entry.entry_id):
79  if (
80  entity.platform == DOMAIN
81  and entity.unique_id not in coordinator.data[KEY_SYS_CLIENTS]
82  ):
83  missing.append(
84  RuckusDevice(coordinator, entity.unique_id, entity.original_name)
85  )
86  tracked.add(entity.unique_id)
87 
88  _LOGGER.debug("added %d missing devices", len(missing))
89  async_add_entities(missing)
90 
91 
92 class RuckusDevice(CoordinatorEntity, ScannerEntity):
93  """Representation of a Ruckus client."""
94 
95  def __init__(self, coordinator, mac, name) -> None:
96  """Initialize a Ruckus client."""
97  super().__init__(coordinator)
98  self._mac_mac = mac
99  self._name_name = name
100 
101  @property
102  def mac_address(self) -> str:
103  """Return a mac address."""
104  return self._mac_mac
105 
106  @property
107  def name(self) -> str:
108  """Return the name."""
109  if not self.is_connectedis_connected:
110  return self._name_name
111  return self.coordinator.data[KEY_SYS_CLIENTS][self._mac_mac][API_CLIENT_HOSTNAME]
112 
113  @property
114  def ip_address(self) -> str | None:
115  """Return the ip address."""
116  if not self.is_connectedis_connected:
117  return None
118  return self.coordinator.data[KEY_SYS_CLIENTS][self._mac_mac][API_CLIENT_IP]
119 
120  @property
121  def is_connected(self) -> bool:
122  """Return true if the device is connected to the network."""
123  return self._mac_mac in self.coordinator.data[KEY_SYS_CLIENTS]
def add_new_entities(coordinator, async_add_entities, tracked)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
None restore_entities(er.EntityRegistry registry, RuckusDataUpdateCoordinator coordinator, ConfigEntry entry, AddEntitiesCallback async_add_entities, set[str] tracked)