Home Assistant Unofficial Reference 2024.12.1
device_tracker.py
Go to the documentation of this file.
1 """Tracks devices by sending a ICMP echo request (ping)."""
2 
3 from __future__ import annotations
4 
5 from datetime import datetime, timedelta
6 
8  CONF_CONSIDER_HOME,
9  DEFAULT_CONSIDER_HOME,
10  ScannerEntity,
11 )
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.core import HomeAssistant
14 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15 from homeassistant.helpers.update_coordinator import CoordinatorEntity
16 from homeassistant.util import dt as dt_util
17 
18 from . import PingConfigEntry
19 from .const import CONF_IMPORTED_BY
20 from .coordinator import PingUpdateCoordinator
21 
22 
24  hass: HomeAssistant, entry: PingConfigEntry, async_add_entities: AddEntitiesCallback
25 ) -> None:
26  """Set up a Ping config entry."""
27  async_add_entities([PingDeviceTracker(entry, entry.runtime_data)])
28 
29 
30 class PingDeviceTracker(CoordinatorEntity[PingUpdateCoordinator], ScannerEntity):
31  """Representation of a Ping device tracker."""
32 
33  _last_seen: datetime | None = None
34 
35  def __init__(
36  self, config_entry: ConfigEntry, coordinator: PingUpdateCoordinator
37  ) -> None:
38  """Initialize the Ping device tracker."""
39  super().__init__(coordinator)
40 
41  self._attr_name_attr_name = config_entry.title
42  self.config_entryconfig_entryconfig_entry = config_entry
43  self._consider_home_interval_consider_home_interval = timedelta(
44  seconds=config_entry.options.get(
45  CONF_CONSIDER_HOME, DEFAULT_CONSIDER_HOME.seconds
46  )
47  )
48 
49  @property
50  def ip_address(self) -> str:
51  """Return the primary ip address of the device."""
52  return self.coordinator.data.ip_address
53 
54  @property
55  def unique_id(self) -> str:
56  """Return a unique ID."""
57  return self.config_entryconfig_entryconfig_entry.entry_id
58 
59  @property
60  def is_connected(self) -> bool:
61  """Return true if ping returns is_alive or considered home."""
62  if self.coordinator.data.is_alive:
63  self._last_seen_last_seen = dt_util.utcnow()
64 
65  return (
66  self._last_seen_last_seen is not None
67  and (dt_util.utcnow() - self._last_seen_last_seen) < self._consider_home_interval_consider_home_interval
68  )
69 
70  @property
72  """Return if entity is enabled by default."""
73  if CONF_IMPORTED_BY in self.config_entryconfig_entryconfig_entry.data:
74  return bool(self.config_entryconfig_entryconfig_entry.data[CONF_IMPORTED_BY] == "device_tracker")
75  return False
None __init__(self, ConfigEntry config_entry, PingUpdateCoordinator coordinator)
None async_setup_entry(HomeAssistant hass, PingConfigEntry entry, AddEntitiesCallback async_add_entities)