Temperatur und Feuchtigkeit Messen

2016/06/16

Auch wenn man bei einigen posts denken könnte, dass ich meinen Beruf verfehlt habe, sei jedem gesagt, nein das ist nicht so. :-) Der Garten ist für mich ein wirklich wichtiger Ausgleich zu meinem Job. Diesen kann ich allerdings nur bedingt ablegen. So kam mir beim bestäuben der Aubergine der Wunsch auf, zu wissen wie warm und feucht es im Gewächshaus ist. Wir haben zwar zwei Thermometer, aber die zeigen mir nicht den Verlauf an. Der Verlauf ist aber nicht ganz unwichtig. Tomaten z.B. wachsen Nachts, aber auch nur wenn es warm ist. :-) Gut, ich bin ja IT’ler! Also bastle ich mir einfach etwas.

Ich habe mir alte Funk Temperatur- und Feuchte-Sensoren besorgt und für den Computer ein passendes Empfänger Modul. Das Modul wird über USB angesprochen und benötigt keinerlei besonderer Treiber. Es liefert die Daten von 18 Sensoren als CVS Information aus. Quasi Perfekt für ein kleines Script.

#!/bin/bash
socat /dev/ttyUSB2,b9600 STDOUT | \
while read line
do
    if [[ "${line%%;*}" == '$1' ]] ; then
        # format data
        tmp=`echo "${line#?1;1;}" | tr ';,' ':.'`
        data=`echo "N${tmp%%0}" | sed 's/::/:U:/g' | sed 's/::/:U:/g'`
        data=${data%%:}
        echo $data
        rrdtool update weather.rrd $data
    fi
done

Ich übernehme alle Werte des Empfängers und speichere sie in eine RoundRobin Datei. Das Script läuft via Cronjob alle 3 Minuten. Der Aufbau der RRD Datei sieht wie folgt aus:

rrdtool create weather.rrd --step 180 \
  DS:temps1:GAUGE:1200:-40:50 \
  DS:temps2:GAUGE:1200:-40:50 \
  DS:temps3:GAUGE:1200:-40:50 \
  DS:temps4:GAUGE:1200:-40:50 \
  DS:temps5:GAUGE:1200:-40:50 \
  DS:temps6:GAUGE:1200:-40:50 \
  DS:temps7:GAUGE:1200:-40:50 \
  DS:temps8:GAUGE:1200:-40:50 \
  DS:hums1:GAUGE:1200:0:100 \
  DS:hums2:GAUGE:1200:0:100 \
  DS:hums3:GAUGE:1200:0:100 \
  DS:hums4:GAUGE:1200:0:100 \
  DS:hums5:GAUGE:1200:0:100 \
  DS:hums6:GAUGE:1200:0:100 \
  DS:hums7:GAUGE:1200:0:100 \
  DS:hums8:GAUGE:1200:0:100 \
  DS:temps9:GAUGE:1200:-40:50 \
  DS:hums9:GAUGE:1200:0:100 \
  DS:winds9:GAUGE:1200:0:200 \
  DS:rains9:DERIVE:1200:0:U \
  DS:israins9:GAUGE:1200:0:1 \
  RRA:AVERAGE:0.5:1:960 \
  RRA:MIN:0.5:96:3600 \
  RRA:MAX:0.5:96:3600 \
  RRA:AVERAGE:0.5:96:3600

Wir haben nun also eine schöne DB in der Regelmäßig die Daten einfließen. Wir benötigen jedoch noch bunte Bilder. Diese erstelle ich mit dem folgenden Script.

#/bin/bash

WEATHER_DIR=/home/<user>/wetter
cd $WEATHER_DIR

DAY=`date +%d`
MONTH=`date +%m`
YEAR=`date +%Y`
WEEK=`date +%V`

VALUE_1=1
VALUE_2=4
VALUE_3=8
VALUE_4=8

function tempValue {
  rrdtool graph $5.png \
    -s "now - 1 $7" -e 'now' \
    DEF:$6$1=weather.rrd:$6$1:AVERAGE \
    LINE1:$6$1#000000:Gewaechshaus \
    DEF:$6$2=weather.rrd:$6$2:AVERAGE \
    LINE1:$6$2#0000FF:Dachboden \
    DEF:$6$3=weather.rrd:$6$3:AVERAGE \
    LINE1:$6$3#FF0000:none \
    DEF:$6$4=weather.rrd:$6$4:AVERAGE \
    LINE1:$6$4#00FF00:none
}

LIST="hour day week month year"
for i in $LIST
do
  tempValue $VALUE_1 $VALUE_2 $VALUE_3 $VALUE_4 "$WEATHER_DIR/temp"$i "temps" $i
  tempValue $VALUE_1 $VALUE_2 $VALUE_3 $VALUE_4 "$WEATHER_DIR/hume"$i "hums" $i
done

Die Variablen “VALUE” sind die Positionen der Werte welche aus dem CVS Format des Empfängers abgelesen werden kann. Die daraus erstellen Bilder sehen so aus.