Sida 1 av 2

"OneLiner" för att hämta info från rrd-fil?

Postat: 18 feb 2009, 22:16
av CirruZZ
Finns det någon bra sätta att med en "oneliner" få ut senaste tempen från en given rrd fil? Det jag vill ha det till är ett Perl script för LCD.
Så här långt har jag kommit...

Kod: Markera allt

anders@DomoticsSrv:~/rrddata$ rrdtool fetch outside_temp.rrd AVERAGE -s -10min | grep ":"
1234987350: -5,7373119344e+00
1234987500: -5,6800000000e+00
1234987650: -5,7209532937e+00
1234987800: -5,7500000000e+00
1234987950: nan
Med det här alternativet så kan det variera hur många rader med nan det står vilket försvårar det för mig.

Alternativt

Kod: Markera allt

anders@DomoticsSrv:~/rrddata$ rrdtool lastupdate outside_temp.rrd |  grep ":" | nawk '{print substr($0,13)}'
-5.75
Här får jag det jag är ute efter men det kanske inte är det snyggaste sättet.

Den senare levererar precis det jag är ute efter, just senaste värdet. Vad jag också skulle vilja få ut är max/min i ett givet tidsintervall. Något förslag?!

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 18 feb 2009, 22:39
av elf98

Kod: Markera allt

rrdtool graph /dev/null --start=end-36000 DEF:a=/special/termo/rrdb/temperatur_linkoping.rrd:ute:AVERAGE PRINT:a:MIN:"Min %3.2lf%s" PRINT:a:MAX:"Max %3.2lf%s" PRINT:a:AVERAGE:"Avg %3.2lf%s"

Kod: Markera allt

0x0
Min -6.44
Max -4.88
Avg -5.57

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 18 feb 2009, 22:50
av CirruZZ
Jag har suttit i över 3 timmar utan att lösa det och för dig tar det 23 min (för att vara exakt)... :oops:

you are THE king of rrdtool! Tackar SÅ mycket! :D

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 18 feb 2009, 23:06
av elf98
Hehe, jag har suttit en del med rrdtool, just det där hade jag dock inte gjort förut. Jag har någon Min/Max-script där jag loopar genom filerna. Kanske dax att byta ut det scriptet... :)

Överkurs är att printa klockslaget när min och max inträffar:

Kod: Markera allt

rrdtool graph /dev/null --start=end-36000 DEF:a=/special/termo/rrdb/temperatur_linkoping.rrd:ute:AVERAGE VDEF:mintime=a,MINIMUM VDEF:maxtime=a,MAXIMUM PRINT:a:MIN:"Min\: %3.2lf%s" PRINT:mintime:"Mintid\: %H\:%M":strftime PRINT:a:MAX:"Max %3.2lf%s" PRINT:maxtime:"Maxtime\: %H\:%M":strftime PRINT:a:AVERAGE:"Avg %3.2lf%s"

Kod: Markera allt

0x0
Min: -6.44
Mintid: 21:26
Max -4.88
Maxtime: 14:36
Avg -5.60

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 18 feb 2009, 23:17
av CirruZZ
Kan tänka mig det!!!!

"Slurp..!" det där åket också med, klockrent att ha den informationen också...Tackar!

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 12 mar 2009, 21:33
av HUSKii
elf98 skrev:Hehe, jag har suttit en del med rrdtool, just det där hade jag dock inte gjort förut. Jag har någon Min/Max-script där jag loopar genom filerna. Kanske dax att byta ut det scriptet... :)

Överkurs är att printa klockslaget när min och max inträffar:

Kod: Markera allt

rrdtool graph /dev/null --start=end-36000 DEF:a=/special/termo/rrdb/temperatur_linkoping.rrd:ute:AVERAGE VDEF:mintime=a,MINIMUM VDEF:maxtime=a,MAXIMUM PRINT:a:MIN:"Min\: %3.2lf%s" PRINT:mintime:"Mintid\: %H\:%M":strftime PRINT:a:MAX:"Max %3.2lf%s" PRINT:maxtime:"Maxtime\: %H\:%M":strftime PRINT:a:AVERAGE:"Avg %3.2lf%s"

