Exempel grafgenerering

RRDTool är en Linuxmjukvara som kan användas för att lagra data i Round-Robin Databaser för att sedan generera grafer utifrån den lagrade datan.

Exempel grafgenerering

Inläggav elf98 » 30 sep 2010, 15:16

RRDTool kan vara lite krångligt. För att underlätta och ge inspiration har denna tråd skapats.

Reglerna för tråden är enkla:
I varje inlägg skall finnas:
  • En graf
  • Källkod för skapande av databasen som krävs för grafen.
  • Källkod för att skapa grafen.
  • En kort beskrivning av vad grafen innehåller.

Inga diskussioner är tillåtna i den här tråden, skapa en ny tråd i stället. Detta för att hålla tråden ren och lättöverskådlig.

Försök gärna att få personer med spännande grafer att dokumentera dem här!
Driver temperatur.nu
Användarvisningsbild
elf98
Har temperatur.nu som hobby
 
Inlägg: 3430
Blev medlem: 27 okt 2006, 13:49
Ort: Linköping

Annons


Re: Exempel grafgenerering

Inläggav elf98 » 30 sep 2010, 15:34

Exempel på graf för presentation av ljusnivå:
Bild

Källkod för databaserna:
Kod: Markera allt
rrdtool create ad01.rrd --step 60 DS:ad03:GAUGE:1200:U:U RRA:AVERAGE:0.5:1:2880 RRA:AVERAGE:0.5:3:14400 RRA:AVERAGE:0.5:15:35040 RRA:AVERAGE:0.5:60:175200
rrdtool create ad02.rrd --step 60 DS:ad03:GAUGE:1200:U:U RRA:AVERAGE:0.5:1:2880 RRA:AVERAGE:0.5:3:14400 RRA:AVERAGE:0.5:15:35040 RRA:AVERAGE:0.5:60:175200
rrdtool create ad03.rrd --step 60 DS:ad03:GAUGE:1200:U:U RRA:AVERAGE:0.5:1:2880 RRA:AVERAGE:0.5:3:14400 RRA:AVERAGE:0.5:15:35040 RRA:AVERAGE:0.5:60:175200


Källkod för grafen:
Kod: Markera allt
#!/bin/sh
start="-24h"
end="now"
width="500"
height="250"

rrdtool graph /home/httpd/termo/tmp/ljus.png \
                --start $start --end $end --title 'Light level' --width $width --height $height \
                DEF:ad01=/special/sol/ad01.rrd:ad01:AVERAGE:start=end-2h$start \
                DEF:ad02=/special/sol/ad02.rrd:ad02:AVERAGE:start=end-2h$start \
                DEF:ad03=/special/sol/ad03.rrd:ad03:AVERAGE:start=end-2h$start \
                CDEF:adsum=ad01,ad03,+\
                CDEF:dark1=adsum,0.5,LT,10,* \
                CDEF:dark2=adsum,1.2,LT,10,* \
                CDEF:dark3=adsum,1.9,LT,10,* \
                CDEF:dark4=adsum,2.6,LT,10,* \
                CDEF:dark5=adsum,3.3,LT,10,* \
                CDEF:dark6=adsum,4.0,LT,10,* \
                CDEF:dark7=adsum,4.7,LT,10,* \
                CDEF:dark8=adsum,5.4,LT,10,* \
                CDEF:dark9=adsum,6.1,LT,10,* \
                CDEF:dark10=adsum,6.8,LT,10,* \
                AREA:dark1#00000010 \
                AREA:dark2#00000010 \
                AREA:dark3#00000010 \
                AREA:dark4#00000010 \
                AREA:dark5#00000010 \
                AREA:dark6#00000010 \
                AREA:dark7#00000010 \
                AREA:dark8#00000010 \
                 AREA:dark9#00000010 \
                                 AREA:dark10#00000010 \
                LINE1.5:ad01#20c1a0:'TSL252R Light\\n' \
                LINE1.5:ad03#232300:'TSL250R Light\\n' \
                LINE1.5:adsum#881111:'TSL252R+TSL250R\\n' \
                LINE1.5:ad02#aa0000:'VDD\\n' \
                GPRINT:ad01:LAST:'Light\\t%6.2lf volt (TSL252R)\\n' \
                GPRINT:ad03:LAST:'Light\\t%6.2lf volt (TSL250R)\\n' \
                GPRINT:ad02:LAST:'Vcc\\t%6.2lf volt (ad02)\\n' \
                --upper-limit 8 --lower-limit 0 --rigid \


Kommentarer:
CDEF:dark1=adsum,0.5,LT,10,* \
...
CDEF:dark1=adsum,6.8,LT,10,* \
Kontrollerar om adsum (som är summan av de två ljussensorerna) överstiger värdena 0.5 till 6.8. Om värdet är över över 6.8 är dark1 till dark9 10. när dark1-9 sedan grafas används samma intensitet för dark1-9, men då de läggs på varandra blir det mörkare ju fler av dark1-9 som är sanna.
Driver temperatur.nu
Användarvisningsbild
elf98
Har temperatur.nu som hobby
 
