Wykresy temperatury z sterboxa na Linuxie

Napisane przez  RafaÅ‚ S.
Oceń ten artykuł
(12 głosów)

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.

Joomla templates by a4joomla

Ta strona używa plików Cookie (Ciasteczka). Dowiedz się więcej o celu ich używania i zmianie ustawień cookie w przeglądarce. polityka prywatności.

Zgadzam się z ustawieniami Cookie na tej stronie.

EU w/s Cookie