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

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
CirruZZ
Master Moderator
Inlägg: 1621
Blev medlem: 13 feb 2008, 16:46
Ort: Ystad

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

Inlägg 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?!
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: "OneLiner" för att hämta info från rrd-fil?

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

Driver temperatur.nu

Bild
Användarvisningsbild
CirruZZ
Master Moderator
Inlägg: 1621
Blev medlem: 13 feb 2008, 16:46
Ort: Ystad

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

Inlägg 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
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: "OneLiner" för att hämta info från rrd-fil?

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

Driver temperatur.nu

Bild
Användarvisningsbild
CirruZZ
Master Moderator
Inlägg: 1621
Blev medlem: 13 feb 2008, 16:46
Ort: Ystad

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

Inlägg av CirruZZ »

Kan tänka mig det!!!!

"Slurp..!" det där åket också med, klockrent att ha den informationen också...Tackar!
Användarvisningsbild
HUSKii
Tar hemautomation på allvar
Inlägg: 270
Blev medlem: 16 jun 2008, 20:08
Ort: Oskarström

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

Inlägg 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?
Användarvisningsbild
CirruZZ
Master Moderator
Inlägg: 1621
Blev medlem: 13 feb 2008, 16:46
Ort: Ystad

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

Inlägg av CirruZZ »

Jag är inte helt säker men jag tror du skall ändra PRINT till GPRINT, kolla här för mer info.
Användarvisningsbild
HUSKii
Tar hemautomation på allvar
Inlägg: 270
Blev medlem: 16 jun 2008, 20:08
Ort: Oskarström

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

Inlägg 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 10204 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
MartinF
Tar hemautomation på allvar
Inlägg: 141
Blev medlem: 04 jan 2010, 12:24
Ort: Sunne

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

Inlägg 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)
}
Albin polar 35,Laddomat, 3x750l, Danfoss ECL 100 & Sfinxs solfångare. Loggar och styr vedpanna, elpatron, solfångare, motorvärme och mycket annat med 1-wire, zwave, och webswitch via Domoticz.
P-G
Gillar hemautomation
Inlägg: 27
Blev medlem: 14 jun 2009, 11:32
Ort: Vellinge/Eskilstorp

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

Inlägg 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
Temp
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

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

Inlägg 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
P-G
Gillar hemautomation
Inlägg: 27
Blev medlem: 14 jun 2009, 11:32
Ort: Vellinge/Eskilstorp

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

Inlägg 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
Temp
Användarvisningsbild
motoz
Tar hemautomation på allvar
Inlägg: 100
Blev medlem: 02 feb 2015, 15:05
Ort: ostrobothnia

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

Inlägg av motoz »

Prova med $2 istället för $1
Open source pellet logger: https://github.com/motoz/PellMon
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

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

Inlägg 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 :)
P-G
Gillar hemautomation
Inlägg: 27
Blev medlem: 14 jun 2009, 11:32
Ort: Vellinge/Eskilstorp

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

Inlägg 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
Temp
Skriv svar