RRD Datenbank auf RaspberryPi

In meinem Beitrag über den RaspberryPi mit RFM12B 868 MHz Enpfänger, habe ich bereits das Modul beschrieben, das die Daten empfängt. Der Code für den Arduino mini liegt auf Github.

In diesem Blogpost möchte ich die Datenerfassung mit dem rrdtool beschreiben.
Die empfangenen Daten werden vom Empfängermodul folgendermassen übergeben, hier dargestellt mit dem serialRead Programm aus WiringPi:

pi@raspberrypi ~ $ ./wiringPi/examples/serialRead
���16   3283    2210    4360    271     17391   69
������16        3283    2210    4350    271     17459   68
������16        3283    2210    4360    272     17528   69
������16        3274    2200    4340    273     17597   69

Die seltsamen ersten Zeichen der Zeilen werden vom serialRead Beispielprogramm ausgegeben, wenn 10s lang keine Daten über seriell empfangen werden und sind ein Byte mit dem Wert 0. Vermeiden lässt sich das, wenn statt

// Loop, getting and printing characters
for (;;)
{
putchar (serialGetchar (fd)) ;
fflush (stdout) ;
}

folgendes gemacht wird

// Loop, getting and printing characters
for (;;)
{
int char1;
if ((char1 = serialGetchar(fd)) > 0)
{
putchar (char1 );
fflush(stdout);
}
}

Die Ausgabe der Empfangsmoduls ist wie folgt zu interpretieren:

– 16: ID des Senders
– 3283: Batteriespannung des Senders, hier 3283 mV
– 2210: Temperatur, hier 22,1°C
– 4360: Luftfeuchte, hier 43,6%
– 271: Minute seit dem letzten Reset des Senders
– 17391: Sekunden seit dem Reset des Empfängers
– 69: Sekunden seit dem letzten Datenpaket.

Momentan werden nur die Temperatur, die Feuchte und die Batteriespannung weiterverarbeitet.

Für die weitere Verarbeitung setze ich die Installation des RRDPakets und eines Apache Webservers mit PHPvoraus. Die RRD Datenbank für meine Daten habe ich so angelegt:

 

rrdtool create sensor16.rrd --step 300 \   -> Messwerte alle 300s
DS:temp:GAUGE:600:U:U \                    -> wenn keine Messwerte nach 600s UNKNOWN, keine Limits :U
DS:hum:GAUGE:600:U:U \
DS:batt:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:8640 \                    -> Messwerte für 30 Tage
RRA:MIN:0.5:12:8760 \                        -> Archiv 1 Wert pro 300*12=1h, 8760h=365 Tage
RRA:MAX:0.5:12:8760 \
RRA:AVERAGE:0.5:12:8760 \


Die rechts eingefügten Kommentare sind bei der Eingabe zu löschen. Die seriell empfangenen Daten werden geparsed und per system() Aufruf an RRD übergeben. Das Programm enthält noch viele Kontrollausgaben, die aber nicht weiter stören. Das parsen der Daten ist nicht unbedingt sehr elegant, ist aber historisch gewachsen und funktioniert.

Die Daten sollen grafisch dargestellt werden und während der Laufzeit erzeugt werden. Das ist zwar nicht besonders performant, schützt aber den Flashspeicher des RaspPi vor zu vielen Schreibzyklen, wenn die Grafiken z.B. alle 5 min per cron erzeugt würden.  Solche Grafiken werden dynamisch beim Aufruf einer PHP Seite mit RRD erzeugt und zeigen die Daten der letzten 24 Stunden. Zwischen 12:00 und 13:30 wurden keine Daten gespeichert. Die Akkus waren schon ziemlich leer, deshalb sinkt die Batteriespannung des Senders so rapide.
rrdtemp
rrdHumidity
rrdBatt
Zusätzlich können auch – ebenfalls dynamisch – Historiendaten (eine Woche, ein Monat) erzeugt werden. Die zugehörigen php Files findet ihr auf Github. Als Einstiegsseite wird tf.php aufgerufen.

rrdTempweek

 

 

Advertisements

Veröffentlicht am 1. Mai 2014, in Raspberry Pi. Setze ein Lesezeichen auf den Permalink. Hinterlasse einen Kommentar.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: