Stimmt, merkt man nicht wenn man nicht alles aufklappt.
2 Rechner und mal knapp 2000 IDs belegt → Vielleicht doch das Skript
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.
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
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.
$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]);
Danke das war es, jetzt werden die Werte in die Variable geschrieben.
LG
Horst
Habe nun ein Modul zum Liber Hardware Monitor gebaut.
Bitte testen und Kommentare zum Modul dort platzieren…
[Modul] Hardware Monitor - IP-Symcon / PHP-Module (Diskussion) - IP-Symcon Community
Moin moin, das geht aber nur mit Windows oder geht auch linux/ubuntu.
Gruß Michael
Müsstest auf der Github Seite des Libre Hardware Monitor nachschauen aber so wies ausschaut geht der wirklich nur für Windows.