Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Webmin 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 PERCENTAGE, UnitOfInformation
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 from homeassistant.helpers.update_coordinator import CoordinatorEntity
17 
18 from . import WebminConfigEntry
19 from .coordinator import WebminUpdateCoordinator
20 
21 
22 @dataclass(frozen=True, kw_only=True)
24  """Represents a filesystem sensor description."""
25 
26  mountpoint: str
27 
28 
29 SENSOR_TYPES: list[SensorEntityDescription] = [
31  key="load_1m",
32  translation_key="load_1m",
33  state_class=SensorStateClass.MEASUREMENT,
34  entity_registry_enabled_default=False,
35  ),
37  key="load_5m",
38  translation_key="load_5m",
39  state_class=SensorStateClass.MEASUREMENT,
40  entity_registry_enabled_default=False,
41  ),
43  key="load_15m",
44  translation_key="load_15m",
45  state_class=SensorStateClass.MEASUREMENT,
46  entity_registry_enabled_default=False,
47  ),
49  key="mem_total",
50  translation_key="mem_total",
51  native_unit_of_measurement=UnitOfInformation.KIBIBYTES,
52  suggested_unit_of_measurement=UnitOfInformation.GIBIBYTES,
53  device_class=SensorDeviceClass.DATA_SIZE,
54  suggested_display_precision=2,
55  state_class=SensorStateClass.MEASUREMENT,
56  entity_registry_enabled_default=False,
57  ),
59  key="mem_free",
60  translation_key="mem_free",
61  native_unit_of_measurement=UnitOfInformation.KIBIBYTES,
62  suggested_unit_of_measurement=UnitOfInformation.GIBIBYTES,
63  device_class=SensorDeviceClass.DATA_SIZE,
64  suggested_display_precision=2,
65  state_class=SensorStateClass.MEASUREMENT,
66  entity_registry_enabled_default=False,
67  ),
69  key="swap_total",
70  translation_key="swap_total",
71  native_unit_of_measurement=UnitOfInformation.KIBIBYTES,
72  suggested_unit_of_measurement=UnitOfInformation.GIBIBYTES,
73  device_class=SensorDeviceClass.DATA_SIZE,
74  suggested_display_precision=2,
75  state_class=SensorStateClass.MEASUREMENT,
76  entity_registry_enabled_default=False,
77  ),
79  key="swap_free",
80  translation_key="swap_free",
81  native_unit_of_measurement=UnitOfInformation.KIBIBYTES,
82  suggested_unit_of_measurement=UnitOfInformation.GIBIBYTES,
83  device_class=SensorDeviceClass.DATA_SIZE,
84  suggested_display_precision=2,
85  state_class=SensorStateClass.MEASUREMENT,
86  entity_registry_enabled_default=False,
87  ),
89  key="disk_total",
90  translation_key="disk_total",
91  native_unit_of_measurement=UnitOfInformation.BYTES,
92  suggested_unit_of_measurement=UnitOfInformation.GIBIBYTES,
93  device_class=SensorDeviceClass.DATA_SIZE,
94  suggested_display_precision=1,
95  state_class=SensorStateClass.MEASUREMENT,
96  entity_registry_enabled_default=False,
97  ),
99  key="disk_free",
100  translation_key="disk_free",
101  native_unit_of_measurement=UnitOfInformation.BYTES,
102  suggested_unit_of_measurement=UnitOfInformation.GIBIBYTES,
103  device_class=SensorDeviceClass.DATA_SIZE,
104  suggested_display_precision=1,
105  state_class=SensorStateClass.MEASUREMENT,
106  entity_registry_enabled_default=False,
107  ),
109  key="disk_used",
110  translation_key="disk_used",
111  native_unit_of_measurement=UnitOfInformation.BYTES,
112  suggested_unit_of_measurement=UnitOfInformation.GIBIBYTES,
113  device_class=SensorDeviceClass.DATA_SIZE,
114  suggested_display_precision=1,
115  state_class=SensorStateClass.MEASUREMENT,
116  entity_registry_enabled_default=False,
117  ),
118 ]
119 
120 
122  mountpoint: str,
123 ) -> list[WebminFSSensorDescription]:
124  """Return all sensor descriptions for a mount point."""
125 
126  return [
128  mountpoint=mountpoint,
129  key="total",
130  translation_key="disk_fs_total",
131  native_unit_of_measurement=UnitOfInformation.BYTES,
132  suggested_unit_of_measurement=UnitOfInformation.GIBIBYTES,
133  device_class=SensorDeviceClass.DATA_SIZE,
134  suggested_display_precision=1,
135  state_class=SensorStateClass.MEASUREMENT,
136  entity_registry_enabled_default=False,
137  ),
139  mountpoint=mountpoint,
140  key="used",
141  translation_key="disk_fs_used",
142  native_unit_of_measurement=UnitOfInformation.BYTES,
143  suggested_unit_of_measurement=UnitOfInformation.GIBIBYTES,
144  device_class=SensorDeviceClass.DATA_SIZE,
145  suggested_display_precision=1,
146  state_class=SensorStateClass.MEASUREMENT,
147  entity_registry_enabled_default=False,
148  ),
150  mountpoint=mountpoint,
151  key="free",
152  translation_key="disk_fs_free",
153  native_unit_of_measurement=UnitOfInformation.BYTES,
154  suggested_unit_of_measurement=UnitOfInformation.GIBIBYTES,
155  device_class=SensorDeviceClass.DATA_SIZE,
156  suggested_display_precision=1,
157  state_class=SensorStateClass.MEASUREMENT,
158  entity_registry_enabled_default=False,
159  ),
161  mountpoint=mountpoint,
162  key="itotal",
163  translation_key="disk_fs_itotal",
164  state_class=SensorStateClass.MEASUREMENT,
165  entity_registry_enabled_default=False,
166  ),
168  mountpoint=mountpoint,
169  key="iused",
170  translation_key="disk_fs_iused",
171  state_class=SensorStateClass.MEASUREMENT,
172  entity_registry_enabled_default=False,
173  ),
175  mountpoint=mountpoint,
176  key="ifree",
177  translation_key="disk_fs_ifree",
178  state_class=SensorStateClass.MEASUREMENT,
179  entity_registry_enabled_default=False,
180  ),
182  mountpoint=mountpoint,
183  key="used_percent",
184  translation_key="disk_fs_used_percent",
185  native_unit_of_measurement=PERCENTAGE,
186  state_class=SensorStateClass.MEASUREMENT,
187  entity_registry_enabled_default=False,
188  ),
190  mountpoint=mountpoint,
191  key="iused_percent",
192  translation_key="disk_fs_iused_percent",
193  native_unit_of_measurement=PERCENTAGE,
194  state_class=SensorStateClass.MEASUREMENT,
195  entity_registry_enabled_default=False,
196  ),
197  ]
198 
199 
201  hass: HomeAssistant,
202  entry: WebminConfigEntry,
203  async_add_entities: AddEntitiesCallback,
204 ) -> None:
205  """Set up Webmin sensors based on a config entry."""
206  coordinator = entry.runtime_data
207 
208  entities: list[WebminSensor | WebminFSSensor] = [
209  WebminSensor(coordinator, description)
210  for description in SENSOR_TYPES
211  if description.key in coordinator.data
212  ]
213 
214  for fs, values in coordinator.data["disk_fs"].items():
215  entities += [
216  WebminFSSensor(coordinator, description)
217  for description in generate_filesystem_sensor_description(fs)
218  if description.key in values
219  ]
220 
221  async_add_entities(entities)
222 
223 
224 class WebminSensor(CoordinatorEntity[WebminUpdateCoordinator], SensorEntity):
225  """Represents a Webmin sensor."""
226 
227  entity_description: SensorEntityDescription
228  _attr_has_entity_name = True
229 
230  def __init__(
231  self, coordinator: WebminUpdateCoordinator, description: SensorEntityDescription
232  ) -> None:
233  """Initialize a Webmin sensor."""
234 
235  super().__init__(coordinator)
236  self.entity_descriptionentity_description = description
237  self._attr_device_info_attr_device_info = coordinator.device_info
238  self._attr_unique_id_attr_unique_id = f"{coordinator.unique_id}_{description.key}"
239 
240  @property
241  def native_value(self) -> int | float:
242  """Return the state of the sensor."""
243  return self.coordinator.data[self.entity_descriptionentity_description.key]
244 
245 
246 class WebminFSSensor(CoordinatorEntity[WebminUpdateCoordinator], SensorEntity):
247  """Represents a Webmin filesystem sensor."""
248 
249  entity_description: WebminFSSensorDescription
250  _attr_has_entity_name = True
251 
252  def __init__(
253  self,
254  coordinator: WebminUpdateCoordinator,
255  description: WebminFSSensorDescription,
256  ) -> None:
257  """Initialize a Webmin filesystem sensor."""
258 
259  super().__init__(coordinator)
260  self.entity_descriptionentity_description = description
261  self._attr_device_info_attr_device_info = coordinator.device_info
262  self._attr_translation_placeholders_attr_translation_placeholders = {"mountpoint": description.mountpoint}
263  self._attr_unique_id_attr_unique_id = (
264  f"{coordinator.mac_address}_{description.mountpoint}_{description.key}"
265  )
266 
267  @property
268  def native_value(self) -> int | float:
269  """Return the state of the sensor."""
270  return self.coordinator.data["disk_fs"][self.entity_descriptionentity_description.mountpoint][
271  self.entity_descriptionentity_description.key
272  ]
None __init__(self, WebminUpdateCoordinator coordinator, WebminFSSensorDescription description)
Definition: sensor.py:256
None __init__(self, WebminUpdateCoordinator coordinator, SensorEntityDescription description)
Definition: sensor.py:232
None async_setup_entry(HomeAssistant hass, WebminConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:204
list[WebminFSSensorDescription] generate_filesystem_sensor_description(str mountpoint)
Definition: sensor.py:123