Ist es möglich mit einem erweiterten update_rrd () ein Counter RRD zu erstellen?
Was kann man alles mit update_rrd an das rrdtool durchreichen ?
Grüße
Was kann man alles mit update_rrd an das rrdtool durchreichen ?
Grüße
# RRD ggf. anlegen
if (!-e $rrdFile)
{
RRDs::create($rrdFile,
'--step' => 900, # 15 Minuten
'DS:value:COUNTER:2700:0:2147483647',
# 15 min (für 7,5 d) 1 h (für 35 d) 24 h (für 5 y) 7 d (für 25 y)
'RRA:AVERAGE:0.5:1:720', 'RRA:AVERAGE:0.5:4:840', 'RRA:AVERAGE:0.5:96:1826', 'RRA:AVERAGE:0.5:672:1300',
'RRA:MIN:0.5:1:720', 'RRA:MIN:0.5:4:840', 'RRA:MIN:0.5:96:1826', 'RRA:MIN:0.5:672:1300',
'RRA:MAX:0.5:1:720', 'RRA:MAX:0.5:4:840', 'RRA:MAX:0.5:96:1826', 'RRA:MAX:0.5:672:1300'
);
if (RRDs::error) {
plugin_log($plugname, "Create COUNTER-RRDs failed for $rrdFile: ".RRDs::error);
} else {
plugin_log($plugname, "Created COUNTER-RRD for $rrdFile");
}
}
# RRD Update
update_rrd($rrd, "", $msg{value} * 900, "COUNTER");
# RRD ggf. anlegen
if (!-e $rrdFile)
{
RRDs::create($rrdFile,
'--step' => 86400, # 24 h
'DS:value:COUNTER:90000:0:2147483647',
# 1 d (für 5 y) 7 d (für 25 y)
'RRA:AVERAGE:0.5:1:1826', 'RRA:AVERAGE:0.5:7:1300',
'RRA:MIN:0.5:1:1826', 'RRA:MIN:0.5:7:1300',
'RRA:MAX:0.5:1:1826', 'RRA:MAX:0.5:7:1300',
);
if (RRDs::error) {
plugin_log($plugname, "Create COUNTER-RRDs failed for $rrdFile: ".RRDs::error);
} else {
plugin_log($plugname, "Created COUNTER-RRD for $rrdFile");
}
}
# RRD Update
update_rrd($rrd, "", $msg{value} * 86400, "COUNTER");
my $rrdpath = "/var/www/rrd"; ... rrd_counter ("WP_Energieertrag",$val); sub rrd_counter { my $rrdname = $_[0]; my $value = $_[1]; $rrdname = $rrdname."\.rrd"; my $rrdfile = $rrdpath."\/".$rrdname; unless (-e $rrdfile) { RRDs::create ($rrdfile,"DS:value:COUNTER:".((1440*60)+600).":0:10000000000","RRA:AVERAGE:0.5:1:365","RRA:AVERAGE:0.5:7:300","-s ".(1440*60)); } my $countervalue = int($value*1440*60); RRDs::update("$rrdfile", "N:$countervalue"); }
sub update_rrd { my ($key,$suffix,$value,$valtype,$stephours) = @_; return unless defined $value; $valtype = "GAUGE" unless $valtype; if (!-d $rrd_dir) { mkdir($rrd_dir); } if (!-e $rrd_dir . $key . $suffix .'.rrd') { # Checkvalue-type for boundries? # Create RRD if ($valtype eq "GAUGE"){ my $heartbeat = $wg_config{''}{'rrd_interval'} * 3; $wg_config{$key}{'rra_1_interval_rows'} = $wg_config{''}{'rra_1_interval_rows'} unless $wg_config{$key}{'rra_1_interval_rows'}; $wg_config{$key}{'rra_5_interval_rows'} = $wg_config{''}{'rra_5_interval_rows'} unless $wg_config{$key}{'rra_5_interval_rows'}; $wg_config{$key}{'rra_15_interval_rows'} = $wg_config{''}{'rra_15_interval_rows'} unless $wg_config{$key}{'rra_15_interval_rows'}; $wg_config{$key}{'rra_180_interval_rows'} = $wg_config{''}{'rra_180_interval_rows'} unless $wg_config{$key}{'rra_180_interval_rows'}; RRDs::create($rrd_dir.$key.$suffix .'.rrd', '--step' => $wg_config{''}{'rrd_interval'}, 'DS:value:'.$valtype.':'.$heartbeat.':-55:255000', 'RRA:AVERAGE:0.5:1:'.$wg_config{$key}{'rra_1_interval_rows'},'RRA:AVERAGE:0.5:5:'.$wg_config{$key}{'rra_5_interval_rows'},'RRA:AVERAGE:0.5:15:'.$wg_config{$key}{'rra_15_interval_rows'},'RRA:AVERAGE:0.5:180:'.$wg_config{$key}{'rra_180_interval_rows'}, 'RRA:MIN:0.5:1:'.$wg_config{$key}{'rra_1_interval_rows'},'RRA:MIN:0.5:5:'.$wg_config{$key}{'rra_5_interval_rows'},'RRA:MIN:0.5:15:'.$wg_config{$key}{'rra_15_interval_rows'},'RRA:MIN:0.5:180:'.$wg_config{$key}{'rra_180_interval_rows'}, 'RRA:MAX:0.5:1:'.$wg_config{$key}{'rra_1_interval_rows'},'RRA:MAX:0.5:5:'.$wg_config{$key}{'rra_5_interval_rows'},'RRA:MAX:0.5:15:'.$wg_config{$key}{'rra_15_interval_rows'},'RRA:MAX:0.5:180:'.$wg_config{$key}{'rra_180_interval_rows'}); if (RRDs::error) { LOGGER('INFO',"Create RRDs failed for $key$suffix :".RRDs::error); } else { LOGGER('INFO',"Created RRD for $key$suffix"); } } if ($valtype eq "COUNTER"){ RRDs::create ($rrd_dir.$key.$suffix .'.rrd', 'DS:value:'.$valtype.':'.(($stephours*3600)+600).':0:10000000000', 'RRA:AVERAGE:0.5:1:1826', 'RRA:AVERAGE:0.5:7:1300', 'RRA:MIN:0.5:1:1826', 'RRA:MIN:0.5:7:1300', 'RRA:MAX:0.5:1:1826', 'RRA:MAX:0.5:7:1300', '-s '.($stephours*3600)); if (RRDs::error) { LOGGER('INFO',"Create RRDs failed for $key$suffix :".RRDs::error); } else { LOGGER('INFO',"Created RRD for $key$suffix"); } } } # Update values if ($valtype eq "COUNTER"){ $value = int($stephours*3600*$value); RRDs::update($rrd_dir.$key.$suffix.'.rrd','N:'.$value); } else { RRDs::update($rrd_dir.$key.$suffix.'.rrd','N:'.$value); } if (RRDs::error) { LOGGER('INFO',"Update of RRDs failed for $key$suffix/$value:".RRDs::error); # FIXME: Check if error comes from update-value or from rrd-file! #rename ($rrd_dir.$key.$suffix.'.rrd',$rrd_dir.$key.$suffix.'.rrd.old'); } else { LOGGER('DEBUG',"Updated RRD for $key$suffix/$value"); } }
sub update_rrd {
my ($key,$suffix,$value,$valtype,$stephours,$rrasteps) = @_;
return unless defined $value;
$valtype = "GAUGE" unless $valtype;
$stephours = 24 unless $stephours;
if (!-d $rrd_dir) { mkdir($rrd_dir); }
if (!-e $rrd_dir . $key . $suffix .'.rrd') {
# Checkvalue-type for boundries?
# Create RRD
if ($valtype eq "GAUGE"){
my $heartbeat = $wg_config{''}{'rrd_interval'} * 3;
$wg_config{$key}{'rra_1_interval_rows'} = $wg_config{''}{'rra_1_interval_rows'} unless $wg_config{$key}{'rra_1_interval_rows'};
$wg_config{$key}{'rra_5_interval_rows'} = $wg_config{''}{'rra_5_interval_rows'} unless $wg_config{$key}{'rra_5_interval_rows'};
$wg_config{$key}{'rra_15_interval_rows'} = $wg_config{''}{'rra_15_interval_rows'} unless $wg_config{$key}{'rra_15_interval_rows'};
$wg_config{$key}{'rra_180_interval_rows'} = $wg_config{''}{'rra_180_interval_rows'} unless $wg_config{$key}{'rra_180_interval_rows'};
RRDs::create($rrd_dir.$key.$suffix .'.rrd',
'--step' => $wg_config{''}{'rrd_interval'},
'DS:value:'.$valtype.':'.$heartbeat.':-55:255000',
'RRA:AVERAGE:0.5:1:'.$wg_config{$key}{'rra_1_interval_rows'},'RRA:AVERAGE:0.5:5:'.$wg_config{$key}{'rra_5_interval_rows'},'RRA:AVERAGE:0.5:15:'.$wg_config{$key}{'rra_15_interval_rows'},'RRA:AVERAGE:0.5:180:'.$wg_config{$key}{'rra_180_interval_rows'},
'RRA:MIN:0.5:1:'.$wg_config{$key}{'rra_1_interval_rows'},'RRA:MIN:0.5:5:'.$wg_config{$key}{'rra_5_interval_rows'},'RRA:MIN:0.5:15:'.$wg_config{$key}{'rra_15_interval_rows'},'RRA:MIN:0.5:180:'.$wg_config{$key}{'rra_180_interval_rows'},
'RRA:MAX:0.5:1:'.$wg_config{$key}{'rra_1_interval_rows'},'RRA:MAX:0.5:5:'.$wg_config{$key}{'rra_5_interval_rows'},'RRA:MAX:0.5:15:'.$wg_config{$key}{'rra_15_interval_rows'},'RRA:MAX:0.5:180:'.$wg_config{$key}{'rra_180_interval_rows'});
if (RRDs::error) {
LOGGER('INFO',"Create RRDs failed for $key$suffix :".RRDs::error);
} else {
LOGGER('INFO',"Created RRD for $key$suffix");
}
}
elsif ($valtype eq "COUNTER"){
$rrasteps = 7 unless $rrasteps;
RRDs::create ($rrd_dir.$key.$suffix .'.rrd',
'DS:value:'.$valtype.':'.(($stephours*3600)+600).':0:10000000000',
'RRA:AVERAGE:0.5:1:1826', 'RRA:AVERAGE:0.5:'.$rrasteps.':1300',
'RRA:MIN:0.5:1:1826', 'RRA:MIN:0.5:'.$rrasteps.':1300',
'RRA:MAX:0.5:1:1826', 'RRA:MAX:0.5:'.$rrasteps.':1300',
'-s '.($stephours*3600));
if (RRDs::error) {
LOGGER('INFO',"Create RRDs failed for $key$suffix :".RRDs::error);
} else {
LOGGER('INFO',"Created RRD for $key$suffix");
}
}
}
# Update values
$value = int($stephours*3600*$value) if ($valtype eq "COUNTER");
RRDs::update($rrd_dir.$key.$suffix.'.rrd','N:'.$value);
if (RRDs::error) {
LOGGER('INFO',"Update of RRDs failed for $key$suffix/$value:".RRDs::error);
# FIXME: Check if error comes from update-value or from rrd-file!
#rename ($rrd_dir.$key.$suffix.'.rrd',$rrd_dir.$key.$suffix.'.rrd.old');
} else {
LOGGER('DEBUG',"Updated RRD for $key$suffix/$value");
}
}
http://wiregatexxx/graph.pl?--start=-48h;--end=now;-X=0;-W=WireGate;--slope-mode;-h=400;-w=650;--full-size-mode;--vertical-label=Liter;--title=Gasverbrauch;-c=BACK%23000000;-c=CANVAS%23000000;-c=SHADEA%23000000;-c=SHADEB%23000000;-c=GRID%23960000;-c=MGRID%236B4F42;-c=FONT%23FFFFFF;-c=AXIS%23000000;-c=FRAME%23000000;-c=ARROW%23000080;DEF:ds0=Gaszaehler.rrd:value:AVERAGE;LINE1:ds0%23FF0000:Gaszaehler.rrd;
#return 0; my $rrdFile="/var/www/rrd/Gaszaehler.rrd"; my $rrd="Gaszaehler"; my $Gaszaehler_ga="15/2/50"; my $Gasvolumen_ga="15/2/52"; $plugin_info{$plugname . '_cycle'} = 0; # Aufrufzyklus - never if ($msg{'apci'} eq "A_GroupValue_Write") { # Telegramm eingetroffen if ($msg{'dst'} eq $Gaszaehler_ga) { update_rrd($rrd, "", knx_read($Gaszaehler_ga,0,13) * 900, "COUNTER"); knx_write($Gasvolumen_ga,knx_read($Gaszaehler_ga,0,13)/100,14); plugin_log($plugname,"Zählerstand: ".knx_read($Gaszaehler_ga,0,13)); } } else { # zyklischer Aufruf/initialisierung #subscribe GAs $plugin_subscribe{$Gaszaehler_ga}{$plugname} = 1; # RRD ggf. anlegen if (!-e $rrdFile) { RRDs::create($rrdFile, '--step' => 900, # 15 Minuten 'DS:value:COUNTER:2700:0:2147483647', # 15 min (für 7,5 d) 1 h (für 35 d) 24 h (für 5 y) 7 d (für 25 y) 'RRA:AVERAGE:0.5:1:720', 'RRA:AVERAGE:0.5:4:840', 'RRA:AVERAGE:0.5:96:1826', 'RRA:AVERAGE:0.5:672:1300', 'RRA:MIN:0.5:1:720', 'RRA:MIN:0.5:4:840', 'RRA:MIN:0.5:96:1826', 'RRA:MIN:0.5:672:1300', 'RRA:MAX:0.5:1:720', 'RRA:MAX:0.5:4:840', 'RRA:MAX:0.5:96:1826', 'RRA:MAX:0.5:672:1300' ); if (RRDs::error) { plugin_log($plugname, "Create COUNTER-RRDs failed for $rrdFile: ".RRDs::error); } else { plugin_log($plugname, "Created COUNTER-RRD for $rrdFile"); } } } return;
<diagram legend="popup" series="day" refresh="300" popup="true" previewlabels="false" legendposition="nw" period="2" datasource="AVERAGE"> <label>Gaszähler</label> <axis unit="Impulse">Load</axis> <rrd color="#FA5858" steps="true">Gaszaehler</rrd> </diagram>
<diagram legend="popup" series="month" refresh="300" popup="true" previewlabels="false" legendposition="nw" datasource="AVERAGE"> <label>Gaszähler</label> <axis unit="Impulse">Load</axis> <rrd color="#FA5858" steps="true">Gaszaehler</rrd> </diagram>
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar