Mainboard Monitoring

Hallo,
bin durch Zufall auf diesen Thread aufmerksam geworden.
Habe bisher SpeedFan verwendet (CSV-Datei auswerten).
Habe den LibreHardwareMonitor installiert und statt dem Script gleich den in Symcon eingebauten JSON-Decoder verwendet. Funktioniert Super!
Jetzt muß ich nur noch die notwendigen Variablen herausfinden und diese statt SpeedFan auswerten.
Diese Lösung scheint mit deutlich einfacher und zukunftssicherer zu sein.

Danke
Thomas

Werft mal einen Blick auf Hass.Agent. Dies ist eigentlich ein Tool für Homeassistant, allerdings hat es auch eine MQTT Schnittstelle.
Hierüber lassen sich viele Sensoren (aktuell 37) wie CPU/RAM Auslastung etc. Auslesen und auch den PC Herunterfahren. Funktioniert ohne große Probleme bei mir.
Weiter kann man Benachrichtigungen von Symcon an den PC senden oder sich Buttons erstellen, um in Symcon Aktionen auslösen zu können.

Das mit dem JSON-Decoder habe ich auch gemacht am Anfang, ergibt 1000 Variablen :joy:

Oder hier einige Versuche mit SymconJSLive
image

Stimmt, merkt man nicht wenn man nicht alles aufklappt.
2 Rechner und mal knapp 2000 IDs belegt → Vielleicht doch das Skript :slight_smile:

Moin @mb-stern ,

vielen Dank für den Hinweis auf den Libre HW Monitor. So konnte ich meine komplexe Mischung aus HWInfo und Prometheus Adapter leicht ersetzen. Funktioniert problemlos mit einem alten NUC D54250WYK.

Gruß
Hans

Hallo MB-Stern,

danke für dein Script.

Ich versuche auch gerade mit dem Libre Hardware Monitor an Daten zu kommen, bin aber leider nicht so erfolgreich. :confused:
Wie komme ich denn an die richtigen Children ID’s? Ich möchte z.b. meine VCore haben, habe aber keine Ahnung welche Children ID’s es sein müssen.

Kannst Du oder auch jemand anderes mir das erklären?

Gruß
Horst

Es ist relativ einfach wenn du mal das System dahinter erkannt hast.
Hier habe ich ein paar Beispiele mit den Children erstellt.
Man merke: Jeder Ebene ergibt ein neues Children und es fängt immer mit 0 (Null) an, nicht mit 1
Wenn du jetzt anhand meines Beispiels die Temperatur des CPU-Packages möchtest, wäre dieser Eintrag nötig.

'CPU-Temp' => ['Path' => ['Children', 0, 'Children', 1, 'Children', 3, 'Children', 4],
                    'Profile' => '~Temperature'],

Danke, das hilft mir schon weiter.

Gruß
Horst

Hallo,

das hat geklappt, aber bei VCore wird mir nur 0.0 oder 1.0 angezeigt egal wie ich versuche das Profil zu ändern.
Kannst du mal schauen ob es bei dir richtig angezeigt wird?

Gruß
Horst

Ich habe kein VCore.
Wenn du möchtest dass ichs mir anschaue zeig deinen Script und einen Print der Daten analog meinem weiter oben…

Hallo,

hier das Script:

<?php
// JSON von der URL abrufen
$content = file_get_contents("http://192.168.1.10:8282/data.json");

// JSON decodieren
$value = json_decode($content, true);