Inlägg: 3430
Blev medlem: 27 okt 2006, 13:49
Ort: Linköping

Re: Exempel grafgenerering

Inläggav elf98 » 30 sep 2010, 15:44

Exempel på graf som tar hänsyn till flera olika faktorer och färgar delar av grafen annorlunda beroende på dessa indata.
Bild

Källkod databas:
Kod: Markera allt
#!/usr/bin/perl -w

use RRDp;
#
RRDp::start "/usr/bin/rrdtool";

#Create the database
#
RRDp::cmd "create temp_fukt.rrd -s 300 -b 906110720\
                DS:temp_inne:GAUGE:1800:U:U \
                DS:temp_ute:GAUGE:1800:U:U \
                DS:rh_inne:GAUGE:1800:U:U \
                DS:rh_ute:GAUGE:1800:U:U \
                DS:fukt_inne:GAUGE:1800:U:U \
                DS:fukt_ute:GAUGE:1800:U:U \
                DS:flakt:GAUGE:600:U:U \
                DS:heat:GAUGE:600:U:U \
                RRA:MAX:0.5:1:10800 \
                RRA:MAX:0.5:30:43800";

$answer = RRDp::read;
#print $$answer;


Källkod graf:
Kod: Markera allt
<?php
$vad="AVERAGE";
$cmd= "/usr/bin/rrdtool";
$rrd = "/mnt/usb/fuktctrl/temp_fukt.rrd";
$starttime = $argv[1];
$endtime = now;
$width = "500";
$height = "250";
$cmd .=" graph /tmp/fuktreducering_ah$starttime.png --imgformat PNG --start '$starttime' --end '$endtime' --width $width --height $height --title '$argv[2]' --vertical-
$cmd .=" DEF:anghalt_ute=$rrd:fukt_ute:MAX";
$cmd .=" DEF:anghalt_inne=$rrd:fukt_inne:MAX";
$cmd .=" DEF:rh_inne=$rrd:rh_inne:MAX";
$cmd .=" DEF:flakt=$rrd:flakt:MAX";
$cmd .=" DEF:heat=$rrd:heat:MAX";
$cmd .=" CDEF:ahg_inne=anghalt_inne,1000,*";
$cmd .=" CDEF:ahg_ute=anghalt_ute,1000,*";
$cmd .=" CDEF:flakt2=flakt,ahg_ute,0,IF";
$cmd .=" CDEF:heat2=heat,ahg_ute,0,IF";
$cmd .=" CDEF:overlap=ahg_ute,ahg_inne,LT,ahg_ute,ahg_inne,IF";
$cmd .=" CDEF:overlap_flakt=flakt2,ahg_inne,LT,flakt2,ahg_inne,IF";
$cmd .=" CDEF:overlap_heat=heat2,ahg_inne,LT,heat2,ahg_inne,IF";

$cmd .=" AREA:ahg_inne#eeeeee";
$cmd .=" LINE1:ahg_inne#aaaaaa:'.nghalt inne g/m3'";
$cmd .=" AREA:ahg_ute#ccffcc";
$cmd .=" AREA:overlap#bbeebb";
$cmd .=" LINE1:overlap#99aa99";
$cmd .=" LINE1:ahg_ute#009900:'.nghalt ute g/m3'";
$cmd .=" AREA:heat2#ffcccc";
$cmd .=" LINE1:heat2#ff5555:Element";
$cmd .=" AREA:flakt2#ccccff";
$cmd .=" LINE1:flakt2#5555ff:Ventilation";
$cmd .=" AREA:overlap_heat#ee9999";
$cmd .=" LINE1:overlap_heat#aa5555";
$cmd .=" AREA:overlap_flakt#9999ee";
$cmd .=" LINE1:overlap_flakt#5555aa";

passthru("$cmd");

Det trixiga med den här grafen är att sätta alla LINE och AREA i rätt ordning så att allt hamnar i rätt ordning.
Driver temperatur.nu
Användarvisningsbild
elf98
Har temperatur.nu som hobby
 
Inlägg: 3430
Blev medlem: 27 okt 2006, 13:49
Ort: Linköping

Re: Exempel grafgenerering

Inläggav daromer » 30 sep 2010, 19:16

Lägger jag in en av mina då. Den är definitivt inte snygg men funkar.

Den visar dels energin i mina tankar mätt i kwh instoppad i rrdn. Sedan har jag även stoppat in diffen mellan de olika tiderna i rrdn. (Just den delen går att göra som en cdef men så långt kom jag inte)
ackar_energi_24h.png


Kod: Markera allt
#!/bin/bash
# Script to create rrd-file

# 24h with 2,5 min resolution
# 7d with 5 min resolution
# 1y with 10 min resolution
# 20y with 1h resolution

name="acktank"

directory="/root/1wire/rrd/"
filename="${name}_energi.rrd"

