ú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ářů.
Poslední komentáře