Online teploměr s ASUS WL-500gP V2 - zpracování a zobrazení teplot na webu

V minulém článku jsme nainstalovali na ASUS WL-500gP V2 podporu USB a 1-Wire protokolu a rovněž zprovoznili přístup k jednotlivým 1-Wire teploměrům přes HTTP protokol pomocí owhttpd z balíku OWFS. V tomto článku si ukážeme jak data zpracovat, načíst a uložit do RRD databáze, a zobrazit teploty na webu.


Online teploměr s ASUS WL-500gP V2 - zpracování a zobrazení teplot na webu Štítky:  , , , , ,

    V minulém článku jsme na ASUS WL-500gP V2 nainstalovali podporu USB a 1-Wire protokolu a zprovoznili přístup k jednotlivým teploměrům přes HTTP protokol pomocí owhttpd. Právě této vlastnosti jsem využil ke vzdálenému načítání teplot z ASUSU na webserveru, kde jsou data ukládána do RRD databáze. Z té se následně generují grafy pomocí PHP a publikují online na webu.


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:

Online teploměr s ASUS 500gP V2 - Denní graf teplot

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.
;  
Vaše názory a komentáře: 1 ;  Zobrazeno: 19922 x ;  Hodnoceno: 1 x ;  Hodnocení článku : Hodnocení článku:100%

Hodnocení článku: 1 2 3 4 5

Vaše názory a komentáře (1)
Petr KLOSKO
#221: 12.05.2012 ; 11:26:40
Změněná metodika měření venkovní teploty, upraven skript pro načítání teplot. Článen doplněn o popis metodiky měření.
 

Přidat komentář
Jméno
E-Mail
Zadejte desátou čísici z čísla Zadejte desátou čísici z čísla
Pokud očekáváte odpověď na Vámi vložený komentář, zadejte Váš e-mail.
Vložením komentáře souhlasíte s pravidly.