Damit du immer genau über die einzelnen Daten deines Smarthome Servers Bescheid weißt, zeige ich dir heute, wie du dir in wenigen Schritten eine PHP-Funktion schreiben kannst, mit der sich alle wichtigen Systemdaten des Servers abfragen lassen. Auf die Funktion kannst du dann mit der Schnittstelle zugreifen, die zu Programmierung der Smarthome-App angelegt wird.
Dieses Tutorial als Video
Folgende Werte lassen sich mit dieser Funktion abfragen:- Die Zeit, die der Server seit dem letzten Start läuft
- Die aktuelle Temperatur des Prozessors
- Die Version des Kernels
- Das Erscheinungsdatum der benutzten Firmwareversion
- Der benutzte Speicher in Prozent
- Der freie Speicher, je nach Größe in kb, Mb, GB oder TB
- Der momentan benutzte Arbeitsspeicher in Prozent
Berechtigungen ändern
Um bestimmte Systemdaten per vcgencmd-Befehl abfragen zu können, ist eine kleine Veränderung der Berechtigungen nötig, da vcgencmd standardmäßig nicht per PHP verfügbar ist. Um dies zu ändern ist nur ein kleiner Eintrag in der sudoers-Datei notwendig. Um diese zu bearbeiten, öffnest du einfach den Editor mit folgendem Befehl:sudo nano /etc/sudoers
www-data ALL=NOPASSWD:/opt/vc/bin/vcgencmd
Systemdaten abfragen und ausgeben
Jetzt wird die Funktion angelegt, die später von der Smarthome-Schnittstelle verwendet wird, um die Systemdaten auszugeben. Dazu erstellst du im Hauptverzeichnis deines Servers eine Datei namens "getSystemInfo.php" und fügst dort den folgenden Quellcode ein:<?php
function getSystemInfo(){
$systeminfo = array();
//Systemlaufzeit abfragen
$uptime = exec("uptime");
//Rückgabestring zurechtschneiden
$uptime = preg_replace("/[0-9][0-9]:[0-9][0-9]:[0-9][0-9] up/", "", $uptime);
$uptime = preg_replace("/,[ ]*.[ ]user.*/", "", $uptime);
$uptime = ltrim($uptime, " ");
array_push($systeminfo, array('name' => 'Laufzeit', 'type' => 'uptime', 'value' => $uptime));
//CPU-Temperatur abfragen und auf Zehntel-Grad runden
exec("cat /sys/class/thermal/thermal_zone0/temp", $cputemp);
$cputemp = round($cputemp[0] / 1000, 1);
array_push($systeminfo, array('name' => 'CPU-Temp', 'type' => 'cputemp', 'value' => $cputemp.' °C'));
//Kernelversion abfragen
$kernel = exec("uname -r");
array_push($systeminfo, array('name' => 'Kernel', 'type' => 'kernel', 'value' => $kernel));
//Speichernutzung abfragen
exec("df --output=used,size", $spaceinfo);
//erstes Element wird übersprungen, da es nur Text enthält
for($i = 1; $i < sizeOf($spaceinfo); $i++){
$info = trim($spaceinfo[$i]);
$info = preg_replace('!\s+!', ' ', $info);
$spacearray = explode(" ", $info);
$usedspace += $spacearray[0];
$totalspace += $spacearray[1];
}
//Benutzten Speicherplatz in Prozent auf ganze Zahlen runden
$spaceusagepercent = round(($usedspace / $totalspace)*100)."%";
array_push($systeminfo, array('name' => 'Speichernutzung', 'type' => 'spaceusage', 'value' => $spaceusagepercent));
//Freien Speicherplatz berechnen
$freespace = $totalspace - $usedspace;
//Zählen, wie oft freier Speicher durch 1024 geteilt werden kann
while($freespace >= 1024){
$counter++;
$freespace /= 1024;
}
//Anhand der Anzahl der durchgeführten Divisionen Größenordnung der Nachkommastellen bestimmen
switch($counter){
case 1:
$sizetext = " Mb";
$decimal = 1;
break;
case 2:
$sizetext = " GB";
$decimal = 1;
break;
case 3:
$sizetext = " TB";
$decimal = 2;
break;
default:
$sizetext = " kb";
$decimal = 0;
break;
}
//Freien Speicherplatz angemessen runden (GB und Mb auf 1 Nachkommastelle, TB auf 2, kb garnicht runden)
$freespace = round($freespace, $decimal);
array_push($systeminfo, array('name' => 'Freier Speicher', 'type' => 'freespace', 'value' => $freespace.$sizetext));
//Arbeitsspeicher-Info abfragen
exec("free", $raminfo);
//RAM-Auslastung aus Ausgabe herauslesen
$info = trim($raminfo[1]);
$info = preg_replace('!\s+!', ' ', $info);
$ramarray = explode(" ", $info);
$totalram = $ramarray[1];
$usedram = $ramarray[2];
//RAM-Auslastung in Prozent auf ganze Zahlen runden
$ramusage = round(($usedram / $totalram)*100)."%";
array_push($systeminfo, array('name' => 'RAM-Nutzung', 'type' => 'ramusage', 'value' => $ramusage));
//Firmwareversion des Betriebssystems abfragen
//Die Versionsinfo ist ein Array mit 3 Werten: Erscheinungsdatum, Copyright-Hinweis, Versionsnummer
exec("sudo /opt/vc/bin/vcgencmd version", $firmwareversion);
//Ausgegeben wird nur das erste Element mit dem Erscheinungsdatum der Versionsinfo
$firmwareversion = $firmwareversion[0];
array_push($systeminfo, array('name' => 'Firmware', 'type' => 'firmware', 'value' => $firmwareversion));
//JSON-Objekt erstellen und zurückgeben
return json_encode(array('systeminfo' => $systeminfo));
}
?>
Erklärung des Codes
Die Funktion liest einige Systemdaten des Raspberry aus, verarbeitet sie gegebenenfalls (zb. wandelt Werte in lesbares Format um) und schreibt sie anschließend in ein JSON-Objekt, welches dann auch zurückgegeben wird. Die Smarthome-App, die noch programmiert wird, liest dieses JSON-Objekt aus und stellt die Daten dann übersichtlich dar, damit man auf einem Blick über die wichtigen Werte des Servers informiert wird.Dieser Beitrag hat dir gefallen?
Dann abonniere doch unseren Newsletter!