Archív

Příspěvek oštítkován ‘rrd tool’

ú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: , , ,

Zprovoznění měření teploty

Další z možností, jak využít router s OS Linux je například ke sledování teploty. Výborně použitelná jsou digitálních čidla DS18B20 připojená přes rozhraní RS232 a pomocí redukce USB/RS232 připojená k routeru. Čidla DS18B20 jsou jednoznačně adresovatelná a lze jich tak použít velké množství.

K sestavení měřícího řetězce budete potřebovat:

  • redukce USB/RS232 (vzhledem k tomu, že na routeru běží jádro / kernel 2.4.20 je důležité dát pozor při výběru této redukce, obecně jsou doporučovány redukce s čipem Prolific PL2303)
  • čidla DS18B20 (digitální teploměr Dallas 9-12bit +/-0,5°C -55/+125°C TO92 (rozlišení 0,5; 0,25; 0,125; 0,0625°C)) – lze použít i identické DS1820/DS18S20/DS1920
  • 2x zenerova dioda 5V1 (BZX83V005.1 – DO35 0.5W ZPD 5.1V)
  • 2x schottky BAT46 (schottky dioda 100V/150mA/6pF DO-35)
  • 1x odpor 1k5 (Rezistor s kovovou vrstvou 0,6W 1% 50ppm, velikost 0207)
  • 1x Canon konektor 9 pinů samice
  • 1x pouzdro velikosti krabičky od zápalek

Pořizovací cena součástek je při koupi 2 čidel cca 200Kč. Počet čidel je libovolný, další čidla se zapojují paralelně k prvnímu. Každé čidlo má vlastní sériové číslo a je ovladačem přímo adresováno. Schéma zapojení je v příloze.

zapojení

zapojení

Nezapomeňte spojit konektory čidla GND a V. Ukázka konkrétního zapojení je v galerii teploměr.

Připojte kabel USB/RS232 do routeru a zavedeme ovladače např. v telnetu: insmod usbserial a insmod pl2303

Překontrolujete log routeru /usr/tmp/syslog.log  , zda se v něm objevili následující řádky:

kernel: usb.c: registered new driver serial
kernel: usbserial.c: USB Serial support registered for Generic
kernel: usbserial.c: USB Serial Driver core v1.4
kernel: usbserial.c: USB Serial support registered for PL-2303
kernel: usbserial.c: PL-2303 converter detected
kernel: usbserial.c: PL-2303 attached to ttyUSB0 (or usb/tts/0 for devfs)
kernel: pl2303.c: Prolific PL2303 USB to serial adaptor driver v0.11

tímto se ubezpečíte, že adaptér byl bezpečně rozeznán a bude spolupracovat. V opačném případě adaptér obsahuje nerozpoznaný čip a je nepoužitelný.

Pokud chcete inicializovat adaptér ihned po startu, zapište do opt/init.usb následující:

insmod usbserial
insmod pl2303

Nainstalujte software, který umí komunikovat s čidly: ipkg install digitemp

Po instalaci se rovnou dotážeme čidel: /opt/bin/digitemp_DS9097 -i -s /dev/usb/tts/0 -o "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F" -c /opt/etc/digitemp.conf

Pokud jsou čidla správně detekována, vygeneruje se konfigurační soubor s parametry měření a sériovými čísly čidel. Následné měření již může být podstatně rychlejší: /opt/bin/digitemp_DS9097 -aq -c /opt/etc/digitemp.conf

Program vrátí následující výsledek:
Aug 14 23:28:03 Sensor 0 C: 25.88 F: 78.57
Aug 14 23:28:04 Sensor 1 C: 18.44 F: 65.19
Aug 14 23:28:05 Sensor 2 C: 24.69 F: 76.44

Zabezpečte automatické měření pomocí CRONu, proto do souboru /opt/etc/crontab vložte řádek s úlohou, která každou minutu provede měření, výsledek uloží do souboru a ten přesune do jiného souboru. Přesouvá se z důvodu zpoždění zápisu hodnot do souboru a některé hodnoty mohou být nekompletní.

*/1 * * * * admin /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

Vytvořte potřebné adresáře:

mkdir /opt/etc/tempsensor && mkdir /opt/share/www/lighttpd/temperature && mkdir /opt/var/log/digitemp_rrd && chmod 777 /opt/var/log/digitemp_rrd

Následně upravte konfigurační soubor /opt/etc/tempsensor/config.php dle průvodce, ukázkový soubor naleznete v příloze

Do souboru /opt/etc/crontab přidejte řádky pro načítání dat do databáze a vykreslení grafu každých 5 minut:

*/5 * * * * admin php /opt/etc/tempsensor/logdata.php
*/5 * * * * admin php /opt/etc/tempsensor/graphdata.php

Pro otestování a odladění můžeme spustit načtení dat ručně: php /opt/etc/tempsensor/logdata.php

Překontrolujte vytvoření souborů v adresáři /opt/share/www/lighttpd/temperature/. Tímto je ověřena funkčnost měření a zápisu do databáze. Grafy, nebo jiné výstupy jsou již na dalším vlastním vývoji.

Je nutné mít nainstalované obslužné nástroje rrdtool (API pro generování grafů),bc (balíček pro přesné výpočty) a bash (shell): ipkg install rrdtool && ipkg install bc && ipkg install bash

Soubory digitemp – ukázka načtení parametrů senzorů a lite.php, který používám jako osekaný graphdata.php aby se ulevilo procesoru a kreslil jen krátkodobé grafy, měsíční a roční se kreslí jen jednou denně.

Pokud nefunguje připojení RS232-USB převodníku, zkuste přidat příkaz rmmod ehci-hcd

Optimalizace CRONu:
Vzhledem k tomu, že měření, zápis a vykreslení nám zbytečně zaplňuje syslog -který můžeme průběžně sledovat příkazem tail -f /tmp/syslog.log, je dobré optimalizovat nastavení CRONu a to tak, že stávající pravidla přesuneme do samostatného skriptu a jeho celé spouštění zabezpečíme jedním řádkem v cronu a následně i v logu.
*/5 * * * * admin /opt/etc/tempsensor/teplota
skript /opt/etc/tempsensor/teplota s parametry 0755 (spustitelný chmod +x 0755 /opt/etc/tempsensor/teplota) pak obsahuje přenesené řádky:
#!/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

Kopii obrázku provádím kvůli zajištění jeho neustálé dostupnosti.

Jsou sice součástí instalace a v adresáři /opt/etc/tempsensor, ale pro jistotu uvádím graphdata.php a logdata.php. A po úpravách jejich současné verze jako zálohu komplet adresáře /opt/etc/tempsensor/.