Kod: Markera allt

0x0
Min: -6.44
Mintid: 21:26
Max -4.88
Maxtime: 14:36
Avg -5.60
Vad behöver man ändra för att få med detta i en RRDTool-graf som genereras mha ett perl script?

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 18 mar 2009, 11:10
av CirruZZ
Jag är inte helt säker men jag tror du skall ändra PRINT till GPRINT, kolla här för mer info.

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 01 aug 2009, 02:31
av HUSKii
Svarar på ett av mina äldre inlägg:
HUSKii skrev:Vad behöver man ändra för att få med detta i en RRDTool-graf som genereras mha ett perl script?
Temperatur graf som visar tiden då min och maxvärde inträffar.
Temperatur graf som visar tiden då min och maxvärde inträffar.
graph_temp.png (31.45 KiB) Visad 14982 gånger
koden för att skapa denn bild.

Kod: Markera allt

#!/usr/bin/perl

use HTTP::Date;
my ($date, $time) = split(" ", HTTP::Date::time2iso());
my ($hour, $min) = split(":", $time);

use RRDs;

my $cur_time = time();
my $start_time = $cur_time - 86400;     # set end time to 24 hours ago

RRDs::graph "/var/www/graph_temp.png",
         "-X0",
         "--start= $start_time",
         "--end= $cur_time",
         "--title= Temp ute",
         "--height= 150",
         "--width= 500",
         "--alt-autoscale",
         "--vertical-label= C",
         "--slope-mode",
         "--watermark= HUSKiiBOY | Graf genererad\: $date kl\: $hour\:$min",
         "DEF:OutsideTemp=/home/log-computer/rrddata/temperature-10.3AD85F010800.rrd:value:AVERAGE",
         "VDEF:mintime=OutsideTemp,MINIMUM",
         "VDEF:maxtime=OutsideTemp,MAXIMUM",
         "HRULE:0#0000FF",
         "LINE2:OutsideTemp#0000FF:Ute\\n",
         "COMMENT:Now\\:",
         "GPRINT:OutsideTemp:LAST:%6.2lf\\n",
         "COMMENT:Avg\\:",
         "GPRINT:OutsideTemp:AVERAGE:%6.2lf\\n",
         "COMMENT:Min\\:",
         "GPRINT:OutsideTemp:MIN:%3.2lf%s",
         "GPRINT:mintime:%Y-%m-%d %H\\:%M:strftime",
         "COMMENT:\\n",
         "COMMENT:Max\\:",
         "GPRINT:OutsideTemp:MAX:%3.2lf%s",
         "GPRINT:maxtime:%Y-%m-%d %H\\:%M:strftime";

my $err=RRDs::error;
if ($err) {print "problem generating the graph: $err\n";}

print "Done!\n";
Kanske inte den snyggast lösningen med radbytena, men lyckas inte få till det med radbyte i 'GPRINT' raden.

Förhoppningsvis gör det någon glad. :D

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 11 feb 2010, 12:55
av MartinF
Hej,
har försökt översätta Eriks förträffliga kod till Perl, men det funkar inte, inga felmeddelanden & tomt på skärmen.

Kod: Markera allt

#!/usr/bin/perl;
use RRDs;
 
RRDs::graph ("/dev/null", "--start=end-1d", "DEF:a=\/home/martin/rrddata/DarUt.rrd:Exhaust:AVERAGE", "PRINT:a:MAX:\"Max %3.2lf\%s");
if ($ERROR = RRDs::error) { print "$0: Error: $_[0] $_[1] graph: $ERROR\n"; }
printf "Done\n";
Någon idé om vad jag missat?

-----EDIT -----
Har funnit en i mitt tycke ganska snygg lösning:

Kod: Markera allt

