Sida 1 av 1

Exempel grafgenerering

Postat: 30 sep 2010, 15:16
av elf98
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!

Re: Exempel grafgenerering

Postat: 30 sep 2010, 15:34
av elf98
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.

Re: Exempel grafgenerering

Postat: 30 sep 2010, 15:44
av elf98
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.

Re: Exempel grafgenerering

Postat: 30 sep 2010, 19:16
av daromer
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.

Re: Exempel grafgenerering

Postat: 25 nov 2013, 10:24
av CDK2H
Mer sånt här folk! Grymt med exempel man kan kopiera och mixtra med.

Re: Exempel grafgenerering

Postat: 02 jan 2014, 12:44
av eriel72
Hej alla och god fortsättning

Har en fråga om grafgenerering. Har gjort några grafer i RRD, men hur staplar jag "förklaringen"

Så här ser min program ut

Kod: Markera allt

#!/usr/bin/perl

use RRDs;

my $cur_time = time() ;
my $start_time = $cur_time - 86400 ;

RRDs::graph"/var/www/html/temp.png",
                "--start= $start_time",
                "--end= $cur_time",
                "--title= Heating system 24h",
                "--height= 600",
                "--width= 1000",
                "--vertical-label= °C",
                "--lower-limit= 10",
                "--legend-direction=topdown",
"DEF:rum=/home/nordviken/rrddata/v_rum.rrd:v_rum:AVERAGE",
"DEF:framledning=/home/nordviken/rrddata/fram.rrd:fram:AVERAGE",
"DEF:returledning=/home/nordviken/rrddata/retur.rrd:retur:AVERAGE",
"DEF:toppen=/home/nordviken/rrddata/toppen.rrd:toppen:AVERAGE",
"DEF:bott=/home/nordviken/rrddata/botten.rrd:botten:AVERAGE",
                "COMMENT:\t\t\t\t     Nu   Medel   Max   Min\\n",
                "HRULE:20.5#0000dd",
                "LINE2:framledning#ff0000:fram",
                "LINE2:returledning#0000ff:Retur",
                "LINE2:rum#ff00ff:Rum",
                "LINE1:toppen#000000:tank_top",
                "LINE1:bott#0099ff:tank_botten",
                "GPRINT:rum:LAST:%6.1lf",
                "GPRINT:rum:AVERAGE:%6.1lf",
                "GPRINT:rum:MAX:%6.1lf",
                "GPRINT:rum:MIN:%6.1lf\\n";

my $err=RRDs::error;
if ($err) {print "problem med att skapa grafen: $err\n";}

print "done!\n"

Re: Exempel grafgenerering

Postat: 02 jan 2014, 13:23
av CirruZZ
Lägg till \l för linefeed, \t för tabbar

Re: Exempel grafgenerering

Postat: 02 jan 2014, 19:30
av eriel72
CirruZZ skrev:Lägg till \l för linefeed, \t för tabbar
Tack för hjälpen

Men det var \\n för radbyte då jag kör med pearl, men det löste sig och efter lite pusslande med "tabbar" och mellanslag så är jag super nöjd med resultatet :D

Re: Exempel grafgenerering

Postat: 03 jan 2014, 19:47
av eriel72
Så är ser nya coden ut

Kod: Markera allt

#!/usr/bin/perl

use RRDs;

my $cur_time = time() ;
my $start_time = $cur_time - 86400 ; #ett dygn

RRDs::graph"/var/www/html/temp.png",
                "--start= $start_time",
                "--end= $cur_time",
                "--title= Heating system 24h",
                "--height= 600 ",
                "--width= 1000",
                "--vertical-label= °C",
                "--lower-limit= 10",
                "--upper-limit= 80",
                "--rigid",
                "DEF:rum=/home/nordviken/rrddata/v_rum.rrd:v_rum:AVERAGE",
                "DEF:framledning=/home/nordviken/rrddata/fram.rrd:fram:AVERAGE",
                "DEF:returledning=/home/nordviken/rrddata/retur.rrd:retur:AVERAGE",
                "DEF:toppen=/home/nordviken/rrddata/toppen.rrd:toppen:AVERAGE",
                "DEF:bott=/home/nordviken/rrddata/botten.rrd:botten:AVERAGE",
                "COMMENT:\t\t\t    Nu              Medel            Max             Min\\n",
                "HRULE:20.5#00ff00",
                "LINE1:toppen#000000:tank_top",
                        "GPRINT:toppen:LAST:\t %6.1lf",
                        "GPRINT:toppen:AVERAGE:\t%6.1lf",
                        "GPRINT:toppen:MAX:\t%6.1lf",
                        "GPRINT:toppen:MIN:\t%6.1lf\\n",
                "LINE1:bott#0099ff:tank_bott",
                        "GPRINT:bott:LAST:\t%6.1lf",
                        "GPRINT:bott:AVERAGE:\t%6.1lf",
                        "GPRINT:bott:MAX:\t%6.1lf",
                        "GPRINT:bott:MIN:\t%6.1lf\\n",
                "LINE1:framledning#ff0000:fram",
                        "GPRINT:framledning:LAST:\t     %6.1lf",
                        "GPRINT:framledning:AVERAGE:\t%6.1lf",
                        "GPRINT:framledning:MAX:\t%6.1lf",
                        "GPRINT:framledning:MIN:\t%6.1lf\\n",
               "LINE1:returledning#0000ff:Retur",
                        "GPRINT:returledning:LAST:\t    %6.1lf",
                        "GPRINT:returledning:AVERAGE:\t%6.1lf",
                        "GPRINT:returledning:MAX:\t%6.1lf",
                        "GPRINT:returledning:MIN:\t%6.1lf\\n",
                "LINE1:rum#ff00ff:Rum",
                        "GPRINT:rum:LAST:\t      %6.1lf",
                        "GPRINT:rum:AVERAGE:\t%6.1lf",
                        "GPRINT:rum:MAX:\t%6.1lf",
                        "GPRINT:rum:MIN:\t%6.1lf\\n";


my $err=RRDs::error;
if ($err) {print "problem med att skapa grafen: $err\n";}

print "done!\n"