úprava vykreslování grafu pomocí RRDtool
RRDtool nabízí spoustu možností jak vykreslování grafů upravit a proto jsem se rozhodl i ty svoje, které používám k vykreslování průběhu měřený teplot, upravit.
Takže jsem se z původního vzhledu: Dostal až k tomuto:
Původní skript k vykreslování grafu lite.php, který se cronem pouští každých 5 minut a vykresluje grafy jen 2 poslední dny a 3 hodiny, vypadal takto:
<?
include ("config.php");
$commands_all = array("hour"=>"--start -10800", "day"=>"--start -160000");
foreach ($commands_all as $name=>$time)
{
$command = $rrdtool.' graph '.$rrdImgDir.'all_'.$name.'.png '.$time.' ';
foreach ($sensors as $n=>$str)
{
$command .= 'DEF:d'.$n.'='.$rrdDir.$n.'.rrd:temp:AVERAGE ';
}
foreach ($sensors as $n=>$str)
{
$command .= 'LINE1:d'.$n.$color[$n].':"'.$str.'" ';
}
$command .= '-h'.$y.' -w'.$x.' -y1:2 --color GRID#dddddd --color MGRID#aaaaaa';
shell_exec($command);
}
?>
Hlavní výhodou takto napsaného skriptu je, že se změnou počtu čidel netřeba nic měnit, stačí upravit jen config.php, pro úravy je lehce nepřehledný, ale dílo se povedlo a nová verze vypadá takhle:
<?
# Cooper Dale
include ("config.php");
$commands_all = array("hour"=>"--start -10800", "day"=>"--start -160000");
foreach ($commands_all as $name=>$time)
{
$command = $rrdtool.' graph '.$rrdImgDir.'all_'.$name.'.png '.$time.' -t "Teploty u Coopera" -v "teplota v °C" --watermark "by Cooper" ';
$command .= 'HRULE:0'.$ZeroTempColor.':"'.$ZeroTempText.' \\n" ';
foreach ($sensors as $n=>$str)
{
$command .= 'DEF:d'.$n.'='.$rrdDir.$n.'.rrd:temp:AVERAGE ';
}
foreach ($sensors as $n=>$str)
{
$command .= 'LINE1:d'.$n.$color[$n].':"'.$str.' \\t" ';
$command .= 'GPRINT:d'.$n.':MIN:"Min\: %5.2lf%s \\t" ';
$command .= 'GPRINT:d'.$n.':AVERAGE:"Avg\: %5.2lf%s \\t" ';
$command .= 'GPRINT:d'.$n.':MAX:"Max\: %5.2lf°C \\n" ';
}
$command .= 'LINE2:'.$CustomLine1.$CustomLine1Color.':'.$CustomLine1.'"'.$CustomLine1Text.'\\n" ';
$command .= '-h'.$y.' -w'.$x.' -y1:2 --color GRID#dddddd --color MGRID#aaaaaa';
shell_exec($command);
}
?>
A protože i já jsem na oficiálním webu RRDtool hodně tápal, vysvětlím pár důležitých řádků skriptu.
- Přidání názvu grafu, popisky svislé osy a vodoznaku se povedlo takto:
$command = $rrdtool.' graph '.$rrdImgDir.'all_'.$name.'.png '.$time.' -t "Teploty u Coopera" -v "teplota v °C" --watermark "by Cooper" ';
- Přidání vodorovné čáry, která se zobrazí jen když je třeba se děje pomocí HRULE, hladina je 0°C s barvou a textem který se načítá z config.php.
$command .= 'HRULE:0'.$ZeroTempColor.':"'.$ZeroTempText.' \\n" ';
- Následně se pomocí DEF načítají data z databáze a vykreslují pomocí LINE s tloušťkou čáry 1, netřeba více vysvětlovat.
- Pak se vkládá legenda grafu pomocí GPRINT , následuje opět název proměnné, co se má vypsat, zde MINimální hodnota z vykreslovaného průběhu, popisek hodnoty, 5 značí počet pozic před desetinou čárkou, 2 za ní. Zaokrouhlování ale není u teplot třeba, ale pro jistotu a omezení chyb nechávám. Dále ze pomocí l zarovná doleva a na závěr \\tabulátor pro mezeru, po MAX \\nový řádek. Shodně se děje i pro AVEARGE, MAX i případně LAST.
$command .= 'GPRINT:d'.$n.':MIN:"Min\: %5.2lf%s \\t" ';
$command .= 'GPRINT:d'.$n.':AVERAGE:"Avg\: %5.2lf%s \\t" ';
$command .= 'GPRINT:d'.$n.':MAX:"Max\: %5.2lf°C \\n" '; - Dále vykresluji přes LINE povinnou a pevnou hladinu, s tloušťkou 2 body, ostatní parametry jsou uloženy v config.php, ta je na rozdíl od HRULE vidět vždy.
$command .= 'LINE2:'.$CustomLine1.$CustomLine1Color.':'.$CustomLine1.'"'.$CustomLine1Text.'\\n" ';
- Vlastní config.php se rozrostl o tyto řádky:
$CustomLine1 = 24;
$CustomLine1Color = "#0DC4F250";
$CustomLine1Text = "°C ideál pro akvárko";
$ZeroTempColor = "#0000ff";
$ZeroTempText = "mrzlo!"; - Jelikož lite.php generuji každých 5 minut a měsíční a roční graf jen jedou denně, je třeba v podobném duchu upravit i graphdata.php, kde jsem už řešil jen úpravu vykreslování společných grafů.
- na závěr trochu opakování:
- Řádek v /opt/etc/crontab vypadá následovně:
01 01 * * * admin php /opt/etc/tempsensor/graphdata.php
*/5 * * * * admin /opt/etc/tempsensor/teplota - Skript /opt/etc/tempsensor/teplota který spouští celý proces měření, zapisování, vykreslování a zároveň ošetřuje dobu kdy je obrázek s grafem, kvůli jeho generování, nedostupný:
#!/bin/sh
#merici skript na mereni teploty
#mereni
/opt/bin/digitemp_DS9097 -aq -c /opt/etc/digitemp.conf > /opt/var/log/temperature.log && mv /opt/var/log/temperature.log /opt/var/log/digitemp.txt
#zapsani do DB
php /opt/etc/tempsensor/logdata.php
#vykresleni jednoducheho grafu
php /opt/etc/tempsensor/lite.php
#kopie souboru s obrazkem
cp /opt/share/www/lighttpd/temperature/all_day.png /opt/share/www/lighttpd/temperature/all_day_graph.png
cp /opt/share/www/lighttpd/temperature/all_hour.png /opt/share/www/lighttpd/temperature/all_hour_graph.png - Výsledek je k vidění zde: http://cz777cooper.no-ip.info/temperature/akt.php
- Celý návod o tom jak měřím teplotu je zde – …/zprovozneni-mereni-teploty
Doufám že je tento jednoduchý návod srozumitelný a bude někomu ku prospěchu. Případné dotazy pište do komentářů.
Ahoj,
perfektní návod na vylepšení grafů. Chtěl jsem se zeptat, jestli by nešel udělat nějaký návod, jak to dát do té tabulky, co máš ty? Nebo alespoň nějaký nástřel, jak na to?
Díky
Není to nic složitého, soubory *.txt které jsou v /opt/etc/tempsensor/config.php definovány jako $outFile[x] čtu pomocí php
shell_exec
a časy pomocíStrFTime
a následně vykresluji do tabulky.Takže to vypadá asi takhle – http://www.sdilejkod.cz/kod/3502#kod.
Tak doufám že to pomůže.
Jako bonus se chystá aplikace pro Android která zobrazí data z tabulky, nic náročného.
Něšly by ty hodnoty pro tabulku také číst přímo z RRD databáze?
A co to má být za Aplikaci pro Android? Já sice ještě „Androjdí“ telefon nemám, ale až můj telefonek se Symbianem doslouží, asi na Androida přejdu.
Tak určitě by to šlo, pro vykreslení grafu je čtu a vypisuji. Jen jsem nevyužil LAST, tedy:
$command .= 'GPRINT:d'.$n.':LAST:"Posledni\: %5.2lf%s \\t" ';
, ale data pro tabulku se generují rovnou v rámci skriptu logdata, dle mého názoru je to tak i výkonově méně náročnější.Aplikaci pro android představím až bude hotová, ale nic od ní nečekej, je to vlastně jen jinak zobrazená tabulka teplot.
Sice to nepatří pod toto téma ale nevím kam jinam, když Očko už neexistuje.
Dlouho mám v tomto routeru firmware Oleg odsud http://oleg.wl500g.info/
a nyní jsem našel tento webík http://code.google.com/p/wl500g/
Chápu dobře, že to je dál rozvíjen ten Olegův fw a můžu tedy poslední verzi nacpat do wl500gp ? Je mě divný, že by se to utlo v r.2008 (1.9.2.7-10).
Pak ještě nerozumím proč tam jsou verze 1.9.2.7-rtn a 1.9.2.7-d , jaký je rozdíl ?
Očko stále funguje, pouze ale na adrese wl500.cz 🙂
@Tom
Máš pravdu, nepatří, ale když tak koukám na obnovený projekt Olega na http://code.google.com/p/wl500g/ chápu že verze D je s jádrem 2.4.37 a nadále se nerozvíjí, naproti tomu RTN obsahuje novějším jádro 2.6.22, které doporučuji odzkoušet.
Pokud budeš mít nějaké poznatky a chtěl by si se podělit, můžu ti zde poskytnout možnost.
Sice tato diskuze není k řešení „nového“FW, ale když už se to tu řeší:
láká mě vyzkoušet uvedený FW na mém WL500GP(teď tam mám FW od Olega 1.9.2.7-10) , ale předem se chci zeptat, když přehraju FW, budu muset zova vše instalovat(cron, nano, atd.) na připojený Flashdisk. Nebo mi to vše zůstane a bude to dále fungovat s novým FW?
Díky
@Formis
i přesto že některý sw se „využije“ i ze staré instalace, doporučuji klíčové služby jako cron nainstalovat znovu.
Stačí si zazálohovat nastavení, samotná instalace nezabere víc než 2hod.
Zdravím, zkoušel někdo zprovoznit měření teploty na verzi RTN (viz.výše) a pokud ano, s jakým výsledkem?
Já jsem tuto verzi RTN zkoušel, zdá se být v pohodě, ohodně rychlejší a svižnější s vylepšenými funkcemi(např. grafické statistiky).
Ale bohužel na tomto FW mi moc nechodí měření teploty – čidla to detekuje bez problémů, ale pak to někdy teplotu odečtě a někdy to hodí prázdný řádek, čili 0°C. Tak že si každý dokáže představit, jak grafy vypadají 🙂
Zkoušel jsem to i na verzi FW „D“ (mimochodem se chová naprosto stejně, jako FW 1.9.2.7-10, akorát je obohacena o některé funkce-např.grafické statistiky využití CPU, WLAN, LAN a WIFI-docela dobrá věc) a to chodí bez problémů.
Tak jsem se chtěl zeptat, jestli nemá někdo také nějaké zkušenosti s FW „RTN“.
Zdravím, chtěl jsem se jen prosím zeptat, v jakém stádiu je aplikace pro android? 😉
Díky