🖥️ Pi System Monitor – JavaScript
// V25.01.004
// Linux Pi-System Monitor
// Bessere Fehlerbehandlung und optimierter Code verwendet nun async/await.
// Das Skript überwacht die Spannungswarnung, CPU-Temperatur und die Uptime eines Raspberry Pi-Systems,
// und speichert diese Informationen regelmäßig in ioBroker-Datenpunkten,
// wobei die Temperatur auf eine Stelle und die Uptime auf zwei Stellen hinter dem Komma begrenzt wird.
const { exec } = require("child_process");
const util = require("util");
const execAsync = util.promisify(exec);
// Pfad für die Datenpunkte
const dataPath = "javascript.0.linux-pi-system";
// Funktion zur Aktualisierung oder Erstellung eines Zustands
async function updateOrCreateState(path, value) {
try {
const obj = await getObjectAsync(path);
if (obj) {
await setStateAsync(path, value, true);
} else {
await createStateAsync(path, value, true);
}
} catch (err) {
log(`Fehler beim Aktualisieren oder Erstellen des Zustands: ${err}`);
}
}
// Funktion zur Speicherung der CPU-Temperatur
async function saveCPUTemperature() {
try {
const { stdout } = await execAsync("cat /sys/class/thermal/thermal_zone0/temp");
const millikelvin = parseFloat(stdout.trim());
const celsius = (millikelvin / 1000).toFixed(1);
await updateOrCreateState(`${dataPath}.temperature`, celsius);
} catch (error) {
log(`Fehler beim Abrufen der CPU-Temperatur: ${error}`);
}
}
// Funktion zur Umrechnung und Speicherung der Uptime
async function saveUptime() {
try {
const { stdout } = await execAsync("cat /proc/uptime");
const uptimeInSeconds = parseFloat(stdout.split(' ')[0]);
const uptimeInHours = (uptimeInSeconds / 3600).toFixed(2);
await updateOrCreateState(`${dataPath}.uptime`, uptimeInHours);
} catch (error) {
log(`Fehler beim Abrufen der Uptime: ${error}`);
}
}
// Funktion zur Überprüfung der Spannungswarnung
async function checkVoltageWarning() {
try {
const { stdout } = await execAsync("vcgencmd get_throttled");
const throttled = stdout.trim();
if (throttled === "throttled=0x0") {
await updateOrCreateState(`${dataPath}.powerWarning`, "Voltage OK");
} else {
await updateOrCreateState(`${dataPath}.powerWarning`, "Check Voltage!");
}
} catch (error) {
log(`Fehler beim Abrufen der Spannungswarnung: ${error}`);
}
}
// Initialer Aufruf der Funktionen
saveCPUTemperature();
saveUptime();
checkVoltageWarning();
// Zeitplan für die regelmäßige Ausführung
schedule("*/5 * * * *", saveCPUTemperature); // Alle 5 Minuten die CPU-Temperatur abrufen und speichern
schedule("*/10 * * * *", saveUptime); // Alle 10 Minuten die Uptime abrufen und speichern
schedule("*/1 * * * *", checkVoltageWarning); // Jede Minute die Spannungswarnung prüfen