Home Assistant Unofficial Reference 2024.12.1
device_tracker.py
Go to the documentation of this file.
1 """Support for Freebox devices (Freebox v6 and Freebox mini 4K)."""
2 
3 from __future__ import annotations
4 
5 from datetime import datetime
6 from typing import Any
7 
8 from homeassistant.components.device_tracker import ScannerEntity
9 from homeassistant.config_entries import ConfigEntry
10 from homeassistant.core import HomeAssistant, callback
11 from homeassistant.helpers.dispatcher import async_dispatcher_connect
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 
14 from .const import DEFAULT_DEVICE_NAME, DEVICE_ICONS, DOMAIN
15 from .router import FreeboxRouter
16 
17 
19  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
20 ) -> None:
21  """Set up device tracker for Freebox component."""
22  router: FreeboxRouter = hass.data[DOMAIN][entry.unique_id]
23  tracked: set[str] = set()
24 
25  @callback
26  def update_router() -> None:
27  """Update the values of the router."""
28  add_entities(router, async_add_entities, tracked)
29 
30  entry.async_on_unload(
31  async_dispatcher_connect(hass, router.signal_device_new, update_router)
32  )
33 
34  update_router()
35 
36 
37 @callback
39  router: FreeboxRouter, async_add_entities: AddEntitiesCallback, tracked: set[str]
40 ) -> None:
41  """Add new tracker entities from the router."""
42  new_tracked = []
43 
44  for mac, device in router.devices.items():
45  if mac in tracked:
46  continue
47 
48  new_tracked.append(FreeboxDevice(router, device))
49  tracked.add(mac)
50 
51  async_add_entities(new_tracked, True)
52 
53 
54 class FreeboxDevice(ScannerEntity):
55  """Representation of a Freebox device."""
56 
57  _attr_should_poll = False
58 
59  def __init__(self, router: FreeboxRouter, device: dict[str, Any]) -> None:
60  """Initialize a Freebox device."""
61  self._router_router = router
62  self._name_name = device["primary_name"].strip() or DEFAULT_DEVICE_NAME
63  self._mac_mac = device["l2ident"]["id"]
64  self._manufacturer_manufacturer = device["vendor_name"]
65  self._attr_icon_attr_icon = icon_for_freebox_device(device)
66  self._active_active = False
67  self._attr_extra_state_attributes_attr_extra_state_attributes: dict[str, Any] = {}
68 
69  @callback
70  def async_update_state(self) -> None:
71  """Update the Freebox device."""
72  device = self._router_router.devices[self._mac_mac]
73  self._active_active = device["active"]
74  if device.get("attrs") is None:
75  # device
76  self._attr_extra_state_attributes_attr_extra_state_attributes = {
77  "last_time_reachable": datetime.fromtimestamp(
78  device["last_time_reachable"]
79  ),
80  "last_time_activity": datetime.fromtimestamp(device["last_activity"]),
81  }
82  else:
83  # router
84  self._attr_extra_state_attributes_attr_extra_state_attributes = device["attrs"]
85 
86  @property
87  def mac_address(self) -> str:
88  """Return a unique ID."""
89  return self._mac_mac
90 
91  @property
92  def name(self) -> str:
93  """Return the name."""
94  return self._name_name
95 
96  @property
97  def is_connected(self) -> bool:
98  """Return true if the device is connected to the network."""
99  return self._active_active
100 
101  @callback
102  def async_on_demand_update(self) -> None:
103  """Update state."""
104  self.async_update_stateasync_update_state()
105  self.async_write_ha_state()
106 
107  async def async_added_to_hass(self) -> None:
108  """Register state update callback."""
109  self.async_update_stateasync_update_state()
110  self.async_on_remove(
112  self.hass,
113  self._router_router.signal_device_update,
114  self.async_on_demand_updateasync_on_demand_update,
115  )
116  )
117 
118 
119 def icon_for_freebox_device(device: dict[str, Any]) -> str:
120  """Return a device icon from its type."""
121  return DEVICE_ICONS.get(device["host_type"], "mdi:help-network")
None __init__(self, FreeboxRouter router, dict[str, Any] device)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
None add_entities(FreeboxRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
str icon_for_freebox_device(dict[str, Any] device)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103