sub retrieve { # (rra, dataset, start, end)
	my ($rra, $ds, $start, $end) =@_;
	($averages,,) = RRDs::graph ("/dev/null", "--start=$start", "--end=$end", "DEF:a=$rra:$ds:AVERAGE", "PRINT:a:MAX:%3.2lf\%s", "PRINT:a:MIN:%3.2lf\%s", "PRINT:a:AVERAGE:%3.2lf\%s", "PRINT:a:LAST:%3.2lf\%s");
	if ($ERROR = RRDs::error) { print $0 . ": Error: " . $_[0] . " " . $_[1] . "graph: $ERROR\n"}
	return @$averages # (MAX, MIN, AVERAGE, LAST)
}

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 01 aug 2016, 19:13
av P-G
då har jag en fråga som denna tråd börjar med

Få resultatet till LCD.

Hur gör man för att tilldela t.ex. max temp till en variabel för att visa på en LCD

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 02 aug 2016, 20:50
av daromer
Vad för script kör du med för att presentera på displayen? Bash, php, python, perl eller något annat? Skiljer mellan de olika.

Men om man nu har bash och ska plocka en av de raderna kan man t ex:

rrdtool graph /dev/null --start=end-36000 DEF:a=/special/termo/rrdb/temperatur_linkoping.rrd:ute:AVERAGE VDEF:mintime=a,MINIMUM VDEF:maxtime=a,MAXIMUM PRINT:a:MIN:"Min\: %3.2lf%s" PRINT:mintime:"Mintid\: %H\:%M":strftime PRINT:a:MAX:"Max %3.2lf%s" PRINT:maxtime:"Maxtime\: %H\:%M":strftime PRINT:a:AVERAGE:"Avg %3.2lf%s" | grep "Avg" | awk '{print $1}'


dock ej testat

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 02 aug 2016, 21:44
av P-G
Det ser ut så här:

#!/bin/bash

rrdtool graph /dev/null --start=end-36000 DEF:a=/home/pi/rrddata/outside_temp.rrd:outsidetemp:AVERAGE \
VDEF:mintime=a,MINIMUM VDEF:maxtime=a,MAXIMUM \±
PRINT:a:MIN:"Min\: %3.2lf%s" \
PRINT:mintime:"Mintid\: %H\:%M":strftime \
PRINT:a:MAX:"Max %3.2lf%s" \
PRINT:maxtime:"Maxtime\: %H\:%M":strftime \
PRINT:a:AVERAGE:"Avg %3.2lf%s" | grep "Avg" | awk '{print $1}'

# Här skall värdena matas ut till LCD
printf "Temp Min : $min" > /mnt/1wire/FF.C10400000100/line20.1
printf "Temp Max : $max" > /mnt/1wire/FF.C10400000100/line20.2
printf "Temp Mu : $mu" > /mnt/1wire/FF.C10400000100/line20.3

Resultatet av ditt kommand blir om man tar bort : grep "Avg" | awk '{print $1}'

0x0
Min: 33.01
Mintid: 14:17
Max 36.23
Maxtime: 2055
Avg 34.34

Så långt har jag också kommit

Lägger man till på slutet som du gjort i ditt förslag : | grep "Avg" | awk '{print $1}'

Så blir resultatet endast : Avg

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 03 aug 2016, 10:31
av motoz
Prova med $2 istället för $1

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 03 aug 2016, 10:56
av daromer
Givetvis $2

Sitter man i andra språk som börjar på 0 istället för 1 så blir det lätt förvirrat ibland :)

Re: "OneLiner" för att hämta info från rrd-fil?

Postat: 03 aug 2016, 18:00
av P-G
Det fungerar med $2 får ut temeperaturen.

Men nu är det till LCD, hur skall jag få LCD:en att skriva ut temperaturen

Hur får jag värdet till en variabel $avg

# Här skall värdena matas ut till LCD
printf "Avg : $avg" > /mnt/1wire/FF.C10400000100/line20.1