Donnerstag, 23. Januar 2014

Datenvisualisierung mit gnuplot

Nachdem ich in meinen vorherigen Einträgen beschrieben habe wie die CPU und GPU Temperatur des Raspberry Pi's per Cronjob kontinuierlich abgerufen werden kann, werde ich jetzt eine einfache Möglichkeit beschreiben die Daten zu visualisieren. Dafür verwende ich das Tool gnuplot.

Falls gnuplot noch nicht installiert ist, kann dies mit folgenden Befehl nachgeholt werden.
sudo apt-get install gnuplot gnuplot-x11

Gnuplot wird über die Kommandozeile gesteuert und kann auf dieser mit dem Programmnamen gestartet werden. Anschließend kann gnuplot über entsprechende Befehle gesteuert werden.
gnuplot>
Um die CSV-Datei darzustellen, verwende ich folgende gnuplot Befehle:

1. Festlegen, dass die einzelnen Datenreihen per Komma getrennt sind.
gnuplot>set datafile separator ","
2. Gnuplot soll beim einlesen der CSV die Zeitachse entsprechend der Datenfestlegung in der CSV-Datei interpretieren.
gnuplot>set timefmt "%Y-%m-%d %H:%M:%S"
3. Auf der x-Achse soll die Zeit aufgetragen werden.
gnuplot>set xdata time 
4. Die x-Achse wird so konfiguriert, dass nur die Stunden und Minuten aufgetragen werden.
gnuplot>set format x "%H:%M"
5. Beide Achsen sollen automatisch skaliert werden.
gnuplot>set autoscale 
6. Die Achsen werden entsprechend Ihres Inhaltes beschriftet
gnuplot>set ylabel "temperature"
gnuplot>set xlabel "time"

7.1 Die graphische Ausgabe erfolgt mit dem plot Befehl. Diesen übergibt man die darzustellende Datei und kann die zu verwende Spaltendarstellung, die Beschriftung der Datenreihe und die Darstellungsart festlegen.
Der folgende Befehl druckt die GPU Temperatur (Spalte 2) zur Zeit (Spalte 1) mit entsprechender Beschriftung und die einzelnen Messpunkte werden mit Linien verbunden.
gnuplot>plot "rpi_temperature.csv" using 1:2 title 'gpu temperature' with lines

7.2 Für die CPU Temperatur erfolgt alternativ die Darstellung mit:
gnuplot>plot "rpi_temperature.csv" using 1:3 title  'cpu temperature' with lines

7.3 Um beide Temperaturen in einem Diagramm zu drucken kombiniert man beide Befehle und trennt diese mit einem Komma.
gnuplot>plot "rpi_temperature.csv" using 1:2 title 'gpu temperature' with lines, "rpi_temperature.csv" using 1:3 title  'cpu temperature' with lines
Um sich die Verwendung etwas zu vereinfachen, können die Einzelbefehle auch in einer Textdatei (z.B. config.plt) abgespeichert und gnuplot übergeben werden. Dieses arbeitet diese dann Zeile für Zeile ab und druckt die Graphik. Da diese anschließend sofort wieder geschlossen wird, sollte man den Befehl -persist verwenden, der dies verhindert.
gnuplot -persist config.plt

Hier noch der Inhalt der config.plt

#Gnuplot script
set datafile separator ","
set timefmt "%Y-%m-%d %H:%M:%S"
set xdata time            
set format x "%H:%M"
set autoscale             
set ylabel "temperature"
set xlabel "time"
plot "rpi_temperature.csv" using 1:2 title 'gpu temperature' with lines, "rpi_temperature.csv" using 1:3 title  'cpu temperature' with lines


Samstag, 18. Januar 2014

Temperaturmessung per Cronjob

Eine simple Möglichkeit die Temperatur des RPi's aufzuzeichnen, ist einen CRON - Job dafür anzulegen.
Dieser bietet die Möglichkeit ein Script automatisch nach einer vorgegeben Zeit auszuführen.

Ich nutzte diese Möglichkeit, um im Minutentakt die Temperatur der CPU und der GPU abzurufen und in eine Textdatei zu schreiben. Dabei verwende ich CSV als Dateiformat, mit folgendem Aufbau:

