"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.

Moderator: elf98

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: 1619
Blev medlem: 13 feb 2008, 16:46
Ort: Ystad
Kontakt:

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

Inlägg av CirruZZ » 18 feb 2009, 22:16

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?!
Projekt tråd | Blogg | Hemautomation
Rapporterar för : Ystad & Duved

Användarvisningsbild
elf98
Hemautomation - det är mer än en hobby
Inlägg: 5183
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 » 18 feb 2009, 22:39

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
Driver m.nu och temperatur.nu

Bild Bild

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

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

Inlägg av CirruZZ » 18 feb 2009, 22:50

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
Projekt tråd | Blogg | Hemautomation
Rapporterar för : Ystad & Duved

Användarvisningsbild
elf98
Hemautomation - det är mer än en hobby
Inlägg: 5183
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 » 18 feb 2009, 23:06

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
Driver m.nu och temperatur.nu

Bild Bild

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

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

Inlägg av CirruZZ » 18 feb 2009, 23:17

Kan tänka mig det!!!!

"Slurp..!" det där åket också med, klockrent att ha den informationen också...Tackar!
Projekt tråd | Blogg | Hemautomation
Rapporterar för : Ystad & Duved

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 » 12 mar 2009, 21:33

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: 1619
Blev medlem: 13 feb 2008, 16:46
Ort: Ystad
Kontakt:

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

Inlägg av CirruZZ » 18 mar 2009, 11:10

Jag är inte helt säker men jag tror du skall ändra PRINT till GPRINT, kolla här för mer info.
Projekt tråd | Blogg | Hemautomation
Rapporterar för : Ystad & Duved

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 » 01 aug 2009, 02:31

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?
graph_temp.png
Temperatur graf som visar tiden då min och maxvärde inträffar.
graph_temp.png (31.45 KiB) Visad 4145 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

Användarvisningsbild
MartinF
Tar hemautomation på allvar
Inlägg: 140
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 » 11 feb 2010, 12:55

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 » 01 aug 2016, 19:13

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 » 02 aug 2016, 20:50

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 » 02 aug 2016, 21:44

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 » 03 aug 2016, 10:31

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 » 03 aug 2016, 10:56

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 » 03 aug 2016, 18:00

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