Domů > Asus WL-500gP > úprava vykreslování grafu pomocí RRDtool

ú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: původní verze Dostal až k tomuto: upravená verze

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ářů.

Categories: Asus WL-500gP Tags: , , ,
  1. Formis
    16.04.2012 na 10:25 | #1

    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

  2. admin
    16.04.2012 na 16:42 | #2

    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.

  3. Formis
    20.04.2012 na 14:56 | #3

    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.

  4. admin
    22.04.2012 na 13:35 | #4

    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.

  5. Tom
    20.06.2012 na 15:39 | #5

    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 ?

  6. Formis
    21.06.2012 na 21:31 | #6

    Očko stále funguje, pouze ale na adrese wl500.cz 🙂

  7. admin
    21.06.2012 na 23:05 | #7

    @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.

  8. Formis
    24.06.2012 na 13:52 | #8

    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

  9. admin
    17.07.2012 na 17:25 | #9

    @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.

  10. Formis
    21.10.2012 na 19:20 | #10

    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“.

  11. Formis
    06.03.2013 na 20:21 | #11

    Zdravím, chtěl jsem se jen prosím zeptat, v jakém stádiu je aplikace pro android? 😉
    Díky

  1. Žádné zpětné odkazy

 

%d bloggers like this: