Zostałem poproszony przez kolegę szoplera o napisanie howto odnośnie prezentacji temperatury na wykresach rrdtool...
A wyglada to tak:
Mala uwaga, czytac komentarze zawarte w skryptach!
Więc zacznijmy od stworzenia bazy mysql, w której będziemy archiwizować zdobyte wyniki ;]
Bazę tworzymy skryptem w php, który wygląda tak:
Kod:
<?php
//plik nazwac mysql.php
$link = mysql_connect("localhost", user, login)
or die("Could not connect");
$query = "CREATE DATABASE temperatura";
$result = mysql_query($query)
or die("<FONT color=\"red\">Problem 1</FONT>");
mysql_select_db("temperatura");
$query = "CREATE TABLE temp (id int NOT NULL auto_increment, date date NOT NULL, time time NOT NULL, temperatura smallint(6) NOT NULL, PRIMARY KEY (id))";
$result = mysql_query($query)
or die("<FONT color=\"red\">Problem 2</FONT>");
echo "jezeli nie widzisz zadnego bledu to wszystko jest ok";
?>
skrypt zapisujemy np do /home/meteo/mysql.php
a następnie odpalamy poprzez następujące polecenie:
Kod:
php -f /home/meteo/mysql.php
W tym momencie mamy już gotową bazę.... teraz kolej na skrypt który będzie ją aktualizował
Kod:
<?
//nazwac aktualizacja.php
/*skrypcik uwzglednia falszywy pomiar(ktory czasami przynajmniej u mnie wystepowal, temperatura wynosila 85*C)
dodatkowo dodana opcja ktora odpala sie w momencie gdy nie otrzymamy zadnych informacji od sondy mierzacej... wtedy aktualna
temperatura wynosi tyle ile ostatni "dobry" pomiar*/
$digitemp_log_rem = `rm -f /home/digitemp_log`;
$digitemp_log_create = `/digitemp_DS9097 -s/dev/ttyS0 -a >> /home/digitemp_log`;
$plik = file("/home/digitemp_log");
$ilosc = count($plik);
$poczatek = $ilosc - 1;
for ($i = $poczatek; $i < $ilosc; $i++)
{
$temp = $plik[ $i ];
}
$hmm = explode(" ","$temp");
$temp_baza = $hmm[6]*100;
/*
zmienna temp baza wyciagnieta z wyniku polecenia /digitemp_DS9097 -s/dev/ttyS0 -a, czyli:
DigiTemp v3.3.2 Copyright 1996-2004 by Brian C. Lane
GNU Public License v2.0 - http://www.brianlane.com
Mar 02 00:02:49 Sensor 0 C: -8.94 F: 15.91
*/
$link = mysql_connect("localhost", login, haslo)
or die("Could not connect");
$d = date('Y-m-d');
$t = date('H:i:00');
mysql_select_db("temperatura");
if ( $temp_baza != "8500" && $temp_baza != "0" )
{
$zapytanie = "INSERT INTO `temp` (`id`, `date`, `time`, `temperatura`) VALUES ('', '$d', '$t', '$temp_baza')";
$idzapytania = mysql_query($zapytanie);
}
else
{
$zapytaniemax = "SELECT MAX(`id`) as `max` FROM `temp`";
$wykonajmax = mysql_query($zapytaniemax);
$max_id_s = mysql_fetch_array($wykonajmax);
$max_id = $max_id_s['max'];
$zapytanie = "SELECT `temperatura` FROM `temp` WHERE `id`='$max_id'";
$wykonaj = mysql_query($zapytanie);
$wiersz = mysql_fetch_row($wykonaj);
$temp_85 = $wiersz[0];
$zapytanie = "INSERT INTO `temp` (`id`, `date`, `time`, `temperatura`) VALUES ('', '$d', '$t', '$temp_85')";
$idzapytania = mysql_query($zapytanie);
}
?>
_________________________________________
Teraz tworzymy baze rrd, takim skryptem:
Kod:
#!/bin/bash
#nazwac create.sh i po zapisaniu jeden raz odpalic
#300 - czas miedzy aktualizacjami, czyli 5 min
#takowa baza moze archiwizowac dane sprzed 2 lat
#-50 i 50 to wartosc minimalna i max jaka mozna zapisac w bazie
# w lini ponizej, jak widac, podajemy sciezke zapisu bazy...
rrdtool create /home/meteo/dane/rrdtool/database/2years.rrd -s 300 \
DS:temp:GAUGE:400:-50:50 \
RRA:AVERAGE:0.5:1:210240 \
RRA:MAX:0.5:1:210240 \
RRA:MIN:0.5:1:210240 \
RRA:LAST:0.5:1:210240 \
_________________________________________
Czas na skrypt aktualizujacy baze rrd:
Kod:
<?
//plik nazwac rrd_update.php
sleep(30);
$link = mysql_connect("localhost", login, haslo)
or die("Could not connect");
$d = date('Y-m-d');
$t = date('H:i:00');
$temperatura = $temp[6];
$temp_baza = $temperatura * 100;
mysql_select_db("temperatura");
$zapytaniemax = "SELECT MAX(`id`) as `max` FROM `temp`";
$wykonajmax = mysql_query($zapytaniemax);
$max_id_s = mysql_fetch_array($wykonajmax);
$max_id = $max_id_s['max'];
$zapytanie = "SELECT `temperatura` FROM `temp` WHERE `id`='$max_id'";
$wykonaj = mysql_query($zapytanie);
$wiersz = mysql_fetch_row($wykonaj);
$temp_surowa = $wiersz[0];
$temp_rrd = $temp_surowa/100;
mysql_close($link);
$update=`rrdtool update /home/meteo/dane/rrdtool/testowo.rrd N:$temp_rrd`; // tu podajemy sciezke do bazy rrd
?>
___________________________________________
Na koniec skrypcik rysujacy wykres....
Kod:
#!/bin/bash
#plik nazwac graph.sh
rrdtool graph /home/httpd/html/testowo.png --imgformat PNG \
--title="Tutul wykresuuuuu" \
--width 800 --height 300 \
--vertical-label="Stopnie Celsjusza �C" \
--end now --start end-2592000s \
DEF:temp=/home/meteo/dane/rrdtool/testowo.rrd:temp:AVERAGE \
GPRINT:temp:LAST:"aktualna %2.2lf �C" GPRINT:temp:MIN:"minimalna %2.2lf �C" GPRINT:temp:MAX:"maksymalna %2.2lf �C" GPRINT:temp:AVERAGE:"srednia %2.2lf �C" \
AREA:temp#6060ef \
LINE1:temp#0000ff
#DEF:temp=/home/meteo/dane/rrdtool/testowo.rrd - sciezka do bazy rrd
#rrdtool graph /home/httpd/html/testowo.png --imgformat PNG - wiadomo.. ;]
#--end now --start end-2592000s - czas jaki jaki ma byc zawarty na wykresie, dla jednego dnia 86400s (60s*60s*24h), dla miesiaca 2592000(60s*60s*24h*30d) itd.....
___________________________________________
W wiekszosci skryptow wystapuje linia
Kod:
$link = mysql_connect("localhost", login, haslo)
chce tylko przypomniec, ze aby to dzialalo te dane trzeba zamienic na swoje.........
Wszystki te skrypty nazwijcie tak jak w komentach
Na samym koncu umieszczamy gdzies skrypt, ktory bedzie to wszystko odpalal:
Kod:
#!/bin/bash
#plik nazwac start.sh
php -f /sciezka/aktualizacja.php
php -f /sciezka/rrd_update.php
sleep 40s
/sciezka/graph.sh
____________________________________________
Dodatkowo pokaze jak wykorzystac ekg to prezentowania temp w opisieskrypt tworzacy plik do odpalania opisu:
Kod:
<?
//plik nazwac ekg_up.php
$link = mysql_connect("localhost", login, haslo)
or die("Could not connect");
mysql_select_db("temperatura");
$datenow = date('Y-m-d');
$date = date('Y-m-d');
$time = date('H:i');
$zapytaniemax = "SELECT MAX(`temperatura`) as `max` FROM `temp` WHERE `date`='$datenow'";
$wykonajmax = mysql_query($zapytaniemax);
$wierszmax = mysql_fetch_array($wykonajmax);
$maksymalnaaday = $wierszmax['max']/100;
$zapytaniemin = "SELECT MIN(`temperatura`) as `min` FROM `temp` WHERE `date`='$datenow'";
$wykonajmin = mysql_query($zapytaniemin);
$wierszmin = mysql_fetch_array($wykonajmin);
$minimalnaaday = $wierszmin['min']/100;
$zapytaniemax = "SELECT MAX(`id`) as `max` FROM `temp`";
$wykonajmax = mysql_query($zapytaniemax);
$max_id_s = mysql_fetch_array($wykonajmax);
$max_id = $max_id_s['max'];
$zapytanie = "SELECT `temperatura` FROM `temp` WHERE `id`='$max_id'";
$wykonaj = mysql_query($zapytanie);
$wiersz = mysql_fetch_row($wykonaj);
$aktualna = $wiersz[0]/100;
$ekg_temp = fopen("/home/meteo/dane/ekg_temp", "w"); // /home/meteo/dane/ekg_temp - plik odpalajacy opisik ekg
$temp_ekg = "echo 'invisible $date $time\\
aktualna:$aktualna �C\\
max:$maksymalnaaday �C\\
min:$minimalnaaday �C' >~/.gg/pipe";
fputs($ekg_temp, $temp_ekg);
?>
aby to wszystko dzialalo odpalamy ekg z opcja -c, czyli np:
Kod:
ekg -u user -c ~/.gg/pipe
plikiem wynikowym skryptu ekg_up.php bedzie plik /home/meteo/dane/ekg_temp ktory po odpaleniu zmieni opisik na gg, na koniec musimy zmienic troszeczke wyglad pliku start.sh:
Kod:
#!/bin/bash
#plik nazwac start.sh
php -f /sciezka/aktualizacja.php
php -f /sciezka/rrd_update.php
sleep 40s
/sciezka/graph.sh
php -f /sciezka/ekg_up.php
/home/meteo/dane/ekg_temp
jak wyglada taki opis? mozna zobaczyc na moim gg-meteo: 9846052