Home Assistant Unofficial Reference 2024.12.1
device_tracker.py
Go to the documentation of this file.
1 """Device tracker support for OPNSense routers."""
2 
3 from __future__ import annotations
4 
5 from homeassistant.components.device_tracker import DeviceScanner
6 from homeassistant.core import HomeAssistant
7 from homeassistant.helpers.typing import ConfigType
8 
9 from . import CONF_TRACKER_INTERFACE, OPNSENSE_DATA
10 
11 
13  hass: HomeAssistant, config: ConfigType
14 ) -> OPNSenseDeviceScanner:
15  """Configure the OPNSense device_tracker."""
16  interface_client = hass.data[OPNSENSE_DATA]["interfaces"]
17  return OPNSenseDeviceScanner(
18  interface_client, hass.data[OPNSENSE_DATA][CONF_TRACKER_INTERFACE]
19  )
20 
21 
22 class OPNSenseDeviceScanner(DeviceScanner):
23  """Class which queries a router running OPNsense."""
24 
25  def __init__(self, client, interfaces):
26  """Initialize the scanner."""
27  self.last_resultslast_results = {}
28  self.clientclient = client
29  self.interfacesinterfaces = interfaces
30 
31  def _get_mac_addrs(self, devices):
32  """Create dict with mac address keys from list of devices."""
33  out_devices = {}
34  for device in devices:
35  if not self.interfacesinterfaces or device["intf_description"] in self.interfacesinterfaces:
36  out_devices[device["mac"]] = device
37  return out_devices
38 
39  def scan_devices(self):
40  """Scan for new devices and return a list with found device IDs."""
41  self.update_infoupdate_info()
42  return list(self.last_resultslast_results)
43 
44  def get_device_name(self, device):
45  """Return the name of the given device or None if we don't know."""
46  if device not in self.last_resultslast_results:
47  return None
48  return self.last_resultslast_results[device].get("hostname") or None
49 
50  def update_info(self):
51  """Ensure the information from the OPNSense router is up to date.
52 
53  Return boolean if scanning successful.
54  """
55 
56  devices = self.clientclient.get_arp()
57  self.last_resultslast_results = self._get_mac_addrs_get_mac_addrs(devices)
58 
59  def get_extra_attributes(self, device):
60  """Return the extra attrs of the given device."""
61  if device not in self.last_resultslast_results:
62  return None
63  if not (mfg := self.last_resultslast_results[device].get("manufacturer")):
64  return {}
65  return {"manufacturer": mfg}
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
OPNSenseDeviceScanner async_get_scanner(HomeAssistant hass, ConfigType config)