Ankündigung

Einklappen
Keine Ankündigung bisher.

Gaszaehler.pl

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Misterhouse] Gaszaehler.pl

    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]
    Angehängte Dateien
    Gruß,
    Marc

    #2
    Hoi Marc

    Kannst Du das Script noch anhängen, ohne die Zeilennummern?
    Das wär toll, danke
    Grüsse Bodo
    Fragen gehören ins Forum, und nicht in mein Postfach;
    EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

    Kommentar


      #3
      Bodo,

      man kann das Script doch einfach markierien und per Copy&Paste in ein Textfile packen.

      Bei mir werden die Zeilennummern nicht mitmarkiert.
      Gruß,
      Marc

      Kommentar


        #4
        Bei mir schon, bzw. gibt es jeweils eine Leerzeile...
        Grüsse Bodo
        Fragen gehören ins Forum, und nicht in mein Postfach;
        EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

        Kommentar


          #5
          Okay, habe es mal mit unterschiedlichen Browsern getestet --jeder macht es anders.

          Mit Safari funktioniert es (obwohl die Zeilennummern mit markiert werden, tauchen sie dann nach Copy&Paste nicht im ASCII-file auf). Mit Firefox werden die Zeilennummern mit übertragen. IE8 markiert nur den Code, ob der Zeilenumbruch dann korrekt ist hängt aber vom Editor ab.

          Ich hab' den Code dann mal als Text File mit Endung *.txt hinzugefügt -- die Endung .pl wird nicht akzeptiert.
          Gruß,
          Marc

          Kommentar


            #6
            @aggi89go
            ich versuche gerade das script einzubinden.
            Beim Start von misterhouse gibt es Fehlermeldungen... (siehe ende des Beitrages).
            Habe noch keine Erfahrung mit der Einbindung von rrds!
            In der mh.ini habe ich einen Pfad gesetzt für das ablegen von rrds:

            @ To allow for logging of data into a RRD (Round Robin) database,
            @ install the perl RRDs.pm module, and fill in the rrd_dir parm.
            @ RRD is available from: This Page Has Moved
            @ Useful for making nice graphs of any kind of data.

            rrd_dir=$Pgm_Root/data/rrd

            Ich habe SuSe 10.3 im Einsatz, cacti läuft und auch das paket rrdtools ist installiert...



            Code:
            06/06/2010 11:09:10: GAS DB create error: () at (eval 789) line 4988.
            Line 4983:  use Time::HiRes;
            Line 4984:  use RRDs;
            Line 4985:  if ($Startup || $Reload) {
            Line 4986:  $Gas_lasttimestamp = Time::HiRes::time;
            Line 4987:  if(! -f $Gas_DB) {
            Line 4988:  RRDs::create($Gas_DB,
            Line 4989:  "--start=920804400", # Unix timestamp, 2009-01-01
            Line 4990:  "--step=60", # Store value every minute
            Line 4991:  "DS:gasverbrauch:GAUGE:600:U:U",
            Line 4992:  "RRA:AVERAGE:0.5:1:1440", # 1 value per 60 s for the last day (60*24)
            Line 4993:  "RRA:AVERAGE:0.5:60:672", # 1 value per hour for the last 4 weeks (1*24*7*4)
            Display call with tk disabled (-tk 0).  Text=Error found in user code file: ./../data/mh_temp.user_code
            
            06/06/2010 11:09:10: GAS DB create error: () at (eval 789) line 4988.
            Line 4983:  use Time::HiRes;
            Line 4984:  use RRDs;
            Line 4985:  if ($Startup || $Reload) {
            Line 4986:  $Gas_lasttimestamp = Time::HiRes::time;
            Line 4987:  if(! -f $Gas_DB) {
            Line 4988:  RRDs::create($Gas_DB,
            Line 4989:  "--start=920804400", # Unix timestamp, 2009-01-01
            Line 4990:  "--step=60", # Store value every minute
            Line 4991:  "DS:gasverbrauch:GAUGE:600:U:U",
            Line 4992:  "RRA:AVERAGE:0.5:1:1440", # 1 value per 60 s for the last day (60*24)
            Line 4993:  "RRA:AVERAGE:0.5:60:672", # 1 value per hour for the last 4 weeks (1*24*7*4)
             0

            Kommentar


              #7
              hatte vergessen das rrd verzeichnis anzulegen!

              Jetzt muss ich nur noch warten bis der Gaszähler was macht.
              -- Schlechte Jahreszeit erwischt --, da im Moment die Sonne brummt...

              Lässt man sich dann einfach die pngs anzeigen, die im rrd Verzeichniss generiert werden und gut ist?

              Thanks

              Kommentar


                #8
                Ja genau, einfach die png's in der Visu anzeigen lassen, ich nutze die iphone Visu dafür (bei der Auflösung meines iPod's reicht die Qualität des Plots).
                Gruß,
                Marc

                Kommentar


                  #9
                  gibt es noch andere codesnipplets für z.B.
                  Strom, Wasser und Co?

                  LG

                  Kommentar

                  Lädt...
                  X