Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Sensor for Home Assistant analytics."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 
9  SensorEntity,
10  SensorEntityDescription,
11  SensorStateClass,
12 )
13 from homeassistant.const import EntityCategory
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 from homeassistant.helpers.typing import StateType
18 from homeassistant.helpers.update_coordinator import CoordinatorEntity
19 
20 from . import AnalyticsInsightsConfigEntry
21 from .const import DOMAIN
22 from .coordinator import AnalyticsData, HomeassistantAnalyticsDataUpdateCoordinator
23 
24 
25 @dataclass(frozen=True, kw_only=True)
27  """Analytics sensor entity description."""
28 
29  value_fn: Callable[[AnalyticsData], StateType]
30 
31 
33  name_slug: str,
34 ) -> AnalyticsSensorEntityDescription:
35  """Get addon entity description."""
37  key=f"addon_{name_slug}_active_installations",
38  translation_key="addons",
39  name=name_slug,
40  state_class=SensorStateClass.TOTAL,
41  native_unit_of_measurement="active installations",
42  value_fn=lambda data: data.addons.get(name_slug),
43  )
44 
45 
47  domain: str, name: str
48 ) -> AnalyticsSensorEntityDescription:
49  """Get core integration entity description."""
51  key=f"core_{domain}_active_installations",
52  translation_key="core_integrations",
53  name=name,
54  state_class=SensorStateClass.TOTAL,
55  native_unit_of_measurement="active installations",
56  value_fn=lambda data: data.core_integrations.get(domain),
57  )
58 
59 
61  domain: str,
62 ) -> AnalyticsSensorEntityDescription:
63  """Get custom integration entity description."""
65  key=f"custom_{domain}_active_installations",
66  translation_key="custom_integrations",
67  translation_placeholders={"custom_integration_domain": domain},
68  state_class=SensorStateClass.TOTAL,
69  native_unit_of_measurement="active installations",
70  value_fn=lambda data: data.custom_integrations.get(domain),
71  )
72 
73 
74 GENERAL_SENSORS = [
76  key="total_active_installations",
77  translation_key="total_active_installations",
78  entity_registry_enabled_default=False,
79  state_class=SensorStateClass.TOTAL,
80  native_unit_of_measurement="active installations",
81  value_fn=lambda data: data.active_installations,
82  ),
84  key="total_reports_integrations",
85  translation_key="total_reports_integrations",
86  entity_registry_enabled_default=False,
87  state_class=SensorStateClass.TOTAL,
88  native_unit_of_measurement="active installations",
89  value_fn=lambda data: data.reports_integrations,
90  ),
91 ]
92 
93 
95  hass: HomeAssistant,
96  entry: AnalyticsInsightsConfigEntry,
97  async_add_entities: AddEntitiesCallback,
98 ) -> None:
99  """Initialize the entries."""
100 
101  analytics_data = entry.runtime_data
102  coordinator: HomeassistantAnalyticsDataUpdateCoordinator = (
103  analytics_data.coordinator
104  )
105  entities: list[HomeassistantAnalyticsSensor] = []
106  entities.extend(
108  coordinator,
109  get_addon_entity_description(addon_name_slug),
110  )
111  for addon_name_slug in coordinator.data.addons
112  )
113  entities.extend(
115  coordinator,
117  integration_domain, analytics_data.names[integration_domain]
118  ),
119  )
120  for integration_domain in coordinator.data.core_integrations
121  )
122  entities.extend(
124  coordinator,
125  get_custom_integration_entity_description(integration_domain),
126  )
127  for integration_domain in coordinator.data.custom_integrations
128  )
129 
130  entities.extend(
131  HomeassistantAnalyticsSensor(coordinator, entity_description)
132  for entity_description in GENERAL_SENSORS
133  )
134 
135  async_add_entities(entities)
136 
137 
139  CoordinatorEntity[HomeassistantAnalyticsDataUpdateCoordinator], SensorEntity
140 ):
141  """Home Assistant Analytics Sensor."""
142 
143  _attr_has_entity_name = True
144  _attr_entity_category = EntityCategory.DIAGNOSTIC
145 
146  entity_description: AnalyticsSensorEntityDescription
147 
148  def __init__(
149  self,
150  coordinator: HomeassistantAnalyticsDataUpdateCoordinator,
151  entity_description: AnalyticsSensorEntityDescription,
152  ) -> None:
153  """Initialize the sensor."""
154  super().__init__(coordinator)
155  self.entity_descriptionentity_description = entity_description
156  self._attr_unique_id_attr_unique_id = entity_description.key
157  self._attr_device_info_attr_device_info = DeviceInfo(
158  identifiers={(DOMAIN, DOMAIN)},
159  entry_type=DeviceEntryType.SERVICE,
160  )
161 
162  @property
163  def native_value(self) -> StateType:
164  """Return the state of the sensor."""
165  return self.entity_descriptionentity_description.value_fn(self.coordinator.data)
None __init__(self, HomeassistantAnalyticsDataUpdateCoordinator coordinator, AnalyticsSensorEntityDescription entity_description)
Definition: sensor.py:152
AnalyticsSensorEntityDescription get_addon_entity_description(str name_slug)
Definition: sensor.py:34
None async_setup_entry(HomeAssistant hass, AnalyticsInsightsConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:98
AnalyticsSensorEntityDescription get_core_integration_entity_description(str domain, str name)
Definition: sensor.py:48
AnalyticsSensorEntityDescription get_custom_integration_entity_description(str domain)
Definition: sensor.py:62