Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Sensor platform that for Ping integration."""
2 
3 from collections.abc import Callable
4 from dataclasses import dataclass
5 
7  SensorDeviceClass,
8  SensorEntity,
9  SensorEntityDescription,
10  SensorStateClass,
11 )
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.const import EntityCategory, UnitOfTime
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 
17 from . import PingConfigEntry
18 from .coordinator import PingResult, PingUpdateCoordinator
19 from .entity import PingEntity
20 
21 
22 @dataclass(frozen=True, kw_only=True)
24  """Class to describe a Ping sensor entity."""
25 
26  value_fn: Callable[[PingResult], float | None]
27  has_fn: Callable[[PingResult], bool]
28 
29 
30 SENSORS: tuple[PingSensorEntityDescription, ...] = (
32  key="round_trip_time_avg",
33  translation_key="round_trip_time_avg",
34  native_unit_of_measurement=UnitOfTime.MILLISECONDS,
35  state_class=SensorStateClass.MEASUREMENT,
36  device_class=SensorDeviceClass.DURATION,
37  entity_registry_enabled_default=False,
38  entity_category=EntityCategory.DIAGNOSTIC,
39  value_fn=lambda result: result.data.get("avg"),
40  has_fn=lambda result: "avg" in result.data,
41  ),
43  key="round_trip_time_max",
44  translation_key="round_trip_time_max",
45  native_unit_of_measurement=UnitOfTime.MILLISECONDS,
46  state_class=SensorStateClass.MEASUREMENT,
47  device_class=SensorDeviceClass.DURATION,
48  entity_registry_enabled_default=False,
49  entity_category=EntityCategory.DIAGNOSTIC,
50  value_fn=lambda result: result.data.get("max"),
51  has_fn=lambda result: "max" in result.data,
52  ),
54  key="round_trip_time_mdev",
55  translation_key="round_trip_time_mdev",
56  native_unit_of_measurement=UnitOfTime.MILLISECONDS,
57  state_class=SensorStateClass.MEASUREMENT,
58  device_class=SensorDeviceClass.DURATION,
59  entity_registry_enabled_default=False,
60  entity_category=EntityCategory.DIAGNOSTIC,
61  value_fn=lambda result: result.data.get("mdev"),
62  has_fn=lambda result: "mdev" in result.data,
63  ),
65  key="round_trip_time_min",
66  translation_key="round_trip_time_min",
67  native_unit_of_measurement=UnitOfTime.MILLISECONDS,
68  state_class=SensorStateClass.MEASUREMENT,
69  device_class=SensorDeviceClass.DURATION,
70  entity_registry_enabled_default=False,
71  entity_category=EntityCategory.DIAGNOSTIC,
72  value_fn=lambda result: result.data.get("min"),
73  has_fn=lambda result: "min" in result.data,
74  ),
75 )
76 
77 
79  hass: HomeAssistant, entry: PingConfigEntry, async_add_entities: AddEntitiesCallback
80 ) -> None:
81  """Set up Ping sensors from config entry."""
82  coordinator = entry.runtime_data
83 
85  PingSensor(entry, description, coordinator)
86  for description in SENSORS
87  if description.has_fn(coordinator.data)
88  )
89 
90 
92  """Represents a Ping sensor."""
93 
94  entity_description: PingSensorEntityDescription
95 
96  def __init__(
97  self,
98  config_entry: ConfigEntry,
99  description: PingSensorEntityDescription,
100  coordinator: PingUpdateCoordinator,
101  ) -> None:
102  """Initialize the sensor."""
103  super().__init__(
104  config_entry, coordinator, f"{config_entry.entry_id}-{description.key}"
105  )
106 
107  self.entity_descriptionentity_description = description
108 
109  @property
110  def available(self) -> bool:
111  """Return True if entity is available."""
112  return super().available and self.coordinator.data.is_alive
113 
114  @property
115  def native_value(self) -> float | None:
116  """Return the sensor state."""
117  return self.entity_descriptionentity_description.value_fn(self.coordinator.data)
None __init__(self, ConfigEntry config_entry, PingSensorEntityDescription description, PingUpdateCoordinator coordinator)
Definition: sensor.py:101
None async_setup_entry(HomeAssistant hass, PingConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:80