# Check i file already exists
if [ ! -f "$directory$filename" ]
then
   # File doesn't exist, create new rrd-file
   echo "Creating RRDtool DB for $name temp sensor"
   rrdtool create $directory$filename \
       --step 300 \
       --start 1041290400 \
       DS:${name}:GAUGE:300:-50:300 \
       RRA:AVERAGE:0.5:1:5760 \
       RRA:AVERAGE:0.5:2:2016 \
       RRA:AVERAGE:0.5:4:52560 \
       RRA:AVERAGE:0.5:24:175200 \
       RRA:MAX:0.5:1:5760 \
       RRA:MAX:0.5:2:2016 \
       RRA:MAX:0.5:4:52560 \
       RRA:MAX:0.5:24:175200 \
       RRA:MIN:0.5:1:5760 \
       RRA:MIN:0.5:2:2016 \
       RRA:MIN:0.5:4:52560 \
       RRA:MIN:0.5:24:175200 \
           DS:diff:GAUGE:300:-50:300 \
       RRA:AVERAGE:0.5:1:5760 \
       RRA:AVERAGE:0.5:2:2016 \
       RRA:AVERAGE:0.5:4:52560 \
       RRA:AVERAGE:0.5:24:175200 \
       RRA:MAX:0.5:1:5760 \
       RRA:MAX:0.5:2:2016 \
       RRA:MAX:0.5:4:52560 \
       RRA:MAX:0.5:24:175200 \
       RRA:MIN:0.5:1:5760 \
       RRA:MIN:0.5:2:2016 \
       RRA:MIN:0.5:4:52560 \
       RRA:MIN:0.5:24:175200

echo "Done!"
else
   echo $directory$filename" already exists, delete it first."
fi


Sedan för att skapa själva grafen:

Kod: Markera allt
        TIDEN="
        20M
        1h
        3h
        24h
        1w
        1m
        1y
        "

for TID in $TIDEN
do

        $RRDTOOL graph ${PNG}ackar_energi_${TID}.png -a PNG --title="Energi i acktankar i Esperyd -$TID-" \
        --vertical-label "KwH" \
        --start -$TID -w 900 -h 550\
        -c "BACK#D8D8D8" -c "CANVAS#F2F2F2"\
        "--watermark= Esperyd 2009 | Genererad $DATE"\
         DEF:ack_energi=${RRDPATH}acktank_energi.rrd:acktank:AVERAGE\
         DEF:ack=${RRDPATH}acktank_energi.rrd:diff:AVERAGE\
         DEF:skillnad=${RRDPATH}acktank_energi.rrd:diff:AVERAGE:end=now-5min:start=end-1min\
         CDEF:real=ack,-1,*,20,*\
         CDEF:realneg=real,-1,*\
         CDEF:n=real,DUP,0,LT,*\
         CDEF:nn=n,-5,LT,-5,n,IF\
         CDEF:n2=real,DUP,-5,LT,*\
         CDEF:nk2=real,nn,-\
         CDEF:nn2=n2,-10,GT,nk2,-5,IF\
         CDEF:nnn2=nn2,0,GT,0,nn2,IF\
         CDEF:n3=real,DUP,-10,LT,*\
         CDEF:nk3=real,10,+\
         CDEF:nn3=n3,10,+,0,LT,nk3,0,IF\
         CDEF:p=real,DUP,0,GT,*\
         CDEF:pp=p,15,LT,p,15,IF\
         CDEF:p2=real,DUP,16,GT,*\
         CDEF:pk2=real,pp,-\
         CDEF:pp2=p2,25,LT,pk2,9,IF\
         CDEF:p3=real,DUP,26,GT,*\
         CDEF:pk3=real,24,-\
         CDEF:pp3=p3,25,-,0,GT,pk3,0,IF\
         'COMMENT:\t\t\t\tNu         Medel        Max       Min\\n'\
         HRULE:0#0000FF\
         AREA:pp#C3F9D3:\
         STACK:pp2#6EDC8F:\
         STACK:pp3#4BCB71:\
         AREA:nn#FF9C9C:\
         STACK:nnn2#FF6B6B:\
         STACK:nn3#FF0000:\
         LINE2:ack_energi#000000:"Lagrad energi"\\t\
         GPRINT:ack_energi:LAST:%6.1lfkWh\
         GPRINT:ack_energi:AVERAGE:%6.1lfkWh\
         GPRINT:ack_energi:MAX:%6.1lfkWh\
         GPRINT:ack_energi:MIN:%6.1lfkWh\\n\
         LINE1:real#000000:"Diff      "\\t\\t\
         GPRINT:real:LAST:%6.1lfkWh\
         GPRINT:real:AVERAGE:%6.1lfkWh\
         GPRINT:real:MAX:%6.1lfkWh\
         GPRINT:real:MIN:%6.1lfkWh\\n&

done





Har copy pastat lite så det är inte säkert allt funkar out of the box så att säga.
daromer
Har temperatur.nu som hobby
 
Inlägg: 742
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö


Återgå till RRDTool

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 2 gäster