Trzepak.pl


Forum zablokowane  Ten temat jest zamknięty. Nie można w nim pisać ani edytować postów.
Autor Wiadomość
Post: śr, 04 mar 2009 23:08:48 
Zgłoś ten post Odpowiedz z cytatem
Offline
Leniwy eseista
Leniwy eseista
Awatar użytkownika

Rejestracja: śr, 18 paź 2006 22:27:38
Posty: 586
Lokalizacja: Warszawa
Zostałem poproszony przez kolegę szoplera o napisanie howto odnośnie prezentacji temperatury na wykresach rrdtool...
A wyglada to tak:
Obrazek

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 opisie

skrypt 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


Na górę
Post: czw, 05 mar 2009 22:06:07 
   Tytuł:
Zgłoś ten post Odpowiedz z cytatem
Offline
Młodociany subskrybent
Młodociany subskrybent
Awatar użytkownika

Rejestracja: śr, 05 wrz 2007 18:31:04
Posty: 215
Lokalizacja: 52°10'31"N 22°17'09"E
Dotyczy pierwszego skryptu:
Cytuj:
$link = mysql_connect("localhost", user, login)


Wyrzuca mi tu błąd "Call to undefined function mysql_connect() in ..."

_________________
Radioactive@Home.org


Na górę
Wyświetl posty nie starsze niż:  Sortuj wg  
Forum zablokowane  Ten temat jest zamknięty. Nie można w nim pisać ani edytować postów.


Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość


Nie możesz tworzyć nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Przejdź do:  
Dzisiaj jest czw, 30 mar 2017 0:47:55

Strefa czasowa UTC+02:00
Nakarm glodne dziecko - wejdz na strone www.Pajacyk.pl


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
SubSilver2 modified for Trzepak.pl by Colir
Polski pakiet językowy dostarcza phpBB.pl