Wykresy temperatury z sterboxa na Ubuntu przy użyciu rrdtool
Â
Przygotowanie wykresów jest bardzo łatwe z użyciem darmowego narzędzia rrdtool http://oss.oetiker.ch/rrdtool/
NarzÄ™dzie to jest dostÄ™pne na platformÄ™ Linux oraz przerobiona wersja dla windows, W tym poradniku zajmiemy siÄ™ wersjÄ… dla Linux a konkretnie dystrybucja Ubuntu. OczywiÅ›cie możliwe jest przerobienie poniższego również dla windows metodologia jest bardzo podobna a binarki sa dostÄ™pne zarówno natywne http://www.thebits.info/general/rrdtool-v-1-4-4-win32-binaries-226.htm  jak i poprzez emulator cygwin http://www.cacti.net/downloads/rrdtool/win32/ . Dla przykÅ‚adu zajmiemy siÄ™ jednak linuxem gdyż wiele osób posiada np. routery z wifi pracujÄ…ce 24/7 które idealnie nadajÄ… siÄ™ do zbierania takich wykresów (po szczegóły instalacji rrdtool na takich urzÄ…dzeniach proponujÄ™ szukać przy użyciu gogle gdyż mnogość dystrybucji linuxowych w roterkach jest olbrzymia. Dla przykÅ‚adu link dla posiadajÄ…cych DD-WRT - http://www.linksysinfo.org/index.php?threads/rrdtool-for-dd-wrt-working-howto.12083/Â
Â
Możliwe to jest tez na pewno dla openwrt i tomato ).
Â
Â
Na początek trzeba zainstalować rrdtool
Â
apt-get install librrds-perl rrdtool
Â
Aby wyświetlać dane przydałby się też serwer stron www np. apache2. Odnośnie instalacji polecam wątek http://www.ubuntugeek.com/how-to-install-apache2-webserver-with-phpcgi-and-perl-support-in-ubuntu-server.html
Grafiki wykresów mogą działać na 2 sposoby.
1 grafiki są generowane w trakcie otwierania strony poprzez CGI lub PHP (rozwiązanie generalnie lepsze, ponieważ nie zużywa ciągle zasobów procesora na generowanie wykresów) u siebie zastosowałem CGI w necie można znaleźć przykłady również dla PHP - http://www.phparch.com/2011/02/creating-rrd-graphs-in-php/
2 generowane statycznie z crona co np. 5 minut
Â
Po instalacji przystępujemy do utworzenia plików zbierających dane o temperaturach, katalog gdzie powstanie plik należy utworzyć lub zmienić na własny, ale serwer www musi mieć do niego dostęp by odczytywać dane w przypadku korzystania z CGI
/usr/bin/rrdtool create /var/www/rrd/logs/localhost_stats/roomtemp.rrd \
   --step 300 \
   DS:s1:GAUGE:600:-100:100 \ Â
    DS:s2:GAUGE:600:-100:100 \
   DS:s3:GAUGE:600:-100:100 \
   DS:s4:GAUGE:600:-100:100 \
   DS:s5:GAUGE:600:-100:100 \
   DS:s6:GAUGE:600:-100:100 \
   DS:s7:GAUGE:600:-100:100 \
   DS:s8:GAUGE:600:-100:100 \
   DS:s9:GAUGE:600:-100:100 \
   RRA:MIN:0.5:1:2000 \
   RRA:MIN:0.5:6:2000 \
   RRA:MIN:0.5:24:2000 \
   RRA:MIN:0.5:288:2000 \
   RRA:AVERAGE:0.5:1:2000 \
   RRA:AVERAGE:0.5:6:2000 \
   RRA:AVERAGE:0.5:24:2000 \
   RRA:AVERAGE:0.5:288:2000 \
   RRA:MAX:0.5:1:2000 \
   RRA:MAX:0.5:6:2000 \
   RRA:MAX:0.5:24:2000 \
   RRA:MAX:0.5:288:2000
