向 KSysGuard 添加自定义传感器

向 KSysGuard 添加自定义传感器

我最近发现可以通过附加组件扩展 KSysGuard File-Download New Tabs以显示附加信息。

![KSysGuard 的屏幕截图,显示 CPU 历史记录、内存历史记录、网络传输速率、核心温度和硬盘传输速率。此图像未正确呈现,因为 askubuntu.com 不允许使用新帐户上传图像。][https://i.imgur.com/zPpodNj.png]

我想用一张显示智能插头测量的功耗的图表来扩展此视图。智能插头正在运行 Web 服务器,我使用 Python 脚本查询功耗。为简单起见,让我们考虑这个占位符脚本,它打印 0 到 2500(含)之间的随机整数。

import random

power_consumption_watts = random.randint(0, 2500)

print(power_consumption_watts)

下一步是将此值以某种方式传送到 KSysGuard,但我不知道该怎么做。我发现插件创建了~/.local/share/ksysguard/*.sgrd可能相关的新文件,但我不明白它们是如何工作的。

答案1

我搞明白了。KSysGuard 从程序中获取传感器值ksysguardd,遗憾的是无法轻松扩展,但可以创建一个具有相同接口的程序,KSysGuard 可以从中读取新的传感器数据。这样的程序需要能够处理来自标准输入的以下命令:

  1. monitors,其中列出了所有可用的传感器,my_sensor_name\tintegermy_sensor_name\tfloat成对的传感器,
  2. sensorname,打印传感器的值,
  3. sensorname?,打印传感器的显示名称、最小值、最大值和单位,同样用制表符分隔。

每个输出后应该只有一个换行符。此外,在每个命令之前,ksysguard>无需打印换行符。注意尾随空格。由于 KSysGuard 对确切格式非常挑剔,我在下面添加了一个 Python 脚本,该脚本应该很容易扩展到其他传感器。

如何添加其他传感器:

  1. 创建一个函数来从某处获取传感器值。
  2. 在字典中创建一个新条目sensors。填写:
    1. 字典条目的传感器名称/键(一定不包括空格!)
    2. 新传感器的显示名称。
    3. 单位(MB、°C、kg、瓦特等)
    4. 数据类型(floatinteger
    5. 最小值。
    6. 最大值。
    7. 获取值的函数。

如何让新的传感器出现在 KSysGuard 中:

  1. 将 Python 脚本文件标记为可执行文件:chmod +x fake_ksysguardd.py
  2. 在 KSysGuard 中,转到文件 - 新选项卡...
  3. 输入新标签的标题。
  4. 单击“确定”。
  5. 转到文件-监控远程机器...
  6. 输入任意内容作为主机名。
  7. 选择“自定义命令”。
  8. 输入此文件的完整绝对路径。
  9. 单击“确定”。
  10. 新的传感器现在应该出现在传感器浏览器中。
  11. 将传感器从传感器浏览器拖放到“将传感器拖放到此处”字段,查看一切是否正常工作。

新标签页通常存储在~/.local/share/ksysguard/MyNewTab.sgrd

![KSysGuard 中检测到的传感器的屏幕截图。此图像未正确嵌入,因为 askubuntu.com 不允许使用新帐户上传图像。][https://i.imgur.com/AYh6Eln.png]

#!/usr/bin/env python3
import random

def get_sensor1_value():
    return random.random() * 1000

sensors = {
    "my_sensor1": {
        "display_name": "My Custom Sensor 1",
        "unit": "MB",
        "value_type": "float",
        "min_value": 0,
        "max_value": 1000,
        "get_value": get_sensor1_value,
    },
    "my_sensor2": {
        "display_name": "My Custom Sensor 2",
        "unit": "°C",
        "value_type": "integer",
        "min_value": -100,
        "max_value": 100,
        "get_value": lambda: random.randint(-100, 100),
    },
}

def process_command(command):
    # Print available sensors
    if command == "monitors":
        for sensor_name, sensor_info in sensors.items():
            value_type = sensor_info["value_type"]
            print(f"{sensor_name}\t{value_type}")
        return

    for sensor_name, sensor_info in sensors.items():
        # Fetch and print sensor value
        if command == sensor_name:
            get_value_func = sensor_info["get_value"]
            
            value = get_value_func()

            print(value)
            
            return

        # Print sensor name, range and unit
        if command == sensor_name + "?":
            display_name = sensor_info["display_name"]
            unit = sensor_info["unit"]
            min_value = sensor_info["min_value"]
            max_value = sensor_info["max_value"]
            
            print(f"{display_name}\t{min_value}\t{max_value}\t{unit}")
            
            return
    
    print("UNKNOWN COMMAND")

try:
    print("ksysguardd 1.2.0")

    while True:
        print("ksysguardd> ", end="", flush=True)

        # Wait for new command
        command = input()

        process_command(command)

except KeyboardInterrupt:
    pass
except EOFError:
    pass

如果你更喜欢 Perl,还有这个很好的脚本可以在 KSysGuard 中显示 NVIDIA GPU 信息

相关内容