Systeminfo (z.B. Sys_GetHardDiskInfo ( ) ) im Webfront darstellen?

Hallo,

da verliessen sie mich…
Im WIIPS habe ich ein paar Graphen zur (ungefähren) CPU Auslastung gehabt.
Bei meinen Versuchen mit IPS2.2 beta und dem Webfront wollte ich auch so was machen, bin jedoch nicht weitergekommen.
Gefunden habe ich die Befehle zu den Systeminformationen, wie z.B.

Sys_GetHardDiskInfo ( )

Aber wie bekomme ich die in Richtung Webfront? Und wie kann ich die loggen?
Als Ergebniss zu dem Beispiel in der Doku kommt ja nur eine Ausgabe in der IPS Konsole.
(Wie) Mache ich da Variablen drauss? Meine PHP Kenntnisse sind doch arg rudimentär…

Gruß & Danke
Olaf

Hier mal ein Beispiel für die CPU: Folgendes Skript unterhalb einer Dummy-Instanz erstellen, verstecken und 1x ausführen. Danach befinden sich unterhalb der Dummy-Instanz Variablen für jeden CPU-Kern und die durchschnittliche Last, die alle fünf Minuten neu ausgelesen werden. Das Loggen der Variablen kannst Du dann wie gewohnt bei den Variableneigenschaften aktivieren.

<?php
    $parentID = IPS_GetObject($IPS_SELF);
    $parentID = $parentID['ParentID'];

    $cpuInfo = Sys_GetCPUInfo();
    for ($i = 0; $i < count($cpuInfo) - 1; $i++)
    {
        SetValueInteger(CreateVariableByName($parentID, 'CPU '.$i, 1, '~Valve'), $cpuInfo['CPU_'.$i]);
    }
    SetValueInteger(CreateVariableByName($parentID, 'durchschnittliche Last', 1, '~Valve'), $cpuInfo['CPU_AVG']);

    IPS_SetScriptTimer($IPS_SELF, 5*60);
    
    function CreateVariableByName($id, $name, $type, $profile = "")
    {
        global $IPS_SELF;
        $vid = @IPS_GetVariableIDByName($name, $id);
        if($vid === false)
        {
            $vid = IPS_CreateVariable($type);
            IPS_SetParent($vid, $id);
            IPS_SetName($vid, $name);
            IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
            if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
        }
        return $vid;
    }
?>

Hallo Horst!

Danke, Danke, Danke! Das war genau das was ich wissen wollte.

Gruß
Olaf

P.S.: Mußte gerade Grinsen, als ich sah, das die Variablen mit dem Profil „Ventil“ angelegt wurden. Das beschreibt eine CPU sehr Masch.bauer gerecht;-) Danke auch dafür!

das sieht bei nem i7 übrigends sehr geil aus :slight_smile:

Mußt Du erst mal auf einem i9 sehen. Da wird der Platz im Webfront knapp :smiley:

Hallo Leute,

das ist ein sehr interessanter Code, und ich habe ihn auch gleich bei mir eingebaut und nun versucht das ganze auch auf die HDD-Infos zu übertragen…
Leider bisher ohne Erfolg (dazu sind meine IPS und PHP Kenntnisse wohl noch zu bescheiden;))

<?php
    $parentID = IPS_GetObject($IPS_SELF);
    $parentID = $parentID['ParentID'];

    $HDDInfo = Sys_GetHardDiskInfo ();
    for ($i = 0; $i < count($HDDInfo) - 1; $i++)
    {
          for ($j = 0; $j < count('HDD'.$i) - 1; $i++)
        {
         SetValueString(CreateVariableByName($parentID, 'HDD_Letter'.$i, 3), $HDDInfo['HDD'.$j]);
         SetValueString(CreateVariableByName($parentID, 'HDD_Label'.$i, 3), $HDDInfo['HDD'.$j]);
         SetValueInteger(CreateVariableByName($parentID, 'HDD_Total'.$i, 1), $HDDInfo['HDD'.$j]);
         SetValueInteger(CreateVariableByName($parentID, 'HDD_Free'.$i, 1), $HDDInfo['HDD'.$j]);
        }
    }
    
    IPS_SetScriptTimer($IPS_SELF, 5*60);

    function CreateVariableByName($id, $name, $type, $profile = "")
    {
        global $IPS_SELF;
        $vid = @IPS_GetVariableIDByName($name, $id);
        if($vid === false)
        {
            $vid = IPS_CreateVariable($type);
            IPS_SetParent($vid, $id);
            IPS_SetName($vid, $name);
            IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
            if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
        }
        return $vid;
    }
?>

Vielleicht (so meine Hoffnung) ist das ja mit wenigen „Handgriffen“ der Profis heilbar?:smiley:

