Skip to main content

🖥️ 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