Perl script zur Erfassung des Gaszaehlerstandes, des aktuellen Verbrauchs sowie der Anzahl der Brennerstarts und Brennerbetriebsdauer. Die Verbrauch wird in eine Round-Robin-Datenbank abgelegt und es werden Graphiken zur Visualisierung erzeugt (z.B. fuer die iphone Visu).[highlight=Perl]
####Gaszaehler.pl##########2009-03-01########v1.0########MM
# Zum Abgleich zwischen MH und dem realen Gaszaehler
# muss einmalig der Gaszaehlerstand, der Impulszaehlerstand
# und die ImpulseProKubikmeter eingestellt werden.
# Zum Abgleich der Brennerstarts und Bretriebsdauer des
# Brenners noch zustzlich diese Werte zu Beginn der Zhlung.
# - Die Umrechnung von Kubikmeter in kWh hngt vom Brennwert
# des jeweiligen Erdgases ab (siehe Abrechnung).
# - Vergeht mehr als 90s zw. 2 Impulsen, wird dies
# als Brennerstart gewertet.
# - Die OUTPUT-Werte werden in einer RRD-Datenbank abgelegt.
# - Es werden Graphiken erzeugt die in einer Visu angezeigt
# werden knnen.
################################################## #########
# INPUT:
# $GasImpulsZaehler32bit [Zaehlimpulse]
# OUTPUT:
# $GasZaehlerstand_kWh [kWh]
# $GasZaehlerstand_m3 [m]
# $GasBrennerstarts [-]
# $GasBetriebsstunden [h]
# $GasBrennerstarts32bit Wert wird gespeichert
# $GasBetriebszeit32bit Wert wird gespeichert
################################################## #########
use Time::HiRes;
use RRDs;
# noloop=start
my $GasZaehlerOffset = 4422.06;
my $GasImpulsZaehlerOffset = 0;
my $ImpulseProKubikmeter = 100;
my $GasBrennerstartsOffset = 30000;
my $GasBetriebsstundenOffset = 4500;
my $kWhProKubikmeter = 10.820;
my $MaxTimeZaehlerImpuls = 90;
#
my $Gas_lasttimestamp = 0;
my $Gas_lastcounter = 0;
my $GasZaehlerstand_kWh = 0;
my $GasZaehlerstand_m3 = 0;
my $GasMomentanverbrauch = 0;
my $GasBrennerstarts = 0;
my $GasBetriebsstunden = 0;
#
$GasBrennerstarts32bit = new Generic_Item;
$GasBetriebszeit32bit = new Generic_Item;
#
my $Gas_DB = "$config_parms{rrd_dir}/Gas.rrd";
my $Gas_Graph_Day = "$config_parms{rrd_dir}/GasGraphDay.png";
my $Gas_Graph_FourWeeks = "$config_parms{rrd_dir}/GasGraphFourWeeks.png";
my $Gas_Graph_Year = "$config_parms{rrd_dir}/GasGraphYear.png";
# noloop=stop
if ($Startup || $Reload) {
$Gas_lasttimestamp = Time::HiRes::time;
if(! -f $Gas_DB) {
RRDs::create($Gas_DB,
"--start=920804400", # Unix timestamp, 2009-01-01
"--step=60", # Store value every minute
"DS:gasverbrauch:GAUGE:600:U:U",
"RRA:AVERAGE:0.5:1:1440", # 1 value per 60 s for the last day (60*24)
"RRA:AVERAGE:0.5:60:672", # 1 value per hour for the last 4 weeks (1*24*7*4)
"RRA:AVERAGE:0.5:1440:365", # 1 value per day for the last year (1*365)
) or die "GAS DB create error: ($RRDs::error)";
}
# uncomment for just one start to reset or offset the internal misterhouse counter
# $GasBrennerstarts32bit=0;
# $GasBetriebszeit32bit=0;
$GasBrennerstarts = (state $GasBrennerstarts32bit) + $GasBrennerstartsOffset;
$GasBetriebsstunden = $GasBetriebsstundenOffset + ((state $GasBetriebszeit32bit)/3600);
print_log "########## GasBrennerstarts32bit >" . sprintf("%i Starts",(state $GasBrennerstarts32bit)) . "<";
print_log "########## GasBetriebszeit32bit >" . sprintf("%.2f s",(state $GasBetriebszeit32bit)) . "<";
print_log "########## Gas >" . sprintf("%i Starts",$GasBrennerstarts) ."< >" . sprintf("%.1f h",$GasBetriebsstunden) . "<";
}
if (state_changed $GasImpulsZaehler32bit) {
my $dt = Time::HiRes::time - $Gas_lasttimestamp;
$Gas_lasttimestamp = Time::HiRes::time;
$GasZaehlerstand_m3 = $GasZaehlerOffset + (((state $GasImpulsZaehler32bit) + $GasImpulsZaehlerOffset) / $ImpulseProKubikmeter);
$GasZaehlerstand_kWh = $GasZaehlerstand_m3 * $kWhProKubikmeter;
if ($dt > $MaxTimeZaehlerImpuls) {
set_now $GasBrennerstarts32bit ((state $GasBrennerstarts32bit) + 1);
$GasBrennerstarts = (state $GasBrennerstarts32bit) + $GasBrennerstartsOffset;
} else {
set_now $GasBetriebszeit32bit ((state $GasBetriebszeit32bit) + $dt);
$GasBetriebsstunden = $GasBetriebsstundenOffset + ((state $GasBetriebszeit32bit)/3600);
}
if ($Gas_lastcounter > 0 ) {
$GasMomentanverbrauch = (state $GasImpulsZaehler32bit - $Gas_lastcounter) * 3600 * $kWhProKubikmeter/($ImpulseProKubikmeter* $dt);
} else {
$GasMomentanverbrauch = 0;
}
$Gas_lastcounter = state $GasImpulsZaehler32bit;
RRDs::update($Gas_DB,
Time::HiRes::time.":".$GasMomentanverbrauch,
) or die "GAS DB update error: ($RRDs::error)";
print_log "########## Gas >" . sprintf("momentan: %.2f kW",$GasMomentanverbrauch) ."< >" . sprintf("%.2f cbm",$GasZaehlerstand_m3) . "<";
print_log "########## Gas >" . sprintf("%i Starts",$GasBrennerstarts) ."< >" . sprintf("%.1f h",$GasBetriebsstunden) . "<";
}
if (new_minute 5){ # every 5 minutes
RRDs::graph ($Gas_Graph_Day,
# "--title=Tages Gasverbrauch",
"--vertical-label=Gasverbrauch kW",
"--start=-84600",
"--height=125",
"--width=200",
"--upper-limit=25",
"--lower-limit=0",
"DEF:mygas=$Gas_DB:gasverbrauch:AVERAGE",
"LINE:mygas#FF0000",
) or die "GAS DB graph error: ($RRDs::error)";
}
if ($New_Day){
RRDs::graph($Gas_Graph_FourWeeks,
"--title=Monats Gasverbrauch",
"--vertical-label=Gasverbrauch kWh",
"--start=-2368800",
"--height=125",
"--width=200",
"DEF:mygas=$Gas_DB:gasverbrauch:AVERAGE",
"LINE:mygas#FF0000",
) or die "GAS DB graph error: ($RRDs::error)";
RRDs::graph($Gas_Graph_Year,
"--title=Jahres Gasverbrauch",
"--vertical-label=Gasverbrauch kWh",
"--start=-30879000",
"--height=125",
"--width=200",
"DEF:mygas=$Gas_DB:gasverbrauch:AVERAGE",
"LINE:mygas#FF0000",
) or die "GAS DB graph error: ($RRDs::error)";
}
if ($New_Month){ #Store file under new name
run "cp $Gas_Graph_FourWeeks $config_parms{rrd_dir}/GasGraph_$Year-$Month.png";
}
if ($New_Year){ #Store file under new name
run "cp $Gas_Graph_Year $config_parms{rrd_dir}/GasGraph_$Year.png";
}
[/highlight]
####Gaszaehler.pl##########2009-03-01########v1.0########MM
# Zum Abgleich zwischen MH und dem realen Gaszaehler
# muss einmalig der Gaszaehlerstand, der Impulszaehlerstand
# und die ImpulseProKubikmeter eingestellt werden.
# Zum Abgleich der Brennerstarts und Bretriebsdauer des
# Brenners noch zustzlich diese Werte zu Beginn der Zhlung.
# - Die Umrechnung von Kubikmeter in kWh hngt vom Brennwert
# des jeweiligen Erdgases ab (siehe Abrechnung).
# - Vergeht mehr als 90s zw. 2 Impulsen, wird dies
# als Brennerstart gewertet.
# - Die OUTPUT-Werte werden in einer RRD-Datenbank abgelegt.
# - Es werden Graphiken erzeugt die in einer Visu angezeigt
# werden knnen.
################################################## #########
# INPUT:
# $GasImpulsZaehler32bit [Zaehlimpulse]
# OUTPUT:
# $GasZaehlerstand_kWh [kWh]
# $GasZaehlerstand_m3 [m]
# $GasBrennerstarts [-]
# $GasBetriebsstunden [h]
# $GasBrennerstarts32bit Wert wird gespeichert
# $GasBetriebszeit32bit Wert wird gespeichert
################################################## #########
use Time::HiRes;
use RRDs;
# noloop=start
my $GasZaehlerOffset = 4422.06;
my $GasImpulsZaehlerOffset = 0;
my $ImpulseProKubikmeter = 100;
my $GasBrennerstartsOffset = 30000;
my $GasBetriebsstundenOffset = 4500;
my $kWhProKubikmeter = 10.820;
my $MaxTimeZaehlerImpuls = 90;
#
my $Gas_lasttimestamp = 0;
my $Gas_lastcounter = 0;
my $GasZaehlerstand_kWh = 0;
my $GasZaehlerstand_m3 = 0;
my $GasMomentanverbrauch = 0;
my $GasBrennerstarts = 0;
my $GasBetriebsstunden = 0;
#
$GasBrennerstarts32bit = new Generic_Item;
$GasBetriebszeit32bit = new Generic_Item;
#
my $Gas_DB = "$config_parms{rrd_dir}/Gas.rrd";
my $Gas_Graph_Day = "$config_parms{rrd_dir}/GasGraphDay.png";
my $Gas_Graph_FourWeeks = "$config_parms{rrd_dir}/GasGraphFourWeeks.png";
my $Gas_Graph_Year = "$config_parms{rrd_dir}/GasGraphYear.png";
# noloop=stop
if ($Startup || $Reload) {
$Gas_lasttimestamp = Time::HiRes::time;
if(! -f $Gas_DB) {
RRDs::create($Gas_DB,
"--start=920804400", # Unix timestamp, 2009-01-01
"--step=60", # Store value every minute
"DS:gasverbrauch:GAUGE:600:U:U",
"RRA:AVERAGE:0.5:1:1440", # 1 value per 60 s for the last day (60*24)
"RRA:AVERAGE:0.5:60:672", # 1 value per hour for the last 4 weeks (1*24*7*4)
"RRA:AVERAGE:0.5:1440:365", # 1 value per day for the last year (1*365)
) or die "GAS DB create error: ($RRDs::error)";
}
# uncomment for just one start to reset or offset the internal misterhouse counter
# $GasBrennerstarts32bit=0;
# $GasBetriebszeit32bit=0;
$GasBrennerstarts = (state $GasBrennerstarts32bit) + $GasBrennerstartsOffset;
$GasBetriebsstunden = $GasBetriebsstundenOffset + ((state $GasBetriebszeit32bit)/3600);
print_log "########## GasBrennerstarts32bit >" . sprintf("%i Starts",(state $GasBrennerstarts32bit)) . "<";
print_log "########## GasBetriebszeit32bit >" . sprintf("%.2f s",(state $GasBetriebszeit32bit)) . "<";
print_log "########## Gas >" . sprintf("%i Starts",$GasBrennerstarts) ."< >" . sprintf("%.1f h",$GasBetriebsstunden) . "<";
}
if (state_changed $GasImpulsZaehler32bit) {
my $dt = Time::HiRes::time - $Gas_lasttimestamp;
$Gas_lasttimestamp = Time::HiRes::time;
$GasZaehlerstand_m3 = $GasZaehlerOffset + (((state $GasImpulsZaehler32bit) + $GasImpulsZaehlerOffset) / $ImpulseProKubikmeter);
$GasZaehlerstand_kWh = $GasZaehlerstand_m3 * $kWhProKubikmeter;
if ($dt > $MaxTimeZaehlerImpuls) {
set_now $GasBrennerstarts32bit ((state $GasBrennerstarts32bit) + 1);
$GasBrennerstarts = (state $GasBrennerstarts32bit) + $GasBrennerstartsOffset;
} else {
set_now $GasBetriebszeit32bit ((state $GasBetriebszeit32bit) + $dt);
$GasBetriebsstunden = $GasBetriebsstundenOffset + ((state $GasBetriebszeit32bit)/3600);
}
if ($Gas_lastcounter > 0 ) {
$GasMomentanverbrauch = (state $GasImpulsZaehler32bit - $Gas_lastcounter) * 3600 * $kWhProKubikmeter/($ImpulseProKubikmeter* $dt);
} else {
$GasMomentanverbrauch = 0;
}
$Gas_lastcounter = state $GasImpulsZaehler32bit;
RRDs::update($Gas_DB,
Time::HiRes::time.":".$GasMomentanverbrauch,
) or die "GAS DB update error: ($RRDs::error)";
print_log "########## Gas >" . sprintf("momentan: %.2f kW",$GasMomentanverbrauch) ."< >" . sprintf("%.2f cbm",$GasZaehlerstand_m3) . "<";
print_log "########## Gas >" . sprintf("%i Starts",$GasBrennerstarts) ."< >" . sprintf("%.1f h",$GasBetriebsstunden) . "<";
}
if (new_minute 5){ # every 5 minutes
RRDs::graph ($Gas_Graph_Day,
# "--title=Tages Gasverbrauch",
"--vertical-label=Gasverbrauch kW",
"--start=-84600",
"--height=125",
"--width=200",
"--upper-limit=25",
"--lower-limit=0",
"DEF:mygas=$Gas_DB:gasverbrauch:AVERAGE",
"LINE:mygas#FF0000",
) or die "GAS DB graph error: ($RRDs::error)";
}
if ($New_Day){
RRDs::graph($Gas_Graph_FourWeeks,
"--title=Monats Gasverbrauch",
"--vertical-label=Gasverbrauch kWh",
"--start=-2368800",
"--height=125",
"--width=200",
"DEF:mygas=$Gas_DB:gasverbrauch:AVERAGE",
"LINE:mygas#FF0000",
) or die "GAS DB graph error: ($RRDs::error)";
RRDs::graph($Gas_Graph_Year,
"--title=Jahres Gasverbrauch",
"--vertical-label=Gasverbrauch kWh",
"--start=-30879000",
"--height=125",
"--width=200",
"DEF:mygas=$Gas_DB:gasverbrauch:AVERAGE",
"LINE:mygas#FF0000",
) or die "GAS DB graph error: ($RRDs::error)";
}
if ($New_Month){ #Store file under new name
run "cp $Gas_Graph_FourWeeks $config_parms{rrd_dir}/GasGraph_$Year-$Month.png";
}
if ($New_Year){ #Store file under new name
run "cp $Gas_Graph_Year $config_parms{rrd_dir}/GasGraph_$Year.png";
}
[/highlight]
Kommentar