Home Assistant Unofficial Reference 2024.12.1
device_tracker.py
Go to the documentation of this file.
1 """Support for Netgear routers."""
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.entity_platform import AddEntitiesCallback
11 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
12 
13 from .const import DEVICE_ICONS, DOMAIN, KEY_COORDINATOR, KEY_ROUTER
14 from .entity import NetgearDeviceEntity
15 from .router import NetgearRouter
16 
17 _LOGGER = logging.getLogger(__name__)
18 
19 
21  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
22 ) -> None:
23  """Set up device tracker for Netgear component."""
24  router = hass.data[DOMAIN][entry.entry_id][KEY_ROUTER]
25  coordinator = hass.data[DOMAIN][entry.entry_id][KEY_COORDINATOR]
26  tracked = set()
27 
28  @callback
29  def new_device_callback() -> None:
30  """Add new devices if needed."""
31  if not coordinator.data:
32  return
33 
34  new_entities = []
35 
36  for mac, device in router.devices.items():
37  if mac in tracked:
38  continue
39 
40  new_entities.append(NetgearScannerEntity(coordinator, router, device))
41  tracked.add(mac)
42 
43  async_add_entities(new_entities)
44 
45  entry.async_on_unload(coordinator.async_add_listener(new_device_callback))
46 
47  coordinator.data = True
48  new_device_callback()
49 
50 
52  """Representation of a device connected to a Netgear router."""
53 
54  _attr_has_entity_name = False
55 
56  def __init__(
57  self, coordinator: DataUpdateCoordinator, router: NetgearRouter, device: dict
58  ) -> None:
59  """Initialize a Netgear device."""
60  super().__init__(coordinator, router, device)
61  self._hostname_hostname = self.get_hostnameget_hostname()
62  self._icon_icon = DEVICE_ICONS.get(device["device_type"], "mdi:help-network")
63  self._attr_name_attr_name = self._device_name_device_name
64 
65  def get_hostname(self) -> str | None:
66  """Return the hostname of the given device or None if we don't know."""
67  if (hostname := self._device_device_device["name"]) == "--":
68  return None
69 
70  return hostname
71 
72  @callback
73  def async_update_device(self) -> None:
74  """Update the Netgear device."""
75  self._device_device_device = self._router_router.devices[self._mac_mac]
76  self._active_active_active = self._device_device_device["active"]
77  self._icon_icon = DEVICE_ICONS.get(self._device_device_device["device_type"], "mdi:help-network")
78 
79  @property
80  def is_connected(self) -> bool:
81  """Return true if the device is connected to the router."""
82  return self._active_active_active
83 
84  @property
85  def ip_address(self) -> str:
86  """Return the IP address."""
87  return self._device_device_device["ip"]
88 
89  @property
90  def mac_address(self) -> str:
91  """Return the mac address."""
92  return self._mac_mac
93 
94  @property
95  def hostname(self) -> str | None:
96  """Return the hostname."""
97  return self._hostname_hostname
98 
99  @property
100  def icon(self) -> str:
101  """Return the icon."""
102  return self._icon_icon
None __init__(self, DataUpdateCoordinator coordinator, NetgearRouter router, dict device)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)