// Assoziatives Array für die JSON-Struktur und die gewünschten Schlüssel ('Value', 'Text' und 'Profile')
$jsonStructure = [
    'CPU-Temp' => ['Path' => ['Children', 0, 'Children', 1, 'Children', 3, 'Children', 4],
                    'Profile' => '~Temperature'],
    'CPU-Load' => ['Path' => ['Children', 0, 'Children', 1, 'Children', 4, 'Children', 0],
                    'Profile' => '~Progress'],
    'Memory-Load' => ['Path' => ['Children', 0, 'Children', 2, 'Children', 0, 'Children', 0],
                    'Profile' => '~Progress'],
    'LW-C' => ['Path' => ['Children', 0, 'Children', 6, 'Children', 0, 'Children', 0],
                    'Profile' => '~Progress'],
    'LW-D' => ['Path' => ['Children', 0, 'Children', 5, 'Children', 0, 'Children', 0],
                    'Profile' => '~Progress'],
    'LW-E' => ['Path' => ['Children', 0, 'Children', 3, 'Children', 0, 'Children', 0],
                    'Profile' => '~Progress'],
    'CPUPackage' => ['Path' => ['Children', 0, 'Children', 1, 'Children', 3, 'Children', 4],
                    'Profile' => '~Temperature'],
  'VCore' => ['Path' => ['Children', 0, 'Children', 0, 'Children', 0, 'Children', 0],
                  'Profile' => 'Volt_1'],
    'NetSpeedWANUp' => ['Path' => ['Children', 0, 'Children', 5, 'Children', 2, 'Children', 0],
                    'Profile' => '~Speed'],
    'NetSpeedWANDown' => ['Path' => ['Children', 0, 'Children', 5, 'Children', 2, 'Children', 1],
                    'Profile' => '~Speed'],
    'NetSpeedLANUp' => ['Path' => ['Children', 0, 'Children', 6, 'Children', 2, 'Children', 0],
                    'Profile' => '~Speed'],
    'NetSpeedLANDown' => ['Path' => ['Children', 0, 'Children', 6, 'Children', 2, 'Children', 1],
                    'Profile' => '~Speed']
    //'LW-FM' => ['Path' => ['Children', 0, 'Children', 7, 'Children', 0, 'Children', 0],
    //                'Profile' => '~Progress'],
    
    // Füge weitere Schlüssel hinzu, falls notwendig
];

// Funktion zum Extrahieren der Werte
function extractValues($data, $path) {
    foreach ($path as $key) {
        if (isset($data[$key])) {
            $data = $data[$key];
        } else {
            return null;
        }
    }

    return $data;
}

// ID des übergeordneten Objekts (Root) abrufen
$parentID = IPS_GetParent($_IPS['SELF']);

// Loop durch die JSON-Struktur und extrahiere die Werte
foreach ($jsonStructure as $key => $config) {
    $path = $config['Path'];
    $profile = $config['Profile'];

    $valueData = extractValues($value, $path);

    if ($valueData !== null && isset($valueData['Value'], $valueData['Min'], $valueData['Max'])) {
        // Prüfe, ob das Dummy-Modul bereits existiert
        $dummyModuleID = @IPS_GetObjectIDByName($key, $parentID);

        if ($dummyModuleID === false) {
            // Dummy-Modul-Instanz erstellen
            $dummyModuleID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");  // Dummy Module

            // Setze den Namen des Dummy-Moduls
            IPS_SetName($dummyModuleID, $key);

            // Setze das übergeordnete Objekt des Dummy-Moduls
            IPS_SetParent($dummyModuleID, $parentID);
        }

// Loop durch die Werte und erstelle oder aktualisiere Float-Variablen innerhalb des Dummy-Moduls
foreach (['Value', 'Min', 'Max'] as $position => $variableName) {
    // Finde die Variable im Dummy-Modul basierend auf der Position
    $variableID = IPS_GetObjectIDByIdent("Position" . ($position + 1), $dummyModuleID);

    // Wenn die Variable nicht gefunden wird, versuche, sie zu erstellen
    if ($variableID === false) {
        $variableID = IPS_CreateVariable(2);  // Float
        IPS_SetParent($variableID, $dummyModuleID);
        IPS_SetName($variableID, $variableName);
        IPS_SetIdent($variableID, "Position" . ($position + 1));  // Identifikation setzen
        IPS_SetVariableCustomProfile($variableID, $profile);
        IPS_SetPosition($variableID, $position + 1); // Positionen beginnen bei 1
    }

    // Merke die ID der Variable für spätere Aktualisierungen
    $variableIDMap[$variableName] = $variableID;

    // Setze den Wert der Float-Variable nach expliziter Konvertierung zu Float
    $floatValue = (float)str_replace(['%', '°C'], '', $valueData[$variableName]);

    // Debug-Ausgabe für den Wert
    //echo "Debug: Wert für Variable '{$variableName}': '{$valueData[$variableName]}' (Float: '{$floatValue}', Typ: '" . gettype($floatValue) . "')\n";

    if (!is_nan($floatValue)) {
        // Aktualisiere den Wert der Float-Variable
        SetValue($variableIDMap[$variableName], $floatValue);
    } else {
     //echo "Fehler: Konnte Wert nicht in Float umwandeln für Variable '{$variableName}' (Wert: '{$valueData[$variableName]}').\n";
    }
}


    } else {
        echo "Werte konnten nicht extrahiert werden für Schlüssel: $key\n";
    }
}

