Source code for datalogd.plugins.libsensors_datasource
import asyncio
import logging
from enum import Enum
from datalogd import DataSource
try:
import sensors
except (ModuleNotFoundError, ImportError):
log = logging.getLogger(__name__.rpartition(".")[2])
log.warning("sensors module not found. Install it with \"pip install PySensors\" or similar.")
else:
# Required modules present, continue loading rest of this module
[docs] class LibSensorsDataSource(DataSource):
"""
Provide data about the running system's hardware obtained using the
``libsensors`` library.
``libsensors`` is present on most Linux systems, or can be installed
from the distribution's repositories (``apt install libsensors5`` on
Debian/Ubuntu, ``pacman -S lm_sensors`` on Arch etc.). The available
sensors will depend on your hardware, Linux kernel, and version of
``libsensors``.
Attempting to initialise this plugin on Windows operating systems will
almost certianly fail.
:param interval: How often to poll the sensors, in seconds.
"""
def __init__(self, sinks=[], interval=1.0):
super().__init__(sinks=sinks)
self.interval = interval
sensors.init()
# Queue first call of update routine
asyncio.get_event_loop().call_soon(self.read_sensors)
[docs] def close(self):
"""
Close the connection to the sensors.
"""
sensors.cleanup()
[docs] def read_sensors(self):
"""
Read sensors and send data to any connected sinks.
"""
loop = asyncio.get_event_loop()
data = []
for chip in sensors.iter_detected_chips():
for feature in chip:
data.append({"type": f"{LibSensorsFeatureType(feature.type).type}", "source": "libsensors", "id": f"{chip}_{feature.label}", "value": feature.get_value()})
self.send(data)
# Reschedule next update
loop.call_later(self.interval, self.read_sensors)
[docs] class LibSensorsFeatureType(Enum):
""" A utility :class:`~enum.Enum` used to interpret integers
representing sensor feature types. """
IN = 0x00
FAN = 0x01
TEMP = 0x02
POWER = 0x03
ENERGY = 0x04
CURR = 0x05
HUMIDITY = 0x06
VID = 0x10
INTRUSION = 0x11
BEEP_ENABLE = 0x18
UNKNOWN = 0xFFFFFFFF
@property
def units(self):
"""
The units associated with this sensor reading type.
"""
try:
return {
self.IN.value : "V",
self.FAN.value : "RPM",
self.TEMP.value : "°C",
self.POWER.value : "W",
self.ENERGY.value : "J",
self.CURR.value : "A",
self.HUMIDITY.value : "%",
}[self.value]
except Exception as ex:
return ""
@property
def type(self):
"""
The name of the type of sensor reading.
"""
try:
return {
self.IN.value : "voltage",
self.FAN.value : "fanspeed",
self.TEMP.value : "temperature",
self.POWER.value : "power",
self.ENERGY.value : "energy",
self.CURR.value : "current",
self.HUMIDITY.value : "humidity",
self.VID.value : "vid",
self.INTRUSION.value : "intrusion",
self.BEEP_ENABLE.value : "beep"
}[self.value]
except Exception as ex:
return "unknown"