Â
Okres, co jaki pobierane są dane 600 sekund, minimalna temperatura -100 maksymalna +100 ilość czujników 9
Â
Po utworzeniu pliku przystępujemy do napisania skryptu pobierającego dane z sterbox-a
Â
Â
#!/bin/bash
Â
# build for >=2.0.9 sterbox firmware version page x.cgi
Â
tmp_file=/tmp/sterboxtemp.status  #plik tmp do ktorego zrucamy dane ze sterboxa
htm_file=/var/www/sterbox/temp.htm #plik htm do ktorego zapisujemy dane w celu wyswietlania na stronce www
Â
echo "<html>" > $htm_file   # naglowek html
#out=""
Â
Â
for i in 4 6   # petla do odczytywania danych z wielu sterboxow cyfra 4 6  oznaczają koncowe adresy sterboxów czyli 10.10.0.204 i 206 jeśli mamy inną adresację należy ją zmienić w linii tej i poniższej
do
wget -O $tmp_file "http://10.10.0.20$i/x.cgi" -q  # pobieranie strony
sens1=`cat $tmp_file | awk -F "AN" '{print $2}'`Â Â # Wycinanie danych analogowych
Â
#echo $sens1
sens1=`echo $sens1|awk -F "," '{print $3}'| cut -c 7-11` # wycianie tylko wejscia wa2 i wycinanie 2 znaków przed kropką i 2 po niej czyli sama temperatura z 2 miejscami po przecinku dla wejścia wa1 wystarczy zmienić na print $2 lub można tez skopiować ta linie i ustawić zmienna sens2 dla pobierania danych z 2 wejsc sterboxa za jednym razem
Â
echo $sens1
Â
echo "<p> $i - $sens1 </p>" >> $htm_file Zapisywanie wartości do pliku htm
Â
if [ `echo $out` -n ]; then # doklejanie : tylko dla kolejnych wartosci dla rrd poniższe należy zmodyfikować jeśli chcemy dodawać 2 wejscia z jednego sterboxa np. tak out=$sens1:$sens2 i nizej out=$out":"$sens1:$sens2
Â
out=$sens1Â Â
else
Â
out=$out":"$sens1
fi
Â
done # zamkniecie petli
Â
echo $out
Â
/usr/bin/rrdtool update /var/www/rrd/logs/localhost_stats/roomtemp.rrd --template s1:s2 N:$out  # zapisywanie danych do rrd do pierwszych 2 komórek w pliku  jeśli zbieramy dane z większej ilości sterboxow lub wejść należy dodac kolejne komórki  np. s3 , s4
Â
Skrypt ten należy dodać do crona uruchamiany co 5 minut non stop np. w ten sposób :
1,6,11,16,21,26,31,36,41,46,51,56 * * * * nice --adjustment=-1 sh /root/bin/rrd.run > /var/log/rrd.log 2>&1
Jak widać skrypt został zapisany jako rrd.run w folderze /root/bin/
Â
Skrypt poza zbieraniem temperatur w rrd dla potrzeb wykresów tworzy też mały pliczek htm zawierający zapisane temperatury
Â
Wynik z pliku htm:
4 - 22.08
6 - 20.46
Wykres uzyskujemy tworząc w katalogu cgi-bin naszego serwera stron www plik temp.cgi i zapisując w nim poniższy kod
#!/usr/bin/rrdcgi
<HTML>
<HEAD>
<TITLE>RRD</TITLE>
<style type="text/css">
                                  body {
                                              background-color: #ffffff;
                                  }
                                  div {
                                              border-bottom: 2px solid #aaa;
                                              padding-bottom: 10px;
                                              margin-bottom: 5px;
                                  }
                                  div h2 {
                                              font-size: 1.2em;
                                  }
                                  div.graph img {
                                              margin: 5px 0;
                                  }
                                  div.graph table, div#legend table {
                                              font-size: .8em;
                                  }
                                  div.graph table td {
                                              padding: 0 10px;
                                              text-align: right;
                                  }
                                  div table .in th, div table td span.in {
                                              color: #00cc00;
                                  }
                                  div table .out th, div table td span.out {
                                              color: #0000ff;
                                  }
                                  div table .inpeak th {
                                              color: #006600;
                                  }
                                  div table .outpeak th {
                                              color: #ff00ff;
                                  }
                                  div#legend th {
                                              text-align: right;
                                  }
                                  div#footer {
                                              border: none;
                                              font-size: .8em;
                                              font-family: Arial, Helvetica, sans-serif;
                                              width: 476px;
                                  }
                                  div#footer img {
                                              border: none;
                                              height: 25px;
                                  }
                                  div#footer address {
                                              text-align: right;
                                  }
                                  div#footer #version {
                                              margin: 0;
                                              padding: 0;
                                              float: left;
                                              width: 88px;
                                              text-align: right;
                                  }
                       </style>