und ein Screenshot:

Ergebnis in den Variablen:

Hoffe du kannst damit was anfangen.

Gruss
Horst

Würde sagen da fehlt noch ein Children
Dein VCore ist auf der 5. Ebene, daher 5 Children…
Sollte eigentlich so wie unten funktionieren

'VCore' => ['Path' => ['Children', 0, 'Children', 0, 'Children', 0, 'Children', 0, 'Children', 0],
                  'Profile' => 'Volt_1'],

Leider keine Änderung, die Werte ändern sich von 0,000 auf 1,000 oder umgekehrt.
Ich habe das Gefühl das irgendwie immer auf Ganzzahl gerundet wird.

Das sind die Werte die im Debug kommen, die markierten sind die VCore Zahlen.

Aus irgendeinem Grund werden die in der Variablen nur als Ganzzahl mit 3 Kommastellen angezeigt.

Irgendwo passiert bei dir ein Fehler, ich kann das leider nicht nachvollziehen.
Exisitieren die Variabelprofile?
Haben die Variablenprofile entsprechend Nachkommastellen?
Ev im Script nur einen um den anderen Wert einblenden und schauen wo der Fehler passiert (Die Variable vorher löschen, sonst wird das Profil ev. nicht gewechselt)

Danke,

habe es auch nur mit dem VCore Wert probiert, gleiche Anzeige in der Variable 1.000 oder 0.000 :pensive:

Moin @hbraun ,

da ich auf dem Entwicklungsrechner ein vergleichbares Motherboard wie du es hast habe, hier das Skript für die Ausgabe der VCore Werte von dem Nuvoton NCT6793D.

LibreHW

$JsonInhalt = file_get_contents("http://localhost:8085/data.json");
$HWArray = json_decode($JsonInhalt, true);
print_r($HWArray); // gibt das gesamte Array aus

echo "VCore Text " . $HWArray['Children'][0]['Children'][0]['Children'][0]['Children'][0]['Children'][0]['Text'] . "\n";
echo "VCore "      . $HWArray['Children'][0]['Children'][0]['Children'][0]['Children'][0]['Children'][0]['Value'] . "\n";
echo "VCore min "  . $HWArray['Children'][0]['Children'][0]['Children'][0]['Children'][0]['Children'][0]['Min'] . "\n";
echo "VCore max "  . $HWArray['Children'][0]['Children'][0]['Children'][0]['Children'][0]['Children'][0]['Max'] . "\n";

Damit sollte es auch bei dir funktionieren.

Gruß
Hans

Hallo Hans,

danke für den Codeschnipsel.

Die Werte sehe ich, aber ich bekomme sie nicht in Variable geschrieben bei eine Wert > 1,xxx V steht in der Variable immer 1,000 bei einem Wert < 1,000V steht immer 0,000 in den Variablen.

Ist es möglich das Du das auf deinem Testsystem mal überprüfst?

Gruss
Horst

Das Problem bei dir scheint das ‚,‘ (Komma) zu sein
Suche im Script diese Zeile

$floatValue = (float)str_replace(['%', '°C'], '', $valueData[$variableName]);

und ersetze durch diese Zeile

$floatValue = (float)str_replace([',', '%', '°C'], ['.', '', ''], $valueData[$variableName]);