Temperaturmessung mit Linksys Router

Ich habe zwei Linksys Router im Einsatz. Der eine Router funktioniert als Gateway und hat eine SD-Karte drinnen, der andere agiert als WLAN Router, wobei die Sendeleistung soweit gedrosselt ist, dass das WLAN nur in zwei Zimmer funktioniert. Den zweiten Router habe ich dazu auserkoren, dass es zusätzlich über 1-Wire die Temperatur misst. Da er aber keine Speichererweiterung hat, speichere ich die Daten auf dem Gateway. Um kein Remotefilesystem einsetzen zu müssen, was meist den Flash Speicher sprengen würde (4MB!), habe ich ein paar Scripte gebastelt. (Anmerkung: selbst NFS, samba oder sshfs liesen sich auf Grund des Speichers nicht installieren).

Den 1-Wire Adapter habe ich von dieser Webseite nachgebaut. Der Sensor DS 18S20 benötigt mindestens 3V und funktioniert mit kurzen Kabel auch an 3,3V problemlos. Für längere Leitungen sollte ein höhere Spannung verwendet werden, die aber am Router nicht zu Verfügung stand. Der Adapter ist an den zweiten seriellen Port angeschlossen (unter Linux /dev/ttyS1).

Linksys Router - serielle Schnittstellen

Linksys Router - serielle Schnittstellen

Linksys Router - serielle Schnittstellen mit Stiftleiste

Linksys Router - serielle Schnittstellen mit Stiftleiste

1-wire Adapter

1-wire Adapter

Linksys Router mit 1-wire Adapter

Linksys Router mit 1-wire Adapter

Als Software kommt digitemp zum Einsatz. Alle angeschlossenen Adapter werden über folgenden Befehl automatisch gesucht und in die config-Datei eingetragen:

digitemp -s /dev/tts/1 -i

Die Temperatur wird jede Minute über einen Cronjob zum Gateway übertragen.

Cronjob:

*/1 * * * * /root/script/read_temp.sh > /dev/null

Script read_temp.sh:

SERVER=192.168.0.1 digitemp_DS9097 -s /dev/ttyS1 -q -a -o"%.2C" | nc $SERVER 39999

Das Script gibt die Temperatur als Float-Zahl mit zwei Nachkommastellen aus, z.B. 23.61 und überträgt es an den Server über das Programm Netcat nc.

Am Gateway ist auf der SD-Karte über das RRD-Tool eine Round-Robin-Datenbank erstellt worden, welche die Daten aufnimmt und Mittelwerte entsprechend mitspeichert:

rrdtool create temp_sensor1.rrd --step 60 \ 
DS:temp:GAUGE:120:U:U \ 
RRA:AVERAGE:0.5:1:2160 \ 
RRA:AVERAGE:0.5:5:2016 \ 
RRA:AVERAGE:0.5:15:2880 \ 
RRA:AVERAGE:0.5:60:8760

In diese RRD-Datenbank speichert der „Temperaturdaemon„, welcher beim Booten gestartet wird seine Daten:

# cat rx_server rx_handler() 
{
 TEMP=`echo $1 | awk '{print $1}'` rrdtool update /root/data/db/temp_sensor1.rrd N:$TEMP
} 

while true;
 do nc -l -p 39999 | while read line; do rx_handler "$line"; done;
done

Jede Stunde wird das Ergebnis ausgewertet und eine Grafik erzeugt, welche über den uhttpd under http://gateway/temp/ angezeigt wird.

# cat gen_graph rrdtool graph /www/temp/temp_sensor1.png --start -1d -t "Zimmertemperatur" --vertical-label "Temperatur in °C" -l 10 -u 30 \ 
DEF:t1=/root/data/db/temp_sensor1.rrd:temp:AVERAGE \ 
VDEF:t1cur=t1,LAST \ 
VDEF:t1avg=t1,AVERAGE \ 
LINE1:t1#55FF55:"Zimmertemperatur\n" \ 
GPRINT:t1cur:"Aktuell\: %5.1lf °C\n" \ 
GPRINT:t1avg:"Durchschnitt\: %5.1lf °C\n" > /dev/null

Crontab:

01 * * * * /root/data/gen_graph > /dev/null

Ergebnis:

Temperaturlogging mit digitemp und rrdtool

Temperaturlogging mit digitemp und rrdtool

Leave a comment

Your comment