X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/upsgraph/blobdiff_plain/d036d16a336b8b31db2c7b09ea40012164d96a83..HEAD:/upsgraph.pl diff --git a/upsgraph.pl b/upsgraph.pl index cade9b2..f9d0fe3 100755 --- a/upsgraph.pl +++ b/upsgraph.pl @@ -15,6 +15,8 @@ use IO::Select; use RRDs; use File::Copy; use Data::Dumper; +use LWP::UserAgent; +use JSON; $UPSGRAPH::outdir = ""; $UPSGRAPH::daysCovered = 370; @@ -90,6 +92,7 @@ sub rrdcreate(@) { push @cmd, "RRA:AVERAGE:0.5:1:${keep}"; push @cmd, "RRA:MIN:0.4:${stepsPerHour}:${keepHours}"; push @cmd, "RRA:MAX:0.4:${stepsPerHour}:${keepHours}"; + push @cmd, "RRA:AVERAGE:0.5:${stepsPerHour}:${keepHours}"; RRDs::create(@cmd); if (RRDs::error) { @@ -185,6 +188,39 @@ sub fetch_tcp_multi(@) { %values; } +sub fetch_iotcore(@) { + my $host = shift; + my $adr = shift; + my $mask = shift; + + my $ua = LWP::UserAgent->new; + $ua->timeout(1); + + my $iotcore_req = { + cid => 1, + code => 10, + adr => $adr, + }; + + my $req = HTTP::Request->new(POST => "http://${host}"); + $req->content_type('application/json'); + $req->content(encode_json($iotcore_req)); + + my $resp = $ua->request($req); + return undef if (!$resp->is_success); + + my $pdin = decode_json($resp->decoded_content); + return undef if (!defined($pdin)); + + my $value = hex($pdin->{'data'}->{'value'}); + + if (defined($mask)) { + $value = $value & $mask; + } + + $value; +} + sub dayGraphFunc { my $dataSrc = shift; my $mode = shift; @@ -200,9 +236,16 @@ sub dayGraphFunc { } my $dayCons = ''; my $consFunc = ''; - for (my $i = 1; $i < $dataPoints; ++$i) { - $dayCons .= "prev${mode}${i},"; - $consFunc .= ",${mode}"; + if ($mode ne 'AVG') { + for (my $i = 1; $i < $dataPoints; ++$i) { + $dayCons .= "prev${mode}${i},"; + $consFunc .= ",${mode}"; + } + } else { + for (my $i = 1; $i < $dataPoints; ++$i) { + $dayCons .= "prev${mode}${i},"; + } + $consFunc = ",${dataPoints},${mode}"; } push @args, "CDEF:day${mode}=${dayCons}${dataSrc}${consFunc}"; push @args, "CDEF:fillCalDay${mode}0=COUNT,${dataPoints},%,0,EQ,day${mode},UNKN,IF"; @@ -236,6 +279,8 @@ sub cfgToGraphDef { push @graphDef, @{dayGraphFunc("${varname}-min", 'MIN', '0000ff', 'Day Minimum Temperature', $dpPerDay)}; } elsif ($subGraph eq 'day-max') { push @graphDef, @{dayGraphFunc("${varname}-max", 'MAX', '00ff00', 'Day Maximum Temperature', $dpPerDay)}; + } elsif ($subGraph eq 'day-avg') { + push @graphDef, @{dayGraphFunc("${varname}-houravg", 'AVG', 'ff0000', 'Day Average Temperature', $dpPerDay)}; } } return \@graphDef; @@ -361,7 +406,7 @@ foreach my $host (@$hosts) { } if ($rrdinfo->{'rra[0].rows'} != $keep || - !defined($rrdinfo->{'rra[1].rows'}) || $rrdinfo->{'rra[1].rows'} != $keepHours || + !defined($rrdinfo->{'rra[3].rows'}) || $rrdinfo->{'rra[3].rows'} != $keepHours || $limitsChanged == 1) { print "Resizing ${rrdfile}.${field} from " . $rrdinfo->{'rra[0].rows'} . @@ -467,6 +512,8 @@ while(1) { @multi_values{keys %values} = values %values; $result = $multi_values{$vars->{$var}->{'multi_id'}}; } + } elsif ($vars->{$var}->{'proto'} eq 'iotcore') { + $result = fetch_iotcore($host->{'address'}, $vars->{$var}->{'adr'}, $vars->{$var}->{'mask'}); } next unless (defined $result); @@ -505,12 +552,13 @@ while(1) { }; } - my @graphdef = ('-P', "-t", $hostname." - ".$vars->{$var}->{'name'}); + my @graphdef = ('-P', "-A", "-t", $hostname." - ".$vars->{$var}->{'name'}); push @graphdef, "--lazy" if !$first; push @graphdef, "DEF:${var}-avg=${rrdfile}.${var}:${var}:AVERAGE"; push @graphdef, "DEF:${var}-min=${rrdfile}.${var}:${var}:MIN"; push @graphdef, "DEF:${var}-max=${rrdfile}.${var}:${var}:MAX"; + push @graphdef, "DEF:${var}-houravg=${rrdfile}.${var}:${var}:AVERAGE:step=3600"; push @graphdef, "LINE1:${var}-avg#FF0000"; push @graphdef, "VDEF:cur=${var}-avg,LAST"; push @graphdef, 'GPRINT:cur:Current\\: %.2lf\\r';