Home Assistant Unofficial Reference 2024.12.1
device_tracker.py
Go to the documentation of this file.
1 """Support for ClearPass Policy Manager."""
2 
3 from __future__ import annotations
4 
5 from datetime import timedelta
6 import logging
7 
8 from clearpasspy import ClearPass
9 import voluptuous as vol
10 
12  DOMAIN as DEVICE_TRACKER_DOMAIN,
13  PLATFORM_SCHEMA as DEVICE_TRACKER_PLATFORM_SCHEMA,
14  DeviceScanner,
15 )
16 from homeassistant.const import CONF_API_KEY, CONF_CLIENT_ID, CONF_HOST
17 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers.typing import ConfigType
20 
21 SCAN_INTERVAL = timedelta(seconds=120)
22 
23 GRANT_TYPE = "client_credentials"
24 
25 PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend(
26  {
27  vol.Required(CONF_HOST): cv.string,
28  vol.Required(CONF_CLIENT_ID): cv.string,
29  vol.Required(CONF_API_KEY): cv.string,
30  }
31 )
32 
33 _LOGGER = logging.getLogger(__name__)
34 
35 
36 def get_scanner(hass: HomeAssistant, config: ConfigType) -> CPPMDeviceScanner | None:
37  """Initialize Scanner."""
38 
39  config = config[DEVICE_TRACKER_DOMAIN]
40 
41  data = {
42  "server": config[CONF_HOST],
43  "grant_type": GRANT_TYPE,
44  "secret": config[CONF_API_KEY],
45  "client": config[CONF_CLIENT_ID],
46  }
47  cppm = ClearPass(data)
48  if cppm.access_token is None:
49  return None
50  _LOGGER.debug("Successfully received Access Token")
51  return CPPMDeviceScanner(cppm)
52 
53 
54 class CPPMDeviceScanner(DeviceScanner):
55  """Initialize class."""
56 
57  def __init__(self, cppm):
58  """Initialize class."""
59  self._cppm_cppm = cppm
60  self.resultsresults = None
61 
62  def scan_devices(self):
63  """Initialize scanner."""
64  self.get_cppm_dataget_cppm_data()
65  return [device["mac"] for device in self.resultsresults]
66 
67  def get_device_name(self, device):
68  """Retrieve device name."""
69  return next(
70  (result["name"] for result in self.resultsresults if result["mac"] == device), None
71  )
72 
73  def get_cppm_data(self):
74  """Retrieve data from Aruba Clearpass and return parsed result."""
75  endpoints = self._cppm_cppm.get_endpoints(100)["_embedded"]["items"]
76  devices = []
77  for item in endpoints:
78  if self._cppm_cppm.online_status(item["mac_address"]):
79  device = {"mac": item["mac_address"], "name": item["mac_address"]}
80  devices.append(device)
81  else:
82  continue
83  _LOGGER.debug("Devices: %s", devices)
84  self.resultsresults = devices
CPPMDeviceScanner|None get_scanner(HomeAssistant hass, ConfigType config)