diff --git a/homeassistant/components/glances/const.py b/homeassistant/components/glances/const.py index 8e20fbfa46b..56d55931cdb 100644 --- a/homeassistant/components/glances/const.py +++ b/homeassistant/components/glances/const.py @@ -1,5 +1,8 @@ """Constants for Glances component.""" +from __future__ import annotations + import sys +from typing import NamedTuple from homeassistant.const import ( DATA_GIBIBYTES, @@ -26,51 +29,148 @@ if sys.maxsize > 2 ** 32: else: CPU_ICON = "mdi:cpu-32-bit" -SENSOR_TYPES = { - "disk_use_percent": ["fs", "used percent", PERCENTAGE, "mdi:harddisk", None], - "disk_use": ["fs", "used", DATA_GIBIBYTES, "mdi:harddisk", None], - "disk_free": ["fs", "free", DATA_GIBIBYTES, "mdi:harddisk", None], - "memory_use_percent": ["mem", "RAM used percent", PERCENTAGE, "mdi:memory", None], - "memory_use": ["mem", "RAM used", DATA_MEBIBYTES, "mdi:memory", None], - "memory_free": ["mem", "RAM free", DATA_MEBIBYTES, "mdi:memory", None], - "swap_use_percent": [ - "memswap", - "Swap used percent", - PERCENTAGE, - "mdi:memory", - None, - ], - "swap_use": ["memswap", "Swap used", DATA_GIBIBYTES, "mdi:memory", None], - "swap_free": ["memswap", "Swap free", DATA_GIBIBYTES, "mdi:memory", None], - "processor_load": ["load", "CPU load", "15 min", CPU_ICON, None], - "process_running": ["processcount", "Running", "Count", CPU_ICON, None], - "process_total": ["processcount", "Total", "Count", CPU_ICON, None], - "process_thread": ["processcount", "Thread", "Count", CPU_ICON, None], - "process_sleeping": ["processcount", "Sleeping", "Count", CPU_ICON, None], - "cpu_use_percent": ["cpu", "CPU used", PERCENTAGE, CPU_ICON, None], - "temperature_core": [ - "sensors", - "Temperature", - TEMP_CELSIUS, - None, - DEVICE_CLASS_TEMPERATURE, - ], - "temperature_hdd": [ - "sensors", - "Temperature", - TEMP_CELSIUS, - None, - DEVICE_CLASS_TEMPERATURE, - ], - "fan_speed": ["sensors", "Fan speed", "RPM", "mdi:fan", None], - "battery": ["sensors", "Charge", PERCENTAGE, "mdi:battery", None], - "docker_active": ["docker", "Containers active", "", "mdi:docker", None], - "docker_cpu_use": ["docker", "Containers CPU used", PERCENTAGE, "mdi:docker", None], - "docker_memory_use": [ - "docker", - "Containers RAM used", - DATA_MEBIBYTES, - "mdi:docker", - None, - ], + +class GlancesSensorMetadata(NamedTuple): + """Sensor metadata for an individual Glances sensor.""" + + type: str + name_suffix: str + unit_of_measurement: str + icon: str | None = None + device_class: str | None = None + + +SENSOR_TYPES: dict[str, GlancesSensorMetadata] = { + "disk_use_percent": GlancesSensorMetadata( + type="fs", + name_suffix="used percent", + unit_of_measurement=PERCENTAGE, + icon="mdi:harddisk", + ), + "disk_use": GlancesSensorMetadata( + type="fs", + name_suffix="used", + unit_of_measurement=DATA_GIBIBYTES, + icon="mdi:harddisk", + ), + "disk_free": GlancesSensorMetadata( + type="fs", + name_suffix="free", + unit_of_measurement=DATA_GIBIBYTES, + icon="mdi:harddisk", + ), + "memory_use_percent": GlancesSensorMetadata( + type="mem", + name_suffix="RAM used percent", + unit_of_measurement=PERCENTAGE, + icon="mdi:memory", + ), + "memory_use": GlancesSensorMetadata( + type="mem", + name_suffix="RAM used", + unit_of_measurement=DATA_MEBIBYTES, + icon="mdi:memory", + ), + "memory_free": GlancesSensorMetadata( + type="mem", + name_suffix="RAM free", + unit_of_measurement=DATA_MEBIBYTES, + icon="mdi:memory", + ), + "swap_use_percent": GlancesSensorMetadata( + type="memswap", + name_suffix="Swap used percent", + unit_of_measurement=PERCENTAGE, + icon="mdi:memory", + ), + "swap_use": GlancesSensorMetadata( + type="memswap", + name_suffix="Swap used", + unit_of_measurement=DATA_GIBIBYTES, + icon="mdi:memory", + ), + "swap_free": GlancesSensorMetadata( + type="memswap", + name_suffix="Swap free", + unit_of_measurement=DATA_GIBIBYTES, + icon="mdi:memory", + ), + "processor_load": GlancesSensorMetadata( + type="load", + name_suffix="CPU load", + unit_of_measurement="15 min", + icon=CPU_ICON, + ), + "process_running": GlancesSensorMetadata( + type="processcount", + name_suffix="Running", + unit_of_measurement="Count", + icon=CPU_ICON, + ), + "process_total": GlancesSensorMetadata( + type="processcount", + name_suffix="Total", + unit_of_measurement="Count", + icon=CPU_ICON, + ), + "process_thread": GlancesSensorMetadata( + type="processcount", + name_suffix="Thread", + unit_of_measurement="Count", + icon=CPU_ICON, + ), + "process_sleeping": GlancesSensorMetadata( + type="processcount", + name_suffix="Sleeping", + unit_of_measurement="Count", + icon=CPU_ICON, + ), + "cpu_use_percent": GlancesSensorMetadata( + type="cpu", + name_suffix="CPU used", + unit_of_measurement=PERCENTAGE, + icon=CPU_ICON, + ), + "temperature_core": GlancesSensorMetadata( + type="sensors", + name_suffix="Temperature", + unit_of_measurement=TEMP_CELSIUS, + device_class=DEVICE_CLASS_TEMPERATURE, + ), + "temperature_hdd": GlancesSensorMetadata( + type="sensors", + name_suffix="Temperature", + unit_of_measurement=TEMP_CELSIUS, + device_class=DEVICE_CLASS_TEMPERATURE, + ), + "fan_speed": GlancesSensorMetadata( + type="sensors", + name_suffix="Fan speed", + unit_of_measurement="RPM", + icon="mdi:fan", + ), + "battery": GlancesSensorMetadata( + type="sensors", + name_suffix="Charge", + unit_of_measurement=PERCENTAGE, + icon="mdi:battery", + ), + "docker_active": GlancesSensorMetadata( + type="docker", + name_suffix="Containers active", + unit_of_measurement="", + icon="mdi:docker", + ), + "docker_cpu_use": GlancesSensorMetadata( + type="docker", + name_suffix="Containers CPU used", + unit_of_measurement=PERCENTAGE, + icon="mdi:docker", + ), + "docker_memory_use": GlancesSensorMetadata( + type="docker", + name_suffix="Containers RAM used", + unit_of_measurement=DATA_MEBIBYTES, + icon="mdi:docker", + ), } diff --git a/homeassistant/components/glances/sensor.py b/homeassistant/components/glances/sensor.py index 0e032de67be..e33fd121200 100644 --- a/homeassistant/components/glances/sensor.py +++ b/homeassistant/components/glances/sensor.py @@ -4,7 +4,7 @@ from homeassistant.const import CONF_NAME, STATE_UNAVAILABLE from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect -from .const import DATA_UPDATED, DOMAIN, SENSOR_TYPES +from .const import DATA_UPDATED, DOMAIN, SENSOR_TYPES, GlancesSensorMetadata async def async_setup_entry(hass, config_entry, async_add_entities): @@ -14,45 +14,42 @@ async def async_setup_entry(hass, config_entry, async_add_entities): name = config_entry.data[CONF_NAME] dev = [] - for sensor_type, sensor_details in SENSOR_TYPES.items(): - if sensor_details[0] not in client.api.data: + for sensor_type, metadata in SENSOR_TYPES.items(): + if metadata.type not in client.api.data: continue - if sensor_details[0] == "fs": + if metadata.type == "fs": # fs will provide a list of disks attached - for disk in client.api.data[sensor_details[0]]: + for disk in client.api.data[metadata.type]: dev.append( GlancesSensor( client, name, disk["mnt_point"], - sensor_details[1], sensor_type, - sensor_details, + metadata, ) ) - elif sensor_details[0] == "sensors": + elif metadata.type == "sensors": # sensors will provide temp for different devices - for sensor in client.api.data[sensor_details[0]]: + for sensor in client.api.data[metadata.type]: if sensor["type"] == sensor_type: dev.append( GlancesSensor( client, name, sensor["label"], - sensor_details[1], sensor_type, - sensor_details, + metadata, ) ) - elif client.api.data[sensor_details[0]]: + elif client.api.data[metadata.type]: dev.append( GlancesSensor( client, name, "", - sensor_details[1], sensor_type, - sensor_details, + metadata, ) ) @@ -67,45 +64,27 @@ class GlancesSensor(SensorEntity): glances_data, name, sensor_name_prefix, - sensor_name_suffix, sensor_type, - sensor_details, + metadata: GlancesSensorMetadata, ): """Initialize the sensor.""" self.glances_data = glances_data self._sensor_name_prefix = sensor_name_prefix - self._sensor_name_suffix = sensor_name_suffix - self._name = name self.type = sensor_type self._state = None - self.sensor_details = sensor_details + self._metadata = metadata self.unsub_update = None - @property - def name(self): - """Return the name of the sensor.""" - return f"{self._name} {self._sensor_name_prefix} {self._sensor_name_suffix}" + self._attr_name = f"{name} {sensor_name_prefix} {metadata.name_suffix}" + self._attr_icon = metadata.icon + self._attr_unit_of_measurement = metadata.unit_of_measurement + self._attr_device_class = metadata.device_class @property def unique_id(self): """Set unique_id for sensor.""" return f"{self.glances_data.host}-{self.name}" - @property - def device_class(self): - """Return the class of this device, from component DEVICE_CLASSES.""" - return self.sensor_details[4] - - @property - def icon(self): - """Icon to use in the frontend, if any.""" - return self.sensor_details[3] - - @property - def unit_of_measurement(self): - """Return the unit the value is expressed in.""" - return self.sensor_details[2] - @property def available(self): """Could the device be accessed during the last update call.""" @@ -143,7 +122,7 @@ class GlancesSensor(SensorEntity): if value is None: return - if self.sensor_details[0] == "fs": + if self._metadata.type == "fs": for var in value["fs"]: if var["mnt_point"] == self._sensor_name_prefix: disk = var