Systemdaten des Raspberry Pi abrufen

Systemdaten des Raspberry Pi abrufen


23.08.2016  |  Smarthome Server, Tutorial

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
Du kannst verschiedenste Systemdaten des Raspberry auslesen.

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
Wenn der Editor geöffnet ist, fügst du am Ende der Datei die folgende Zeile ein:
www-data ALL=NOPASSWD:/opt/vc/bin/vcgencmd
Dieser Eintrag gewährt Nutzern der Gruppe www-data nun Zugriff auf vcgencmd-Befehle, ohne sie mit einem Passwort bestätigen zu müssen.

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&uuml;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.' &deg;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 &uuml;bersprungen, da es nur Text enth&auml;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&auml;hlen, wie oft freier Speicher durch 1024 geteilt werden kann
	while($freespace >= 1024){
		$counter++;
		$freespace /= 1024;
	}
	
	//Anhand der Anzahl der durchgef&uuml;hrten Divisionen Gr&ouml;&szlig;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&uuml;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.

Über den Autor


Sascha

Hallo, ich bin Sascha, der Gründer von Smarthome Blogger.

Mit einer Leidenschaft für Technologie und einem Hintergrund als Software Engineer habe ich 2016 Smarthome Blogger gegründet. Mein Ziel war es schon immer, innovative Lösungen zu entdecken, die unser Leben einfacher und intelligenter gestalten können. In meinem beruflichen Leben arbeite ich täglich mit Software und Technik, aber auch in meiner Freizeit bin ich stets auf der Suche nach neuen technischen Spielereien und Möglichkeiten, mein Zuhause zu automatisieren und zu verbessern.

Auf Smarthome Blogger teile ich mein Wissen, meine Erfahrungen und meine Begeisterung für alles rund um das Thema Smarthome.



Dieser Beitrag hat dir gefallen?

Dann abonniere doch unseren Newsletter!