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.
Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
Användarvisningsbild
elf98
Hemautomation - det är mer än en hobby
Inlägg: 5419
Blev medlem: 27 okt 2006, 13:49
Ort: Linköping
Kontakt:

Exempel grafgenerering

Inlägg 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!
Grundade m.nu & temperatur.nu

Driver temperatur.nu

Bild
Användarvisningsbild
elf98
Hemautomation - det är mer än en hobby
Inlägg: 5419
Blev medlem: 27 okt 2006, 13:49
Ort: Linköping
Kontakt:

Re: Exempel grafgenerering

Inlägg 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.
Grundade m.nu & temperatur.nu

Driver temperatur.nu

Bild
Användarvisningsbild
elf98
Hemautomation - det är mer än en hobby
Inlägg: 5419
Blev medlem: 27 okt 2006, 13:49
Ort: Linköping
Kontakt:

Re: Exempel grafgenerering

Inlägg 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.
Grundade m.nu & temperatur.nu

Driver temperatur.nu

Bild
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Exempel grafgenerering

Inlägg 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.
CDK2H
Gillar hemautomation
Inlägg: 44
Blev medlem: 21 nov 2013, 13:55
Ort: Gökalund

Re: Exempel grafgenerering

Inlägg av CDK2H »

Mer sånt här folk! Grymt med exempel man kan kopiera och mixtra med.
eriel72
Wannabe
Inlägg: 10
Blev medlem: 24 feb 2013, 17:49
Ort: LÅNGSHYTTAN

Re: Exempel grafgenerering

Inlägg 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"
Bilagor
Ett dygn loggat med min RPI och 1wire
Ett dygn loggat med min RPI och 1wire
Användarvisningsbild
CirruZZ
Master Moderator
Inlägg: 1621
Blev medlem: 13 feb 2008, 16:46
Ort: Ystad

Re: Exempel grafgenerering

Inlägg av CirruZZ »

Lägg till \l för linefeed, \t för tabbar
eriel72
Wannabe
Inlägg: 10
Blev medlem: 24 feb 2013, 17:49
Ort: LÅNGSHYTTAN

Re: Exempel grafgenerering

Inlägg 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
eriel72
Wannabe
Inlägg: 10
Blev medlem: 24 feb 2013, 17:49
Ort: LÅNGSHYTTAN

Re: Exempel grafgenerering

Inlägg 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"

Bilagor
temp2014-01-03.png
Skriv svar