Joachim

    $parentID = IPS_GetObject($IPS_SELF);
    $parentID = $parentID['ParentID'];

    $HDDInfo = Sys_GetHardDiskInfo();
    for ($i = 0; $i < count($HDDInfo) - 1; $i++)
    {
         SetValueString(CreateVariableByName($parentID, 'HDD '.$i.' Letter', 3), $HDDInfo['HDD'.$i]['LETTER']);
         SetValueString(CreateVariableByName($parentID, 'HDD '.$i.' Label', 3), $HDDInfo['HDD'.$i]['LABEL']);
         SetValueFloat(CreateVariableByName($parentID, 'HDD '.$i.' Total', 2), $HDDInfo['HDD'.$i]['TOTAL'] / pow(1024, 3));
         SetValueFloat(CreateVariableByName($parentID, 'HDD '.$i.' Free', 2), $HDDInfo['HDD'.$i]['FREE'] / pow(1024, 3));
    }

    IPS_SetScriptTimer($IPS_SELF, 5*60);

    function CreateVariableByName($id, $name, $type, $profile = "")
    {
        global $IPS_SELF;
        $vid = @IPS_GetVariableIDByName($name, $id);
        if($vid === false)
        {
            $vid = IPS_CreateVariable($type);
            IPS_SetParent($vid, $id);
            IPS_SetName($vid, $name);
            IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
            if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
        }
        return $vid;
    }

Inklusive Umrechnung in Gibibyte.

Hallo Horst,

vielen Dank!

Ich habe im Rahmen meiner Möglichkeiten noch ein paar kleine Veränderungen gemacht:



<?php


$parentID = IPS_GetObject($IPS_SELF);
    $parentID = $parentID['ParentID'];

    $HDDInfo = Sys_GetHardDiskInfo();
    for ($i = 0; $i < count($HDDInfo) - 1; $i++)
    {
         SetValueString(CreateVariableByName($parentID, 'HDD '.$i.' Laufwerksbuchstabe', 3, '~String'), $HDDInfo['HDD'.$i]['LETTER']);
         SetValueString(CreateVariableByName($parentID, 'HDD '.$i.' Laufwerksbezeichnung', 3, '~String'), $HDDInfo['HDD'.$i]['LABEL']);
         SetValueFloat(CreateVariableByName($parentID, 'HDD '.$i.' Gesamter Speicher', 2), ($HDDInfo['HDD'.$i] ['TOTAL'])/1000000000);
         SetValueFloat(CreateVariableByName($parentID, 'HDD '.$i.' Freier Speicher', 2), ($HDDInfo['HDD'.$i]['FREE'])/1000000000);
    }

    IPS_SetScriptTimer($IPS_SELF, 60*60);

    function CreateVariableByName($id, $name, $type, $profile = "")
    {
        global $IPS_SELF;
        $vid = @IPS_GetVariableIDByName($name, $id);
        if($vid === false)
        {
            $vid = IPS_CreateVariable($type);
            IPS_SetParent($vid, $id);
            IPS_SetName($vid, $name);
            IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
            if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
        }
        return $vid;
    }

?>


So sind die Variablenbezeichnungen jetzt etwas „griffiger“, die Speicherangaben nun in GB…

Joachim

Betriebssysteme zeigen Speicherplatz in Gibibyte an, da würde ich nicht auf Gigabyte gehen.

Hier mal eine Version mit Variablennamen wie „System (C:)“ und Werten wie „21,08 GiB / 59,53 GiB“:

