Metodika měření
Na začátku "projektu" byl na spodní straně zábradlí terasy umístěn jediný venkovní teploměr (v tuto chvíli tOUT2). Vlivem dopadu slunečního světla na zábradlí a okolní opláštění budovy docházelo k jejich zahřívání a tím negativnímu ovlivňování naměřených teplot. Na grafu pak byl patrný značný rozkmit v době slunečního svitu.
Abych tyto výkyvy eliminoval a zároveň zabránil dalšímu nežádoucímu zkreslení naměřených teplot vlivem nakumulovaného tepla v konstrukci terasy v nočních hodinách, umístil jsem za okno terasy, tedy do místa, kde sluneční světlo nedopadá, druhý teploměr (tOUT1).
Jako výsledná venkovní teplota, tOUT, se pak zaznamenává menší z naměřených hodnot tOUT1 a tOUT2. Přičemž naměřené teploty (tOUT1 a tOUT2) se zaznamenávají, ale v základním grafu nezobrazují.
Načítání a ukládání dat na serveru
V tuto chvíli jsou tedy k ASUSU přes 1-Wire sběrnici připojeny dva venkovní teploměry DS18B20 (tOUT1 a tOUT2) a jeden teploměr DS18S20-PAR (tIN) , který je umístěn v místnosti .
Vytvoříme proto RRD databázi, do které budeme zapisovat všechny naměřené teploty, výslednou vypočtenou venkovní teplotu a dále jejich maximální, minimální, průměrné a poslední naměřené hodnoty.
nano create_thermo_rrd.pl
#!/usr/bin/perl
use RRDs;
my $start = time;
my $rrd = "/PATH_TO_DATA_DIR/temperature.rrd";
Create RRD Database If Not Exists
if (not -f $rrd){
RRDs::create ($rrd, "--start",$start-1, "--step",300,
"DS:tempIN:GAUGE:600:-273:5000",
"DS:tempOUT:GAUGE:600:-273:5000",
"DS:tempOUT1:GAUGE:600:-273:5000",
"DS:tempOUT2:GAUGE:600:-273:5000",
"RRA:AVERAGE:0.5:1:1200",
"RRA:MIN:0.5:12:8760",
"RRA:MAX:0.5:12:8760",
"RRA:AVERAGE:0.5:12:8760",
"RRA:LAST:0.5:12:8760",
);
my $ERROR = RRDs::error;
die "$0: unable to create `$rrd': $ERROR\n" if $ERROR;
};
Teploty z 1-Wire teploměrů jsou na webserveru načítány pomocí HTTP protokolu tak, že v pravidelných pětiminutových intervalech je CRONem spuštěn jednoduchý skript v BASHi (rrd-thermo.sh), který načte teploty ze všech definovaných 1-Wire teploměrů a uloží je do RRD databáze. Skript taky vytvoří pomocný PHP soubor s uloženými aktuálními hodnotami, které pak slouží pro rychlé zobrazení teplot na webu bez nutnosti přístupu k RRD, např. při zobrazení teplot na mobilním telefonu nebo při generování XML/RSS s hodnotami.
#!/bin/bash
#rrd-thermo.sh
#v. 200120430-1
#Get temperatures from remote device via HTTP, save to RRD and PHP file;
#(c)Petr KLOSKO;
#http://thermo.klosko.net
GREP=/bin/grep
LYNX=/usr/bin/lynx
AWK=/usr/bin/awk
DATE=/bin/date
BC=/usr/bin/bc
RRDTOOL=/usr/bin/rrdtool
RRD="/PATH_TO_DATA_DIR/temperature.rrd"
PHP="/PATH_TO_WEB_DIR/tIN.php"
URL="http://OWHTTPD_IP:PORT/uncached";
DEVICES=("10BA51350208009B"
"28854328000000D4"
"28C3612800000068")
PHPSTR="<? "
NOW=`$DATE '+%s'`
j=0;
#Read Temperatures, Get values via HTTP
for i in ${DEVICES[*]}
do
TEMP=`$LYNX --dump "$URL/$i" | $GREP -w "temperature" | $AWK '{printf "%3.5f",$2}'`
if [ -z $TEMP ]; then
TEMP="NaN";
fi
TEMPARR[$j]=$TEMP;
PHPSTR="$PHPSTR $var_arr['$i']='$TEMP'; ";
j=$j+1;
done
#Create RRD and PHP values
RESULT="N:${TEMPARR[0]}:";
if [ $(echo "${TEMPARR[1]} < ${TEMPARR[2]}" | $BC) -eq 1 ]; then
MINTEMP=${TEMPARR[1]}
else
MINTEMP=${TEMPARR[2]}
fi
RESULT="$RESULT$MINTEMP:${TEMPARR[1]}:${TEMPARR[2]}"
PHPSTR="$PHPSTR $var_arr['TEMP-OUT']='$MINTEMP'; $var_arr['ts']=$NOW; ?>";
echo $PHPSTR > $PHP;
$RRDTOOL update $RRD $RESULT
Zobrazení teplot na webu
Webserver je zkompilován s podporou PHP, takže pro publikaci dat ve formě grafu je využit právě tento skriptovací jazyk.
Pro generování grafů v PHP přímo z RRD databáze se využívá PECL-rrd rozšíření, které poskytuje vazbu na RRDTool knihovnu napsanou v C. PHP je tedy nutno mít zkompilované s podporou RRD.
Na Debianu (Lenny, Squeeze) je nutno podporu RRD doinstalovat. Jednoduchý návod od Lawrence Salmingo je např. zde : PHP5 RRD Module in Ubuntu/Debian Lenny missing!
PHP funkce pro generování grafu pak může vypadat např. takto:
<?php
$rrd_file = "PATH_TO_TEMPERATURE_RRD_FILE";
$img_file = "PATH_TO_OUTPUT_PNG_FILE";
function create_graph_blog($rrd_file,
$img_file,
$start,
$title,
$var_arr) {
$options = array(
"--font", "DEFAULT:7:Arial",
"--start", "$start",
"--end", "now",
"--imgformat","PNG",
"--width=420",
"--height=80",
"DEF:tIN=$rrd_file:tempIN:AVERAGE",
"DEF:tOUT=$rrd_file:tempOUT:AVERAGE",
"LINE1:tIN#FF0000: tIN=".$var_arr[0]." °C",
"LINE2:tOUT#00b6e4: tOUT=".$var_arr[1]." °C",
"COMMENT:".date("D d.m.Y H\\\:i\\\:s T",$var_arr[2])."",
);
$ret = rrd_graph($img_file, $options, count($options));
if (! $ret) {
echo "<b>Graph error: </b>".rrd_error()."\n";
}
}
create_graph($rrd_file, $img_file, "now-1d", "Teploty", $var_arr);
Header ("Content-type: image/png");
$im = imagecreatefrompng($img_file);
imagepng($im);
?>
Skript vygeneruje PNG obrázek - graf zobrazující průběh průměrných teplot za posledních 24 hodin:
Aktuální venovní a vnitřní teploty nameřené v Praze 8, kde jsou 1-Wire teploměry umístěny, můžete sledovat online na http://thermo.klosko.net/. Rovněž můžete zobrazit graf průběhu teplot za poslední hodinu, den, týden a rok.