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.
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.
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 Mit HWiNFO64 kannst du immens viel überwachen.
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
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
Nachtrag: Open Hardware Monitor bietet jetzt auch die json Schnittstelle an. Allerdings wird mein älterer NUC dort auch nicht unterstützt.
Mein Intel NUC ist von Juni 2015 und da läuft ES - irgendwann stirbt ES allerdings nach etwa 3 Tagen mal
und ich habe noch keine Idee warum - aber … es läuft soweit erstmal.
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.
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.
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.
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) .
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.
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
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";
}
}
Allenfalls die Daten loggen und ein Chart darauf erstellen