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).
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: