1 """Support gathering system information of hosts which are running glances."""
3 from __future__
import annotations
5 from dataclasses
import dataclass
10 SensorEntityDescription,
15 REVOLUTIONS_PER_MINUTE,
25 from .
import GlancesConfigEntry, GlancesDataUpdateCoordinator
26 from .const
import CPU_ICON, DOMAIN
29 @dataclass(frozen=True, kw_only=True)
31 """Describe Glances sensor entity."""
38 key=
"disk_use_percent",
40 translation_key=
"disk_usage",
41 native_unit_of_measurement=PERCENTAGE,
42 state_class=SensorStateClass.MEASUREMENT,
47 translation_key=
"disk_used",
48 native_unit_of_measurement=UnitOfInformation.GIBIBYTES,
49 device_class=SensorDeviceClass.DATA_SIZE,
50 state_class=SensorStateClass.MEASUREMENT,
55 translation_key=
"disk_free",
56 native_unit_of_measurement=UnitOfInformation.GIBIBYTES,
57 device_class=SensorDeviceClass.DATA_SIZE,
58 state_class=SensorStateClass.MEASUREMENT,
63 translation_key=
"diskio_read",
64 native_unit_of_measurement=UnitOfDataRate.BYTES_PER_SECOND,
65 suggested_unit_of_measurement=UnitOfDataRate.MEGABYTES_PER_SECOND,
66 device_class=SensorDeviceClass.DATA_RATE,
67 state_class=SensorStateClass.MEASUREMENT,
72 translation_key=
"diskio_write",
73 native_unit_of_measurement=UnitOfDataRate.BYTES_PER_SECOND,
74 suggested_unit_of_measurement=UnitOfDataRate.MEGABYTES_PER_SECOND,
75 device_class=SensorDeviceClass.DATA_RATE,
76 state_class=SensorStateClass.MEASUREMENT,
79 key=
"memory_use_percent",
81 translation_key=
"memory_usage",
82 native_unit_of_measurement=PERCENTAGE,
83 state_class=SensorStateClass.MEASUREMENT,
88 translation_key=
"memory_use",
89 native_unit_of_measurement=UnitOfInformation.MEBIBYTES,
90 device_class=SensorDeviceClass.DATA_SIZE,
91 state_class=SensorStateClass.MEASUREMENT,
96 translation_key=
"memory_free",
97 native_unit_of_measurement=UnitOfInformation.MEBIBYTES,
98 device_class=SensorDeviceClass.DATA_SIZE,
99 state_class=SensorStateClass.MEASUREMENT,
102 key=
"swap_use_percent",
104 translation_key=
"swap_usage",
105 native_unit_of_measurement=PERCENTAGE,
106 state_class=SensorStateClass.MEASUREMENT,
111 translation_key=
"swap_use",
112 native_unit_of_measurement=UnitOfInformation.GIBIBYTES,
113 device_class=SensorDeviceClass.DATA_SIZE,
114 state_class=SensorStateClass.MEASUREMENT,
119 translation_key=
"swap_free",
120 native_unit_of_measurement=UnitOfInformation.GIBIBYTES,
121 device_class=SensorDeviceClass.DATA_SIZE,
122 state_class=SensorStateClass.MEASUREMENT,
125 key=
"processor_load",
127 translation_key=
"processor_load",
129 state_class=SensorStateClass.MEASUREMENT,
132 key=
"process_running",
134 translation_key=
"process_running",
136 state_class=SensorStateClass.MEASUREMENT,
141 translation_key=
"process_total",
143 state_class=SensorStateClass.MEASUREMENT,
146 key=
"process_thread",
148 translation_key=
"process_threads",
150 state_class=SensorStateClass.MEASUREMENT,
153 key=
"process_sleeping",
155 translation_key=
"process_sleeping",
157 state_class=SensorStateClass.MEASUREMENT,
160 key=
"cpu_use_percent",
162 translation_key=
"cpu_usage",
163 native_unit_of_measurement=PERCENTAGE,
165 state_class=SensorStateClass.MEASUREMENT,
168 key=
"temperature_core",
170 translation_key=
"temperature",
171 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
172 device_class=SensorDeviceClass.TEMPERATURE,
173 state_class=SensorStateClass.MEASUREMENT,
176 key=
"temperature_hdd",
178 translation_key=
"temperature",
179 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
180 device_class=SensorDeviceClass.TEMPERATURE,
181 state_class=SensorStateClass.MEASUREMENT,
186 translation_key=
"fan_speed",
187 native_unit_of_measurement=REVOLUTIONS_PER_MINUTE,
188 state_class=SensorStateClass.MEASUREMENT,
193 translation_key=
"charge",
194 native_unit_of_measurement=PERCENTAGE,
195 device_class=SensorDeviceClass.BATTERY,
196 state_class=SensorStateClass.MEASUREMENT,
201 translation_key=
"container_active",
202 state_class=SensorStateClass.MEASUREMENT,
205 key=
"docker_cpu_use",
207 translation_key=
"container_cpu_usage",
208 native_unit_of_measurement=PERCENTAGE,
209 state_class=SensorStateClass.MEASUREMENT,
212 key=
"docker_memory_use",
214 translation_key=
"container_memory_used",
215 native_unit_of_measurement=UnitOfInformation.MEBIBYTES,
216 device_class=SensorDeviceClass.DATA_SIZE,
217 state_class=SensorStateClass.MEASUREMENT,
222 translation_key=
"raid_available",
223 state_class=SensorStateClass.MEASUREMENT,
228 translation_key=
"raid_used",
229 state_class=SensorStateClass.MEASUREMENT,
234 translation_key=
"uptime",
235 device_class=SensorDeviceClass.TIMESTAMP,
240 translation_key=
"gpu_memory_usage",
241 native_unit_of_measurement=PERCENTAGE,
242 state_class=SensorStateClass.MEASUREMENT,
247 translation_key=
"gpu_processor_usage",
248 native_unit_of_measurement=PERCENTAGE,
249 state_class=SensorStateClass.MEASUREMENT,
250 suggested_display_precision=1,
255 translation_key=
"temperature",
256 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
257 device_class=SensorDeviceClass.TEMPERATURE,
258 state_class=SensorStateClass.MEASUREMENT,
263 translation_key=
"fan_speed",
264 native_unit_of_measurement=PERCENTAGE,
265 state_class=SensorStateClass.MEASUREMENT,
270 translation_key=
"network_rx",
271 native_unit_of_measurement=UnitOfDataRate.BYTES_PER_SECOND,
272 suggested_unit_of_measurement=UnitOfDataRate.MEGABITS_PER_SECOND,
273 device_class=SensorDeviceClass.DATA_RATE,
274 state_class=SensorStateClass.MEASUREMENT,
279 translation_key=
"network_tx",
280 native_unit_of_measurement=UnitOfDataRate.BYTES_PER_SECOND,
281 suggested_unit_of_measurement=UnitOfDataRate.MEGABITS_PER_SECOND,
282 device_class=SensorDeviceClass.DATA_RATE,
283 state_class=SensorStateClass.MEASUREMENT,
290 config_entry: GlancesConfigEntry,
291 async_add_entities: AddEntitiesCallback,
293 """Set up the Glances sensors."""
295 coordinator = config_entry.runtime_data
296 entities: list[GlancesSensor] = []
298 for sensor_type, sensors
in coordinator.data.items():
299 if sensor_type
in [
"fs",
"diskio",
"sensors",
"raid",
"gpu",
"network"]:
306 for sensor_label, params
in sensors.items()
308 if (sensor_description := SENSOR_TYPES.get((sensor_type, param)))
316 for sensor
in sensors
317 if (sensor_description := SENSOR_TYPES.get((sensor_type, sensor)))
324 """Implementation of a Glances sensor."""
326 entity_description: GlancesSensorEntityDescription
327 _attr_has_entity_name =
True
328 _data_valid: bool =
False
332 coordinator: GlancesDataUpdateCoordinator,
333 description: GlancesSensorEntityDescription,
334 sensor_label: str =
"",
336 """Initialize the sensor."""
343 identifiers={(DOMAIN, coordinator.config_entry.entry_id)},
344 manufacturer=
"Glances",
345 name=coordinator.host,
348 f
"{coordinator.config_entry.entry_id}-{sensor_label}-{description.key}"
354 """Set sensor unavailable when native value is invalid."""
355 return super().available
and self.
_data_valid_data_valid
359 """Handle updated data from the coordinator."""
364 """Update sensor native value from coordinator data."""
366 if data
and (dict_val := data.get(self.
_sensor_label_sensor_label)):
None _update_data_valid(self)
None __init__(self, GlancesDataUpdateCoordinator coordinator, GlancesSensorEntityDescription description, str sensor_label="")
_attr_translation_placeholders
None _update_native_value(self)
None _handle_coordinator_update(self)
bool _numeric_state_expected(self)
None async_setup_entry(HomeAssistant hass, GlancesConfigEntry config_entry, AddEntitiesCallback async_add_entities)