<?php
    $parentID = IPS_GetObject($IPS_SELF);
    $parentID = $parentID['ParentID'];

    $HDDInfo = Sys_GetHardDiskInfo();
    for ($i = 0; $i < count($HDDInfo) - 1; $i++)
    {
         SetValueString(CreateVariableByName($parentID, $HDDInfo['HDD'.$i]['LABEL'].' ('.strtoupper(substr($HDDInfo['HDD'.$i]['LETTER'], 0, -1)).')', 3, '~String'), number_format($HDDInfo['HDD'.$i]['FREE'] / pow(1024, 3), 2, ',', '.').' GiB / '.number_format($HDDInfo['HDD'.$i]['TOTAL'] / pow(1024, 3), 2, ',', '.').' GiB');
    }

    IPS_SetScriptTimer($IPS_SELF, 5*60);

    function CreateVariableByName ($id, $name, $type, $profile = "")
    {
        global $IPS_SELF;
        $vid = @IPS_GetVariableIDByName($name, $id);
        if ($vid === false)
        {
            $vid = IPS_CreateVariable($type);
            IPS_SetParent($vid, $id);
            IPS_SetName($vid, $name);
            IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
            if ($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
        }
        return $vid;
    }
?>

Hallo Horst,

auch nicht schlecht! :wink:

Die Krönung wären jetzt doch noch die weitere CPU-Daten wie Prozessortyp, Geschwindigkeit, RAM-Größe, Temperatur, Lüfterspeed ebenso wie bei den Festplatten (Temperatur etc.)…:smiley:

Joachim

@Horst :

Bitte mal deinen kompletten Script Ordner mit Beschreibung was was ist hier Posten :stuck_out_tongue:

Hallo Horst,

ich habe versucht die Zeile

SetValueString(CreateVariableByName($parentID, $HDDInfo['HDD'.$i]['LABEL'].' ('.strtoupper(substr($HDDInfo['HDD'.$i]['LETTER'], 0, -1)).')', 3, '~String'), number_format($HDDInfo['HDD'.$i]['FREE'] / pow(1024, 3), 2, ',', '.').' GiB / '.number_format($HDDInfo['HDD'.$i]['TOTAL'] / pow(1024, 3), 2, ',', '.').' GiB');

so umzubauen, das ich eine Integervariable und Wert in Prozent des belegten Speichers zu den Laufwerken bekomme, um einen Balken darzustellen.

Irgendwie ist mir die Zeile zu komplex, um da wirklich durchzusteigen.
Könntest du mir behilflich sein, ich steh’ da auf dem Schlauch :confused:

Grüße,
Doc

Sollte so damit klappen:

SetValueInteger(CreateVariableByName($parentID, $HDDInfo['HDD'.$i]['LABEL'].' ('.strtoupper(substr($HDDInfo['HDD'.$i]['LETTER'], 0, -1)).')', 1, '~Valve'), round(100 * $HDDInfo['HDD'.$i]['FREE'] / $HDDInfo['HDD'.$i]['TOTAL']));

@muckel: Der ist relativ langweilig. Habe nur http://www.ip-symcon.de/forum/f53/zvo-gelber-sack-blaue-tonne-auslesen-6468/ und http://www.ip-symcon.de/forum/f23/wetterstation-6271/index7.html#post60190 am laufen. Sonst nur einfache Ereignisse an Instanzen, wie setze Temperatur um X Uhr auf Y °C.

Hallo Horst,

danke für die Hilfe.

Ich habe das nochmal ein wenig angeändert, damit das als Integer und belegter Platz angezeigt wird, ohne deine anderen Variablen zu überschreiben.

SetValueInteger(CreateVariableByName($parentID, $HDDInfo['HDD'.$i]['LABEL'].' ('.strtoupper(substr($HDDInfo['HDD'.$i]['LETTER'], 0, -1)).') in % belegt', 1, '~Valve'), round(100 -(100 * $HDDInfo['HDD'.$i]['FREE'] / $HDDInfo['HDD'.$i]['TOTAL'])));

Ich glaube so langsam verstehe ich auch die Funktion, obwohl ich noch nicht ganz weiss wie du die Anzeige in % bekommst.
Liegt das an „~Valve“?

Viele Grüße,
Doc

Genau, ~Valve ist ein Standardvariablenprofil für die Prozentanzeige. Habe vorne in der Tat vergessen, das String in Integer zu ändern. Hatte weiter hinten nur umgestellt, dass eine Integer-Variable erstellt wird.

Hallo zusammen,

hat zufällig jemand ein Memory-Script dafür geschrieben? Wäre klasse, denn ich tu mir noch sehr schwer mit PHP.

Vielen Dank und viele Grüße
Robert

was genau ist ein „Memory-Script“?

Moin,

ich hab mir die ganzen Daten direkt in Highchart-Graphen gebastelt, macht die Sachen übersichtlicher:

  • CPU pro Core und Durchschnitt
  • Memory ( Arbeitsspeicher, SWAP und virtueller, jeweils frei, belegt, Gesamt )
  • Festplatten ( pro Partition jeweiles frei, belegt, gesamt )
  • Belegte IPS-Variablen, Anzahl Scripte und Kategorien
  • Grösser der IPS-Datenbank

Hi TuxTom77,

kannst Du beschreiben wie du das gemacht hast bzw scripte/screenshots posten?

Wäre super nett von dir!

danke
Robert

Hallo,

„ist alles nur geklaut…“ ( hier aus dem Forum ) und etwas rumgebastelt mit null-PHP Knowhow :slight_smile:

Wenn ich heute noch Zugriff auf meinen Server bekommen, packe ich das hier rein.

Schau dir schon mal den Thread über Highchart an, dann hast du schon mal die graphische Darstellung.

EDIT: hier schon mal Screenshots:

  1. Grösse der Datenbank
  2. CPU pro Core und Mittelwert über alle
  3. Festplattenbelegung, 3 Partition auf 2 phys. Platten
    4 Memory, SWAP und virtueller Speicher
  4. Anzahl belegter Variablen der IPS-License, Anzahl Kategrien und Scripte