Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for getting statistical data from a Pi-hole system."""
2 
3 from __future__ import annotations
4 
5 from hole import Hole
6 
7 from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
8 from homeassistant.const import CONF_NAME, PERCENTAGE
9 from homeassistant.core import HomeAssistant
10 from homeassistant.helpers.entity_platform import AddEntitiesCallback
11 from homeassistant.helpers.typing import StateType
12 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
13 
14 from . import PiHoleConfigEntry
15 from .entity import PiHoleEntity
16 
17 SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
19  key="ads_blocked_today",
20  translation_key="ads_blocked_today",
21  ),
23  key="ads_percentage_today",
24  translation_key="ads_percentage_today",
25  native_unit_of_measurement=PERCENTAGE,
26  ),
28  key="clients_ever_seen",
29  translation_key="clients_ever_seen",
30  ),
32  key="dns_queries_today", translation_key="dns_queries_today"
33  ),
35  key="domains_being_blocked",
36  translation_key="domains_being_blocked",
37  ),
38  SensorEntityDescription(key="queries_cached", translation_key="queries_cached"),
40  key="queries_forwarded", translation_key="queries_forwarded"
41  ),
42  SensorEntityDescription(key="unique_clients", translation_key="unique_clients"),
43  SensorEntityDescription(key="unique_domains", translation_key="unique_domains"),
44 )
45 
46 
48  hass: HomeAssistant,
49  entry: PiHoleConfigEntry,
50  async_add_entities: AddEntitiesCallback,
51 ) -> None:
52  """Set up the Pi-hole sensor."""
53  name = entry.data[CONF_NAME]
54  hole_data = entry.runtime_data
55  sensors = [
57  hole_data.api,
58  hole_data.coordinator,
59  name,
60  entry.entry_id,
61  description,
62  )
63  for description in SENSOR_TYPES
64  ]
65  async_add_entities(sensors, True)
66 
67 
69  """Representation of a Pi-hole sensor."""
70 
71  entity_description: SensorEntityDescription
72  _attr_has_entity_name = True
73 
74  def __init__(
75  self,
76  api: Hole,
77  coordinator: DataUpdateCoordinator[None],
78  name: str,
79  server_unique_id: str,
80  description: SensorEntityDescription,
81  ) -> None:
82  """Initialize a Pi-hole sensor."""
83  super().__init__(api, coordinator, name, server_unique_id)
84  self.entity_descriptionentity_description = description
85 
86  self._attr_unique_id_attr_unique_id = f"{self._server_unique_id}/{description.key}"
87 
88  @property
89  def native_value(self) -> StateType:
90  """Return the state of the device."""
91  try:
92  return round(self.apiapi.data[self.entity_descriptionentity_description.key], 2) # type: ignore[no-any-return]
93  except TypeError:
94  return self.apiapi.data[self.entity_descriptionentity_description.key] # type: ignore[no-any-return]
None __init__(self, Hole api, DataUpdateCoordinator[None] coordinator, str name, str server_unique_id, SensorEntityDescription description)
Definition: sensor.py:81
None async_setup_entry(HomeAssistant hass, PiHoleConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:51