Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Asuswrt status sensors."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 
8  SensorDeviceClass,
9  SensorEntity,
10  SensorEntityDescription,
11  SensorStateClass,
12 )
13 from homeassistant.const import (
14  PERCENTAGE,
15  EntityCategory,
16  UnitOfDataRate,
17  UnitOfInformation,
18  UnitOfTemperature,
19  UnitOfTime,
20 )
21 from homeassistant.core import HomeAssistant
22 from homeassistant.helpers.entity_platform import AddEntitiesCallback
24  CoordinatorEntity,
25  DataUpdateCoordinator,
26 )
27 from homeassistant.util import slugify
28 
29 from . import AsusWrtConfigEntry
30 from .const import (
31  KEY_COORDINATOR,
32  KEY_SENSORS,
33  SENSORS_BYTES,
34  SENSORS_CONNECTED_DEVICE,
35  SENSORS_CPU,
36  SENSORS_LOAD_AVG,
37  SENSORS_MEMORY,
38  SENSORS_RATES,
39  SENSORS_TEMPERATURES,
40  SENSORS_UPTIME,
41 )
42 from .router import AsusWrtRouter
43 
44 
45 @dataclass(frozen=True)
47  """A class that describes AsusWrt sensor entities."""
48 
49  factor: int | None = None
50 
51 
52 UNIT_DEVICES = "Devices"
53 
54 CPU_CORE_SENSORS: tuple[AsusWrtSensorEntityDescription, ...] = tuple(
56  key=sens_key,
57  translation_key="cpu_core_usage",
58  translation_placeholders={"core_id": str(core_id)},
59  state_class=SensorStateClass.MEASUREMENT,
60  native_unit_of_measurement=PERCENTAGE,
61  entity_category=EntityCategory.DIAGNOSTIC,
62  entity_registry_enabled_default=False,
63  suggested_display_precision=1,
64  )
65  for core_id, sens_key in enumerate(SENSORS_CPU[1:], start=1)
66 )
67 CONNECTION_SENSORS: tuple[AsusWrtSensorEntityDescription, ...] = (
69  key=SENSORS_CONNECTED_DEVICE[0],
70  translation_key="devices_connected",
71  state_class=SensorStateClass.MEASUREMENT,
72  native_unit_of_measurement=UNIT_DEVICES,
73  ),
75  key=SENSORS_RATES[0],
76  translation_key="download_speed",
77  device_class=SensorDeviceClass.DATA_RATE,
78  state_class=SensorStateClass.MEASUREMENT,
79  native_unit_of_measurement=UnitOfDataRate.MEGABITS_PER_SECOND,
80  entity_registry_enabled_default=False,
81  suggested_display_precision=2,
82  factor=125000,
83  ),
85  key=SENSORS_RATES[1],
86  translation_key="upload_speed",
87  device_class=SensorDeviceClass.DATA_RATE,
88  state_class=SensorStateClass.MEASUREMENT,
89  native_unit_of_measurement=UnitOfDataRate.MEGABITS_PER_SECOND,
90  entity_registry_enabled_default=False,
91  suggested_display_precision=2,
92  factor=125000,
93  ),
95  key=SENSORS_BYTES[0],
96  translation_key="download",
97  state_class=SensorStateClass.TOTAL_INCREASING,
98  native_unit_of_measurement=UnitOfInformation.GIGABYTES,
99  device_class=SensorDeviceClass.DATA_SIZE,
100  entity_registry_enabled_default=False,
101  suggested_display_precision=2,
102  factor=1000000000,
103  ),
105  key=SENSORS_BYTES[1],
106  translation_key="upload",
107  state_class=SensorStateClass.TOTAL_INCREASING,
108  native_unit_of_measurement=UnitOfInformation.GIGABYTES,
109  device_class=SensorDeviceClass.DATA_SIZE,
110  entity_registry_enabled_default=False,
111  suggested_display_precision=2,
112  factor=1000000000,
113  ),
115  key=SENSORS_LOAD_AVG[0],
116  translation_key="load_avg_1m",
117  state_class=SensorStateClass.MEASUREMENT,
118  entity_category=EntityCategory.DIAGNOSTIC,
119  entity_registry_enabled_default=False,
120  suggested_display_precision=1,
121  ),
123  key=SENSORS_LOAD_AVG[1],
124  translation_key="load_avg_5m",
125  state_class=SensorStateClass.MEASUREMENT,
126  entity_category=EntityCategory.DIAGNOSTIC,
127  entity_registry_enabled_default=False,
128  suggested_display_precision=1,
129  ),
131  key=SENSORS_LOAD_AVG[2],
132  translation_key="load_avg_15m",
133  state_class=SensorStateClass.MEASUREMENT,
134  entity_category=EntityCategory.DIAGNOSTIC,
135  entity_registry_enabled_default=False,
136  suggested_display_precision=1,
137  ),
139  key=SENSORS_TEMPERATURES[0],
140  translation_key="24ghz_temperature",
141  state_class=SensorStateClass.MEASUREMENT,
142  device_class=SensorDeviceClass.TEMPERATURE,
143  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
144  entity_category=EntityCategory.DIAGNOSTIC,
145  entity_registry_enabled_default=False,
146  suggested_display_precision=1,
147  ),
149  key=SENSORS_TEMPERATURES[1],
150  translation_key="5ghz_temperature",
151  state_class=SensorStateClass.MEASUREMENT,
152  device_class=SensorDeviceClass.TEMPERATURE,
153  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
154  entity_category=EntityCategory.DIAGNOSTIC,
155  entity_registry_enabled_default=False,
156  suggested_display_precision=1,
157  ),
159  key=SENSORS_TEMPERATURES[2],
160  translation_key="cpu_temperature",
161  state_class=SensorStateClass.MEASUREMENT,
162  device_class=SensorDeviceClass.TEMPERATURE,
163  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
164  entity_category=EntityCategory.DIAGNOSTIC,
165  entity_registry_enabled_default=False,
166  suggested_display_precision=1,
167  ),
169  key=SENSORS_TEMPERATURES[3],
170  translation_key="5ghz_2_temperature",
171  state_class=SensorStateClass.MEASUREMENT,
172  device_class=SensorDeviceClass.TEMPERATURE,
173  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
174  entity_category=EntityCategory.DIAGNOSTIC,
175  entity_registry_enabled_default=False,
176  suggested_display_precision=1,
177  ),
179  key=SENSORS_TEMPERATURES[4],
180  translation_key="6ghz_temperature",
181  state_class=SensorStateClass.MEASUREMENT,
182  device_class=SensorDeviceClass.TEMPERATURE,
183  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
184  entity_category=EntityCategory.DIAGNOSTIC,
185  entity_registry_enabled_default=False,
186  suggested_display_precision=1,
187  ),
189  key=SENSORS_MEMORY[0],
190  translation_key="memory_usage",
191  state_class=SensorStateClass.MEASUREMENT,
192  native_unit_of_measurement=PERCENTAGE,
193  entity_category=EntityCategory.DIAGNOSTIC,
194  entity_registry_enabled_default=False,
195  suggested_display_precision=1,
196  ),
198  key=SENSORS_MEMORY[1],
199  translation_key="memory_free",
200  state_class=SensorStateClass.MEASUREMENT,
201  device_class=SensorDeviceClass.DATA_SIZE,
202  native_unit_of_measurement=UnitOfInformation.MEGABYTES,
203  entity_category=EntityCategory.DIAGNOSTIC,
204  entity_registry_enabled_default=False,
205  suggested_display_precision=2,
206  factor=1024,
207  ),
209  key=SENSORS_MEMORY[2],
210  translation_key="memory_used",
211  state_class=SensorStateClass.MEASUREMENT,
212  device_class=SensorDeviceClass.DATA_SIZE,
213  native_unit_of_measurement=UnitOfInformation.MEGABYTES,
214  entity_category=EntityCategory.DIAGNOSTIC,
215  entity_registry_enabled_default=False,
216  suggested_display_precision=2,
217  factor=1024,
218  ),
220  key=SENSORS_UPTIME[0],
221  translation_key="last_boot",
222  device_class=SensorDeviceClass.TIMESTAMP,
223  ),
225  key=SENSORS_UPTIME[1],
226  translation_key="uptime",
227  state_class=SensorStateClass.TOTAL,
228  device_class=SensorDeviceClass.DURATION,
229  native_unit_of_measurement=UnitOfTime.SECONDS,
230  entity_category=EntityCategory.DIAGNOSTIC,
231  entity_registry_enabled_default=False,
232  ),
234  key=SENSORS_CPU[0],
235  translation_key="cpu_usage",
236  state_class=SensorStateClass.MEASUREMENT,
237  native_unit_of_measurement=PERCENTAGE,
238  entity_category=EntityCategory.DIAGNOSTIC,
239  entity_registry_enabled_default=False,
240  suggested_display_precision=1,
241  ),
242  *CPU_CORE_SENSORS,
243 )
244 
245 
247  hass: HomeAssistant,
248  entry: AsusWrtConfigEntry,
249  async_add_entities: AddEntitiesCallback,
250 ) -> None:
251  """Set up the sensors."""
252  router = entry.runtime_data
253  entities = []
254 
255  for sensor_data in router.sensors_coordinator.values():
256  coordinator = sensor_data[KEY_COORDINATOR]
257  sensors = sensor_data[KEY_SENSORS]
258  entities.extend(
259  [
260  AsusWrtSensor(coordinator, router, sensor_descr)
261  for sensor_descr in CONNECTION_SENSORS
262  if sensor_descr.key in sensors
263  ]
264  )
265 
266  async_add_entities(entities, True)
267 
268 
270  """Representation of a AsusWrt sensor."""
271 
272  entity_description: AsusWrtSensorEntityDescription
273  _attr_has_entity_name = True
274 
275  def __init__(
276  self,
277  coordinator: DataUpdateCoordinator,
278  router: AsusWrtRouter,
279  description: AsusWrtSensorEntityDescription,
280  ) -> None:
281  """Initialize a AsusWrt sensor."""
282  super().__init__(coordinator)
283  self.entity_descriptionentity_description = description
284 
285  self._attr_unique_id_attr_unique_id = slugify(f"{router.unique_id}_{description.key}")
286  self._attr_device_info_attr_device_info = router.device_info
287  self._attr_extra_state_attributes_attr_extra_state_attributes = {"hostname": router.host}
288 
289  @property
290  def native_value(self) -> float | int | str | None:
291  """Return current state."""
292  descr = self.entity_descriptionentity_description
293  state: float | int | str | None = self.coordinator.data.get(descr.key)
294  if state is not None and descr.factor and isinstance(state, (float, int)):
295  return state / descr.factor
296  return state
None __init__(self, DataUpdateCoordinator coordinator, AsusWrtRouter router, AsusWrtSensorEntityDescription description)
Definition: sensor.py:280
None async_setup_entry(HomeAssistant hass, AsusWrtConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:250