From 0fdfa505f00588009c9667a3c87d7d605219dd04 Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Thu, 27 Jul 2023 20:47:25 +0200 Subject: add thermal sensor readings from /sys/class/thermal --- src/app.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) (limited to 'src/app.py') diff --git a/src/app.py b/src/app.py index 7533df7..3964a38 100755 --- a/src/app.py +++ b/src/app.py @@ -47,6 +47,7 @@ from http import HTTPStatus import json import os import pwd +import re import shlex import socket import subprocess @@ -314,6 +315,7 @@ class DockerStatus(DockerInspect): 'status': info['State']['Status'], } + class Hostname(Task): def run(self): pass @@ -322,6 +324,64 @@ class Hostname(Task): return socket.gethostname() +class ThermalInfo(Task): + ROOT = '/sys/class/thermal' + + @staticmethod + def _collect_dirs(): + root = ThermalInfo.ROOT + dirs = [ + dir for dir in os.listdir(root) + if re.match(r'^thermal_zone\d+$', dir) + ] + dirs = sorted(dirs) + dirs = [os.path.join(root, dir) for dir in dirs] + return dirs + + @staticmethod + def _read_temp(dir): + with open(os.path.join(dir, 'temp')) as fd: + temp = fd.read() + return ThermalInfo._parse_temp(temp) + + @staticmethod + def _parse_temp(temp): + if not temp.endswith('\n'): + raise RuntimeError('invalid temp file contents: ' + temp) + temp = temp.strip('\n') + try: + temp = int(temp) + except ValueError: + raise RuntimeError('invalid temp file contents: ' + temp) + return round(temp / 1000, 2) + + @staticmethod + def _read_type(dir): + with open(os.path.join(dir, 'type')) as fd: + type = fd.read() + return ThermalInfo._parse_type(type) + + @staticmethod + def _parse_type(type): + if not type.endswith('\n'): + raise RuntimeError('invalid type file contents: ' + type) + type = type.strip('\n') + return type + + @staticmethod + def _read_dir(dir): + return { + 'temp': ThermalInfo._read_temp(dir), + 'type': ThermalInfo._read_type(dir), + } + + def run(self): + pass + + def result(self): + return [self._read_dir(dir) for dir in ThermalInfo._collect_dirs()] + + class Top(Command): COMMAND = None @@ -401,6 +461,7 @@ class Status(TaskList): def __init__(self): tasks = { 'hostname': Hostname(), + 'thermal': ThermalInfo(), 'system': SystemStatus(), 'user': UserStatusList(), } -- cgit v1.2.3