Wykresy temperatury z sterboxa na Linuxie

Autor: Rafał S


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 😀

Spadki temperatury dla 2 pomieszczeń spowodowane są wyłączeniem zasilania tych sterboxów na czas modyfikacji podłączenia przewodów.