Mainboard Monitoring

Hallo.

Ich habe bisher Speedfan genutzt um das Mainboard meines IPS-Servers (Windows) zu überwachen. Leider funktioniert dies nach einem Wechsel des Mainboards nicht mehr so wie es soll (Lüfter und Festplatten werden nicht mehr angezeigt). Hat eventuell jemand hier im Forum auch so ein Monitoring am Start und was wird da für eine Software genutzt? Wäre für Anregungen dankbar

Hi,
seit langem OpenHardwareMonitor und jetzt LibreHardwareMonitor (aktueller Fork). Hat auch einen Web-Server eingebaut so das man die Werte von einem anderen Rechner abfragen kann. Auf dem selben Gerät kann man per WMI auf die Werte zugreifen.

Ralf

Und wie wertest Du das aus? Über WMI oder wertest Du die Webseite aus? Hättest Du eventuell ein Beispiel für mich wie Du die Werte von LibreHardwareMonitor in IPS bekommst?

Hi,
schau dir erstmal an ob bei dir die Lüfter angezeigt werden. Bei mir im Büro mit einem Industrie-PC ist es nicht der Fall. Zu Hause müsste ich nachsehen.

Ich werte es in einem C-Programm per WMI aus also nicht in IPS. Vielleicht würde es ja auch gehen wenn Du SNMP unter Windows aktivierst und dann mit einem IPS-SNMP-Modul einliest.

Ralf

Moin kronos,

ich nutze dafür HWiNFO64 und werte dann die erzeugte csv-Datei aus. Ich hatte auch mal die Erweiterung mittels Remote Sensor CPU Temperatur im WF anzeigen - Seite 13 probiert habe aber festgestellt, dass das für mich keinen Mehrwert bringt :wink: Mit HWiNFO64 kannst du immens viel überwachen.

Gruß
Hans

Hallo kronos,

ich weiß nicht ob du so etwas meinst

auf dem Rechner läuft AIDA64 und zur Auswertung benutze ich die Methode von manni

https://www.symcon.de/forum/threads/15585-CPU-Temperatur-im-WF-anzeigen/page12

Gruß
Thomas

Also erst einmal vielen Dank für die Anregungen - Dank Euer Vorschläge gibt es nun eine Lösung für mein Problem :D.

Der Fork LibreHardwareMonitor beinhaltet die JSON-Funktionalität bereits. Darauf bin ich aber erst durch den Hinweis auf das JSON Addon für den OpenHardwareMonitor gekommen. Nachdem dieses bei mir nicht lief (wäre ja auch zu schön gewesen) habe ich mir mal die Unterschiede zwischen OpenHardwareMonitor und LibreHardwareMonitor genauer angesehen und siehe da - bei letzterem kommt man mit dem Link

http://xxx.xxx.xxx.xxxx: port/data.json

an die gewünschten Daten JSON-codiert ran. Und mit dem simplen Skript von manni

<?

//Daten holen
$content = file_get_contents("http://192.168.22.2:8085/data.json");
$value = json_decode($content);

print_r($value);

?>

kann man sich die Struktur wunderbar ansehen und sich herauspicken was man in IPS haben will. Eine schöne und schlanke Lösung. :loveips:

Moin Kronos,

danke für den Hinweis. Leider funktioniert es nur auf dem Entwicklungssystem während auf dem Produktivsystem mit dem älteren Intel NUC die Fan Infos nicht angezeigt werden. Ich habe mal bei Stefan nachgefragt ob das vielleicht implementiert werden kann.

Ansonsten wäre es in der Tat eine schöne schlanke Lösung im Gegensatz zu meiner Variante mit HWINFO64 :slight_smile:

Nachtrag: Open Hardware Monitor bietet jetzt auch die json Schnittstelle an. Allerdings wird mein älterer NUC dort auch nicht unterstützt.

Gruß
Hans

@PC Oldie

Mein Intel NUC ist von Juni 2015 und da läuft ES - irgendwann stirbt ES allerdings nach etwa 3 Tagen mal :confused:
und ich habe noch keine Idee warum - aber … es läuft soweit erstmal.

LG Tom

Moin Tom,

da ich HWINFO64 einsetze habe ich mit dem NUC keine Probleme. Ich werde mein bisheriges Verfahren - das Auswerten der HWINFO64 Log Datei - nun umstellen auf HWINFO64 in Verbindung mit dem Add-On Remote Sensor Monitor Introducing : Remote Sensor Monitor - A RESTful Web Server | HWiNFO Forum Damit entfällt dann der Umweg mit der Datei.

Gruß
Hans

Hallo,

ich bekomme das mit der Struktur nicht hin. Sie fängt mit [0], [1] etc an ([0] => stdClass Object) was ich nicht selektiert bekomme.