Datum Uhrzeit,GPU Temperatur,CPU Temperatur

Zur Temperaturmessung habe ich die beiden Python Scripte zur CPU und GPU Temperaturabfrage zu einem Script zusammengefasst. Um dieses per Cron - Job auszuführen, muss beachtet werden, dass der Cron - Daemon die PATH Variable nicht kennt. D.h. für alle Programm- und Dateioperationen müssen absolute Pfadangaben verwendet werden. Dies betrifft in diesem Fall das Programm vcgencmd zur GPU Temperaturabfrage und der Speicherort der CSV-Datei.

#!/usr/bin/python
import os
import csv
import time
from time import gmtime, strftime

def getGpuTemperature():
 #use full path to use in cron job
 ret = os.popen('/opt/vc/bin/vcgencmd measure_temp').readline();
 temperature = ret.replace("temp=","").replace("'C\n","");
 
 return(float(temperature))

def getCpuTemperature():
 tempFile = open( "/sys/class/thermal/thermal_zone0/temp" )
 cpu_temp = tempFile.read()
 tempFile.close()
 return float(cpu_temp)/1000

def main(): 
          
    file = open("/home/pi/rpi_temperature.csv","ab")
    writer = csv.writer(file,delimiter=',')
    temperature=[]
    temperature.append(strftime("%Y-%m-%d %H:%M:%S", gmtime()))        
    temperature.append(getGpuTemperature())
    temperature.append(getCpuTemperature())
    writer.writerow(temperature)    
    file.close()
        


main();
Note: Code Formatierung mit formatmysourcecode

Um dieses Script per Cron - Job automatisch auszuführen, muss dieses in eine User eigene crontab eingetragen werden. Dies ist eine Tabelle mit allen Cron - Jobs des aktuellen Users.
Um diese zu erzeugen bzw. zu bearbeiten, muss auf der Kommandozeile folgender Befehl eingegeben werden:

crontab -e

Anschließend öffnent sich die crontab Datei zur Bearbeitung. In diese habe ich folgende Zeile eingefügt.

* * * * * /home/pi/cpu_temperature.py>>/dev/null

Die fünf Sterne am Anfang konfigurieren den Job so, dass dieser je Minute ausgeführt wird. Ausgeführt wird das python script cpu_temperature.py im home Ordner. Mögliche print Ausgaben werden nach /dev/null umgeleitet.
Durch mein Script wird im Home Ordner eine CSV-Datei erstellt, welche den Messzeitpunkt und die beiden Temperaturwerte enthält. Anbei der Auszug aus meiner Messreihe.

...
2014-01-14 09:26:02,48.2,48.692
2014-01-14 09:27:01,48.7,47.615
2014-01-14 09:28:01,48.2,48.154
2014-01-14 09:29:02,48.2,48.692
...


Sonntag, 12. Januar 2014

Python Script für Raspberry Pi GPU Temperatur


Mit dieser Funktion kann die GPU Temperatur ausgelesen werden.
def getGpuTemperature():
 ret = os.popen('vcgencmd measure_temp').readline();
 temperature = ret.replace("temp=","").replace("'C\n","");
 
 return(float(temperature))
Verwendet wird diese zum Beispiel so:
import os

def getGpuTemperature():
 ret = os.popen('vcgencmd measure_temp').readline();
 temperature = ret.replace("temp=","").replace("'C\n","");
 
 return(float(temperature))
 
print(getGpuTemperature()) 
Note: Code Formatierung mit formatmysourcecode

Python Script für Raspberry Pi CPU Temperatur


Mit dieser Funktion kann die CPU Temperatur ausgelesen werden.
 def getCpuTemperature():  
  tempFile = open( "/sys/class/thermal/thermal_zone0/temp" )  
  cpu_temp = tempFile.read()  
  tempFile.close()  
  return float(cpu_temp)/1000
Verwendet wird diese zum Beispiel so:
import os

def getCpuTemperature():
 tempFile = open( "/sys/class/thermal/thermal_zone0/temp" )
 cpu_temp = tempFile.read()
 tempFile.close()
 return float(cpu_temp)/1000
 
print(getCpuTemperature())
Note: Code Formatierung mit formatmysourcecode