Simple way to create custom sensors for KDE System Monitor via text streams.
- Clone repo.
$ git clone https://github.com/KerJoe/ksystemstats_scripts.git
$ cd ksystemstats_scripts
- Create build directory and compile for release.
$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=/usr -B build .
$ cmake --build build
- Install into
/usr/lib/qt6/plugins/ksystemstats/.
# cmake --install build
- Restart ksystemstats for changes to take effect.
$ systemctl --user restart plasma-ksystemstats.service
Scripts should be added into ~/.local/share/ksystemstats-scripts/ (which is created after first launch of the plugin). Adding scripts into subfolders is also supported. Scripts are enabled by setting the executable flag (chmod +x script) and disabled by removing it.
~/.local/share/ksystemstats-scripts/
├── example.sh
└── folder
└── example.py
You can update script list and restart modified ones by using touching the folder (touch ~/.local/share/ksystemstats-scripts/).
NOTE: Some changes require refreshing the system sensor by, for example, changing the display style, adding/removing sensors or reopening the system monitor.
#!/usr/bin/env python
# SPDX-FileCopyrightText: 2023-2025 KerJoe <2002morozik@gmail.com>
# SPDX-License-Identifier: GPL-3.0-or-later
import random
while True:
req = input().strip().split("\t")
if req[0] == "?":
print("irandom")
elif req[0] == "irandom":
if (req[1] == "value"):
print(random.randint(0, 100))
elif (req[1] == "min"):
print(0)
elif (req[1] == "max"):
print(100)
elif (req[1] == "unit"):
print("%")
else:
print()
else:
print()For extra examples see example.py and example.sh.
The plugin communicates with scripts via stdin and stdout by issuing commands with arguments separated by tabs and ending in a newline, e.g. "sensor_name\tvalue\n". All commands are optional.
The plugins starts by requesting a list of sensors using a "?" command, the script should respond by a tab separated list of all available sensors.
> ?↵
< sensor_1⇥sensor_2⇥sensor_3↵
A current value of the sensor.
> sensor_1⇥value↵
< 63.8↵
A starting value of the sensor.
> sensor_1⇥value↵
< 50↵
A human-readable name of the sensor.
> sensor_1⇥name↵
< Sensor number one↵
A name displayed when there's not enough space for the full name.
> sensor_1⇥short_name↵
< Sensor #1↵
A prefix before sensor name, e.g. "Unit 1 Sensor number one".
> sensor_1⇥prefix↵
< Unit 1↵
A sensor description.
> sensor_1⇥description↵
< The most sensitive sensible sensor↵
A minimum value the sensor value can take (values are not clipped, it is a hint for graphs).
> sensor_1⇥min↵
< -100↵
A maximum value the sensor value can take (values are not clipped, it is a hint for graphs).
> sensor_1⇥max↵
< 100↵
A name of the unit of the sensor value.
> sensor_1⇥unit↵
< B↵
| Response | Meaning |
|---|---|
| - | No unit (123 123) |
| B | Bytes (120.2 KiB) |
| B/s | Bytes per second (120.2 KiB/s) |
| Hz | Hertz (123.1 kHz) |
| Timestamp | Amount of seconds since boot (Yesterday at 12:34) |
| s | Seconds (123 123s) |
| Time | Time (34:12:03) |
| Ticks | Number of kernel ticks (0:20:31 (if CONFIG_HZ is 100)) |
| C | Degrees celsius (123 123°C) |
| b/s | Bits per second (120.2 Kbps) |
| dBm | Decibel-milliwatts (123 123 dBm) |
| % | Percent (123 123%) |
| rate | Rate of change (123 123 s⁻¹) |
| rpm | Revolutions per minute (123 123 RPM) |
| V | Volts (123 123 V) |
| W | Watts (123 123 W) |
| Wh | Watt Hour (123 123 Wh) |
| A | Ampere (123 123 A) |
A name of QVariant type of sensor value.
> sensor_1⇥variant_type
< double
The software is released under the GNU General Public License (GPL) which can be found in the file LICENSE.txt in the same directory as this file.