stdClass Object
(
[id] => 0
[Text] => Sensor
[Min] => Min
[Value] => Value
[Max] => Max
[ImageURL] =>
[Children] => Array
(
[0] => stdClass Object
(
[id] => 1
[Text] => BOLT
[Min] =>
[Value] =>
[Max] =>
[ImageURL] => images_icon/computer.png
[Children] => Array
(
[0] => stdClass Object
(
[id] => 2
[Text] => C40
[Min] =>
[Value] =>
[Max] =>
[ImageURL] => images_icon/mainboard.png
[Children] => Array

Wenn ich aber nur SetValue(25787, $value->id[‚2‘]->Text) festlege kommen keine Werte. Bitte Syntax des Aufrufs zur selektierung posten.

Danke

Du kannst beim json_decode den zweiten Parameter auf „true“ setzen. Dann bekommst du ein Array zurück, welches meistens einfacher bei der Auswertung ist als die Objekt-Notation.

paresy

Hallo paresy,

ich bin wohl zu blöd. Das einzige was sich ändert:

Aufruf:

//Daten holen
$content = file_get_contents(„http://“.$IP.":8085/data.json");
$value = json_decode($content, true);

ohne true:
[2] => stdClass Object
(
[id] => 13
[Text] => Core #3
[Min] => 1600,0 MHz
[Value] => 2800,0 MHz
[Max] => 3600,0 MHz
[SensorId] => /amdcpu/0/clock/2
[Type] => Clock
[ImageURL] => images/transparent.png
[Children] => Array

mit true:

[2] => Array
(
[id] => 13
[Text] => Core #3
[Min] => 1600,0 MHz
[Value] => 1600,0 MHz
[Max] => 3600,0 MHz
[SensorId] => /amdcpu/0/clock/2
[Type] => Clock
[ImageURL] => images/transparent.png
[Children] => Array

Ich hätte gerne den z.b. Value] => 1600,0 MHz in eine Variable geschrieben
mit:
SetValue(48203, $value->id[‚13‘]->Value) geht es jedenfalls nicht

Danke & Viele Grüße

Hallo, kann mir jemand eine Anschubhilfe geben, wie man so ein mehrdimensonales Array ausliest? Ich komme leider nicht auf die Lösung.

Gruß
Jürgen

Vielleicht hilft die ein Code-Schnipsel von mir.
Das Script geht alle Einträge im Baum rekursiv durch und legt für jede Kategorie Dumme Instanzen mit Variablen an. Sofern die Variablen schon existieren wird nur der Wert überschrieben. Wenn du nicht alles haben willst, dann kannst du bei den langen if-Bedingungen deine Ausnahmen ergänzen.
Timer dazu der in der gewünschten Häufigkeit feuert und schon hast du einen Verlauf.


<?php

$data = file_get_contents("http://USERNAME:PASSWORT@IP:PORT/data.json");
$json = json_decode($data);

ReadData("", $json->Children[0]);



function ReadData($prefix, $json)
{
    $archiv = 37255;  // Id des Archiv Control
    
    if (!empty($json->Value))
    {
        if ($json->Text != 'CPU Core #1 Distance to TjMax' &&
            $json->Text != 'CPU Core #2 Distance to TjMax' &&
            $json->Text != 'CPU Core #3 Distance to TjMax' &&
            $json->Text != 'CPU Core #4 Distance to TjMax' &&
            $json->Text != 'Core Average'&&
            $json->Text != 'Core Max')   // Ausnahmen 

        {
            $name = $prefix;
            $instanceId = @IPS_GetInstanceIDByName($name, IPS_GetParent($_IPS['SELF']));
            if ($instanceId === false || @IPS_GetName($instanceId) != $name)
            {
                $instanceId = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
                IPS_SetName($instanceId, $name);
                IPS_SetParent($instanceId, IPS_GetParent($_IPS['SELF']));
            }

            $name = $json->Text;
            $variableId = @IPS_GetVariableIDByName($name, $instanceId);
            if ($variableId === false || @IPS_GetName($variableId) != $name)
            {
                $variableId = IPS_CreateVariable(2);
                IPS_SetName($variableId, $name);
                IPS_SetParent($variableId, $instanceId);
                AC_SetLoggingStatus($archiv, $variableId, true);
                AC_SetAggregationType($archiv, $variableId, 0);
            }

            SetValueFloat($variableId, $json->Value);
            //echo "id = " . $json->id . " / Text = " . $json->Text . " / Value = " . $json->Value . " / ==> " . $prefix . "-" . $json->Text . "<br/>";
        }
    }
    else 
    {
       //echo "übersprungen: id = " . $json->id . " / Text = " . $json->Text . "<br/>";
    }

    if (!empty($json->Children))
    {
        $subprefix = $json->Text;
        if (!empty($prefix))
        {
            $subprefix = $prefix . "-" . $json->Text;
        }
        
        //echo "sub: " . $subprefix. "<br/>". "<br/>";
        foreach($json->Children as $entry => $value)
        {
            if ($subprefix != 'SERVER01-OnBoard Port 1 - Management-Data' && 
                $subprefix != 'SERVER01-OnBoard Port 1 - Management-Load' &&
                $subprefix != 'SERVER01-Msft Storage Space-Throughput' &&
                $subprefix != 'SERVER01-HP LOGICAL VOLUME-Throughput' && 
                $subprefix != 'SERVER01-Intel Xeon E3-1265L V2-Powers' && 
                $subprefix != 'SERVER01-Intel Xeon E3-1265L V2-Clocks')  // Ausnahmen 
            {
                ReadData($subprefix, $value); 
            }
        }
    }
}

Viel Erfolg, Gruß
Philip

Hallo Philip,

du bist heute mein Tagesheld:D

das hätte ich mit meinen Kenntnissen nicht hinbekommen, läuft auf Anhieb.:slight_smile:

Vielen vielen DANK!!

Gruß
Jürgen

EDIT:
PC mit Hardwaremonitor neu gestartet, die Warnung tritt nun nicht mehr auf…:confused:. mhm eine Idee was das sein könnte?

Hallo Philip,

eine Warnung habe ich noch, diese ist mir gestern nicht aufgefallen…

Line 14 ReadData("", $json->Children[0]);
Line 51 SetValueFloat($variableId, $json->Value);
Line 80 ReadData($subprefix, $value);

Hast du eine Idee was diese Warnung auslöst?

Hi Jürgen

ich habe überhaupt nicht mehr gesehen, dass du noch geschrieben hast. Etwas verspätet also… Schön das der Schnippsel dir hilft.

SetValueFloat erwartet natürlich, dass in $json->Value eine Zahl steht… Den Fehler würde ich erwarten wenn da halt ein Text drin stand. zB „failed“ oder so…
Wenn dir das Probleme macht, dann frag den Value doch vorher ab, zB mit is_numeric($json->Value) .

Grüße
Philip

1 „Gefällt mir“

Ich hab mich damit auch mal auseinandergesetzt und das in ein möglichst kurzes Script gepackt, ideal wenn man eigentlich nur die CPU-Temperatur als Variable haben will:

<?php
$content = file_get_contents("http://127.0.0.1:8085/data.json");
$value = json_decode($content, true);
$temp = $value['Children'][0]['Children'][0]['Children'][3]['Children'][4]['Value'];
SetValueFloat(xxxxx, $temp); // IPS-Variable für CPU Temp
// Zum Testen, welcher Wert eigentlich genau geholt wird
//$test = $value['Children'][0]['Children'][0]['Children'][3]['Children'][4];
//print_r ($test);
?>

Das läuft bei mir immer unter 20ms Ausführungszeit durch. Das Array ist halt hardwarespezifisch und so muss man sich dieses einmal genauer anschauen, um auch den richtigen Pfad mit der richtigen Temperatur zu treffen. Dafür sind die beiden auskommentierten Testzeilen nützlich.

1 „Gefällt mir“

Achtung neuer Script

  • Komma als Dezimaltrennzeichen durch Punkt ersetzt (9.1.24)

  • Die Variablen konnten nicht umbenannt werden

  • Der Name des Dummy-Muduls wird nun im Script vorgegeben

  • Andere kleine Fehler behoben

  • Einige Sonderzeichen werden aus den JSON-Daten entfernt, ansonsten führte dies zu Fehlermeldungen

Bezug nehmend auf diesen Post habe ich nun eine passende Lösung für gebaut, um über den Lastgang meines Windows-Servers informiert zu sein.
Eventuell auch interessant für andere…

Was ist zu tun:

  • Download des LibreHardwareMonitor von GitHub und über die Aufgabenplanung sicherstellen, dass der HW-Monitor ausgeführt wird, auch wenn kein Benutzer angemeldet ist

GitHub - LibreHardwareMonitor/LibreHardwareMonitor: Libre Hardware Monitor, home of the fork of Open Hardware Monitor

  • Aktivieren des Web-Services und Sicherstellen, dass der Port (Standard 8085) in der Firewall geöffnet wird. Dies ist nötig, damit die JSON-Struktur von Symcon abgefragt werden kann und das Web-Interface im LAN verfügbar ist.

  • Dieses Script anpassen und ausführen, es werden automatisch DummyModule mit den Namen der gewählten Pfade und als Inhalt die Float-Variablen von Min, Max und Value erstellt. Ebenfalls ist ein Ereignis zur Aktualisierung der Daten auf das Script zu setzen

<?php
// JSON von der URL abrufen
$content = file_get_contents("http://192.168.178.76:8085/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'],
    'LW-F' => ['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";
    }
}

Viel Spass beim basteln