Â
</HEAD>
<BODY>
<H1>Digi Temp In Out Home</H1>
Â
Â
Â
<table>
<tr><td>
<RRD::GRAPH
/var/www/rrd/logs/digi1.png
--imginfo '<IMG SRC=/mrtg/%s WIDTH=%lu HEIGHT=%lu >' --start -86400
--width 510 --height 209 --alt-autoscale-max --lazy -v "In Out Temperature"
DEF:s1=/var/www/rrd/logs/localhost_stats/roomtemp.rrd:s1:AVERAGE
DEF:s2=/var/www/rrd/logs/localhost_stats/roomtemp.rrd:s2:AVERAGE
LINE1:s2#0000FF:"Out AVE "
GPRINT:s2:MIN:"Min\:%5.1lf°C"
GPRINT:s2:AVERAGE:"Avg\:%5.1lf°C"
GPRINT:s2:MAX:"Max\:%5.1lf°C"
GPRINT:s2:LAST:"Cur\:%5.1lf°C\n"
LINE1:s1#FF0000:"In AVE "
GPRINT:s1:MIN:"Min\:%5.1lf°C"
GPRINT:s1:AVERAGE:"Avg\:%5.1lf°C"
GPRINT:s1:MAX:"Max\:%5.1lf°C"
GPRINT:s1:LAST:"Cur\:%5.1lf°C\n"
><div>Daily Graph (5 Minute Average)</div></td>
Â
<td>
<RRD::GRAPH
/var/www/rrd/logs/digi2.png
--imginfo '<IMG SRC=/mrtg/%s WIDTH=%lu HEIGHT=%lu >' --start -604800
--width 510 --height 209 --alt-autoscale-max -v "In Out Temperature"
DEF:s1=/var/www/rrd/logs/localhost_stats/roomtemp.rrd:s1:AVERAGE
DEF:s2=/var/www/rrd/logs/localhost_stats/roomtemp.rrd:s2:AVERAGE
LINE1:s2#0000FF:"Out AVE "
GPRINT:s2:MIN:"Min\:%5.1lf°C"
GPRINT:s2:AVERAGE:"Avg\:%5.1lf°C"
GPRINT:s2:MAX:"Max\:%5.1lf°C"
GPRINT:s2:LAST:"Cur\:%5.1lf°C\n"
LINE1:s1#FF0000:"In AVE "
GPRINT:s1:MIN:"Min\:%5.1lf°C"
GPRINT:s1:AVERAGE:"Avg\:%5.1lf°C"
GPRINT:s1:MAX:"Max\:%5.1lf°C"
GPRINT:s1:LAST:"Cur\:%5.1lf°C\n"
><div>Weekly Graph (30 Minute Average)</div></td>
</tr>
<tr><td>
<RRD::GRAPH
/var/www/rrd/logs/digi4.png
--imginfo '<IMG SRC=/mrtg/%s WIDTH=%lu HEIGHT=%lu >' --start -2592000
--width 510 --height 209 --alt-autoscale-max --lazy -v "In Out Temperature"
DEF:s1=/var/www/rrd/logs/localhost_stats/roomtemp.rrd:s1:AVERAGE
DEF:s2=/var/www/rrd/logs/localhost_stats/roomtemp.rrd:s2:AVERAGE
LINE1:s2#0000FF:"Out AVE "
GPRINT:s2:MIN:"Min\:%5.1lf°C"
GPRINT:s2:AVERAGE:"Avg\:%5.1lf°C"
GPRINT:s2:MAX:"Max\:%5.1lf°C"
GPRINT:s2:LAST:"Cur\:%5.1lf°C\n"
LINE1:s1#FF0000:"In AVE "
GPRINT:s1:MIN:"Min\:%5.1lf°C"
GPRINT:s1:AVERAGE:"Avg\:%5.1lf°C"
GPRINT:s1:MAX:"Max\:%5.1lf°C"
GPRINT:s1:LAST:"Cur\:%5.1lf°C\n"
><div>Monthly Graph (2 Hour Average)</div></td>
<td>
<RRD::GRAPH
/var/www/rrd/logs/digi5.png
--imginfo '<IMG SRC=/mrtg/%s WIDTH=%lu HEIGHT=%lu >' --start -31536000
--width 510 --height 209 --alt-autoscale-max --lazy -v "In Out Temperature"
DEF:s1=/var/www/rrd/logs/localhost_stats/roomtemp.rrd:s1:AVERAGE
DEF:s2=/var/www/rrd/logs/localhost_stats/roomtemp.rrd:s2:AVERAGE
LINE1:s2#0000FF:"Out AVE "
GPRINT:s2:MIN:"Min\:%5.1lf°C"
GPRINT:s2:AVERAGE:"Avg\:%5.1lf°C"
GPRINT:s2:MAX:"Max\:%5.1lf°C"
GPRINT:s2:LAST:"Cur\:%5.1lf°C\n"
LINE1:s1#FF0000:"In AVE "
GPRINT:s1:MIN:"Min\:%5.1lf°C"
GPRINT:s1:AVERAGE:"Avg\:%5.1lf°C"
GPRINT:s1:MAX:"Max\:%5.1lf°C"
GPRINT:s1:LAST:"Cur\:%5.1lf°C\n"
><div>Yearly Graph (1 Day Average)</div></td></tr>
</table>
</BODY>
</HTML>
Â
Kod ten wyświetli 4 wykresy dla 4 przedziałów czasowych dzienny, tygodniowy, miesięczny i roczny uśredniając wyniki wykresów dla 2 danych s1 i s2 . należy dodać kolejne do wyświetlania aby można było wyświetlać s3 i s4 dla większej ilości wejść czy steerboxow
Po szczegóły odsyła do dokumentacji rrdtoola z pierwszego linka.  Narzędzie jest bardzo rozbudowane i pozwala nawet porównywać dane z 2 wejść i wyświelać np. tylko różnice czy sumę temperatur.
Przykładowy wykres z 8 sterboxów :D
Â
Â
Â
Spadki temperatury dla 2 pomieszczeń spowodowane są wyłączeniem zasilania tych sterboxów na czas modyfikacji podłączenia przewodów.