Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Verständnisfrage zur Ausführung von Plugins

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] - √ - Verständnisfrage zur Ausführung von Plugins

    Hallo,

    da ich noch einen alten Zähler mit Scheibe habe und diesen mit >>dieser<< Schnittstelle abtaste, hab ich mir jetzt ein Plugin geschrieben um den täglichen Verbrauch in ein RRD zu schreiben.

    Soweit sogut, mein Problem ist zur Zeit allerdings, dass das Plugin nur einmal täglich ausgeführt werden soll, was es laut "Zuletzt ausgeführt (s)" auch tut, allerdings zählen die Ticks kontinuirlich hoch und an den RRD Einträgen sehe ich, dass es auch ausgeführt wird.

    Wodurch werden die Ticks beeinflusst, bzw. wodurch könnte das Plugin ausgeführt werden ohne dass "Zuletzt ausgeführt (s)" zurückgesetzt wird?

    Danke schon mal für eure Hilfe!

    lg Werner
    KNX, DMX, 1Wire, WireGate, CometVisu

    #2
    Ah Nachtrag... hier das Plugin. Ich bekomme pro Umdrehung der Scheibe einen Impuls auf einen Binäreingang, dieser Zählt dann einfach um eines hoch. Einmal am Tag rufe ich dann diesen Counter Wert ab und speichere ihn in einer Date. Vorher ziehe ich den gespeicherten alten Wert des Vortages ab und trage die Differenz dann in ein RRD ein.

    [HILFE]
    ################################################## ####################################
    #
    # Plugin zur Aufzeichnung des Stromverbrauchs der Wärmepumpe
    # V0.1 2013-01-16
    # by Werner V - www.knx-user-forum.de
    #
    ################################################## ####################################

    #########################
    ### BEGINN DEFINITION ###
    #########################

    # Aufruf-Zyklus auf einmal täglich setzen
    $plugin_info{$plugname.'_cycle'} = 86400;
    my $counter_ga = '5/0/200';

    #########################
    ### ENDE DEFINITION ###
    #########################
    # neuen Stand einlesen
    my $wert_neu = knx_read($counter_ga,300,13);
    # alten Stand einlesen
    open(File,'</var/www/plugins/kwh_counter.txt');
    my $wert_alt = <File>;
    close File;
    # Differenz gestern zu heute ausrechnen und in kWh umrechnen
    my $diff = $wert_neu - $wert_alt;
    my $diff_kwh = $diff / 75;
    # RRD mit neuem Wert beschreiben
    update_rrd("waermepumpe_tagesverbrauch","",$diff_k wh);
    # File mit neuem Wert beschreiben
    open(File,'>/var/www/plugins/kwh_counter.txt');
    print File $wert_neu;
    close File;
    return "Counter = $wert_neu, kWh = $diff_kwh";
    [/HILFE]
    KNX, DMX, 1Wire, WireGate, CometVisu

    Kommentar


      #3
      Ich würde per Date::Time den aktuellen Tag des Monats ausrechnen lassen. Diesen speicherst Du dann in einem plugin_info() remanent als $vortag ab.

      Dann folgt bei Aufruf des Plugins einfach ein Vergleich der den aktuellen Tag ($heute) mit dem Wert aus plugin_info vergleicht.

      Code:
      my $vortag = plugin_info()
      if ($vortag = $heute){
      #nichts machen
      } else {
      update_rrd("waermepumpe_tagesverbrauch","",$diff_kwh);
      $vortag=$heute;
      }
      Die Werte für den Zähler könntest Du auch in einem plugin_info ablegen, so sparst Du Dir das lästige textfile. Wobei das Textfile auch bei einem Datenbankverlust der plugin_db erhalten bleiben würde.

      Beispiele für plugin_info gibt es zahlreich im SVN.

      Grüße
      Umgezogen? Ja! ... Fertig? Nein!
      Baustelle 2.0 !

      Kommentar


        #4
        Hallo Werner

        Was meinst du mit Ticks? -> die Einträge im RRD?

        Das RRD wird per default alle 300 Sekunden aktualisiert. Dabei wird der Durchschnittswert der letzten 5 Minuten in das RRD geschrieben. Wenn du nun keinen Wert (innerhalb der 300 sekunden) in das RRD schreibst, wird das RRD die meiste Zeit keine sinvollen Werte protokollieren.
        Gruss Patrik alias swiss

        Kommentar


          #5
          Hallo ihr zwei.

          Danke für eure Antworten

          @Patrick
          ich meine die Ticks im Webmin bei den Plugins, die Spalte ganz rechts. Wenn ich das richtig verstehe sollten die doch nur hoch zählen wenn das Plugin ausgeführt wird?
          Gibt es keine Möglichkeit, dass in das RRD nur einmal am Tag ein Wert geschrieben wird? Ich würde wie gesagt gerne einmal täglich den kWh Verbrauch eintragen lassen, damit ich so einen Vergleich habe wieviel die Pumpe täglich verbraucht.

          @Jumi
          Danke das mit dem Date ist eine gute Idee. Sollte das mit dem RRD aktualisieren doch einmal täglich funktionieren werd ichs dahingehend probieren. Die Idee beim Textfile war, dass wenn das WG einmal neu gestartet wird oder wie du sagt die db verloren geht, hätte ich wenigstens den Wert im Textfile noch.

          lg Werner
          KNX, DMX, 1Wire, WireGate, CometVisu

          Kommentar


            #6
            Also plugin_info überlebt auch normale Neustarts.

            Mit dem Datum-Check kannst Du das Plugin auch ruhig alle 5 Minuten aufrufen lassen solange die if-Bedingung funktioniert
            Umgezogen? Ja! ... Fertig? Nein!
            Baustelle 2.0 !

            Kommentar


              #7
              Hai,

              aber wenn das RRD per default sowieso alle 5 Minuten beschrieben wird bringt mir das auch nix, dann bekomm ich da alle 5 Minuten irgendwelche Werte rein. Bräuchte das beschreiben des RRD nur einmal täglich.

              lg
              KNX, DMX, 1Wire, WireGate, CometVisu

              Kommentar


                #8
                Das Beschreiben des RRDs soll doch die if-Bedingung abfangen bzw. nur einmal am Tag zulassen. Der kürzere Ausführungszyklus sorgt für den regelmässigen timestamp im RRD. Das RRD wird dann immer zwischen 0:00 und 0:05 gefüllt.
                Dies erfordert aber, egal wie Du es umsetzt, ein spezielles RRD da sonst der Heartbeat des RRDs denkt die Datenquelle ist tot (keine Daten innerhalb von 900s beim Wiregate).

                Da muss makki mal was zu sagen ob das mit update_rrd geht.

                Gruß
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #9
                  Hallo Werner.

                  Du kannst ein RRD auch so erzeugen, dass nur 1 Wert pro Tag gelogt wird. Aber das geht AFAIK nur mit einem Trick. Dazu müsste ich aber eine ganze Anleitung schreiben. Vieleicht kennt jemand eine schnellere Variante z.B. mit einem Befehl in der Konsole...

                  @jumi: ja man kann den intervall beeinflussen aber nicht per Update RRD... Wenn man vor dem erzeugen den default von 300 auf (1Tag) erhöht. Dann muss man nach dem erzeugen wieder auf 300 zurückstellen für folgende RRD's
                  Gruss Patrik alias swiss

                  Kommentar


                    #10
                    Schön ist was anderes, aber mit diesem Code hier in einem Plugin habe ich mir ein RRD erzeugen lassen, das 60 Minuten als Heartbeat hat (--step 3600).
                    Wozu der Rest der Parameter da ist weiß ich nicht mehr so genau, aber dazu findet man in der RRD-Dokumentation mehr.

                    Code:
                    # Wirkleistung 60min-Summe
                    if (!-e '/var/www/rrd/Stromzaehler_Wirkleistung_60min.rrd') {
                          RRDs::create('/var/www/rrd/Stromzaehler_Wirkleistung_60min.rrd',
                            '--step' => 3600,
                            'DS:value:GAUGE:10800:-55:255000',
                            'RRA:AVERAGE:0.5:1:2160','RRA:AVERAGE:0.5:5:2016','RRA:AVERAGE:0.5:15:2880','RRA:AVERAGE:0.5:180:8760',
                            'RRA:MIN:0.5:1:2160','RRA:MIN:0.5:5:2016','RRA:MIN:0.5:15:2880','RRA:MIN:0.5:180:8760',
                            'RRA:MAX:0.5:1:2160','RRA:MAX:0.5:5:2016','RRA:MAX:0.5:15:2880','RRA:MAX:0.5:180:8760');
                    }
                    update_rrd("Stromzaehler_", "Wirkleistung_60min", knx_read("7/7/7", 60*60));

                    Kommentar


                      #11
                      Das geht klar auch direkt im Plugin, als Counter RRD gibts da Beispiele im SVN (ETU Pelletkessel Plugin und IEC Meter unter tools). Das ist dann ein einfacher Konsolenbefehl der aus dem Plugin gesendet wird.

                      RRD-tool ist mächtig und gut dokumentiert, aber nicht in 3 Zeilen erklärt.

                      Der Trick von Patrick sollte hier aber funktionieren.

                      Gruß
                      Umgezogen? Ja! ... Fertig? Nein!
                      Baustelle 2.0 !

                      Kommentar


                        #12
                        @netzkind, genau das meinte ich.

                        Ich würde heartbeat aber immer deutlich über dem eigentlichen Intervall ansetzen, sonst ist der Wert bei einer Verzögerung dahin. Die Probleme hatte ich zumindest bei einem Counter-RRD.

                        Im wiregated ist bei Intervall 300s der Heartbeat auch bei 900 Sekunden.
                        Umgezogen? Ja! ... Fertig? Nein!
                        Baustelle 2.0 !

                        Kommentar


                          #13
                          Hey,

                          hab im ETU Plugin mal geschaut da wird das ähnlich gemacht

                          Code:
                          RRDs::create(    $DirRrd.$value_URI_RRDdaycount_mapping{$value->{uri}}.".rrd",
                                                          '--step' => 86400, 
                                                          'DS:value:COUNTER:86500:0:10000000000', 
                                                          'RRA:AVERAGE:0.5:1:365', 'RRA:AVERAGE:0.5:7:300');
                          Werd mir morgen mal anschauen für was die DS:value und RRA:AVERAGE sind bzw. was ich da beim Anlegen verweden muss - danke schon mal

                          lg Werner
                          KNX, DMX, 1Wire, WireGate, CometVisu

                          Kommentar


                            #14
                            Das "last" bezieht sich auf (seit PL30 oder so) zuletzt ausgeführt durch cycle - das ist kann man blöd finden, ist aber gerade so..
                            d.h. das Plugin kann durch "plugin-subscribe" auf einen socket oder eine GA durchaus öfter/später ausgeführt worden sein.
                            Das macht dem RRD aber rein garnichts, wenn es "zu oft" aktualisiert wird, schlecht ist nur wenns zu selten passiert..

                            -> Also wo genau das Problem liegt ist mir noch nicht klar: Wenn man unbedingt meint, Werte Punktgenau aufzeichnen zu müssen -> ist rrdtool schlicht das falsche (siehe z.B. rsslog aus der CV, zigfache Datenmenge aber eben eine Zeile pro Aktion in der sqlite-DB.. gut, wenn man das wirklich will..)

                            Makki
                            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                            -> Bitte KEINE PNs!

                            Kommentar


                              #15
                              Hi,

                              soooo mal ein wenig probiert, zur Zeit siehts so aus:

                              Code:
                              ###################################################################################### 
                              # 
                              # Plugin zur Aufzeichnung des Stromverbrauchs der Wärmepumpe
                              # V0.2 2013-01-19 
                              # by Werner V - [URL="http://www.knx-user-forum.de"]www.knx-user-forum.de[/URL]
                              #
                              ######################################################################################
                              ######################### 
                              ### BEGINN DEFINITION ### 
                              ######################### 
                              # Aufruf-Zyklus auf einmal täglich setzen
                              $plugin_info{$plugname.'_cycle'} = 86400;
                              my $file = '/var/www/plugins/kwh_counter.txt';
                              my $counter_ga = '5/0/200';
                              ######################### 
                              ###  ENDE DEFINITION  ### 
                              ######################### 
                              use RRDs;
                              use Time::Local;
                              # Datum berechnen
                              my $sec; #Sekunde
                              my $min; # Minute
                              my $hour; #Stunde
                              my $mday; #Monatstag
                              my $mon; #Monatsnummer
                              my $year; #Jahr
                              my $wday; #Wochentag 0-6
                              my $yday; #Tag ab 01.01.xxxx
                              my $isdst;
                              ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
                              $year += 1900;
                              $mon += 1;
                              my $vortag = $mday . "." . $mon . "." . $year;
                              my $heute = $mday . "." . $mon . "." . $year;
                              # Hauptverarbeitung
                              my $vortag_work = $plugin_info{$plugname.'_vortag'};
                              if ($vortag_work == $heute){
                              # nichts machen
                              } else {
                              # neuen Stand einlesen
                              my $wert_neu = knx_read($counter_ga,300,13);
                              # alten Stand einlesen
                              open(File,'</var/www/plugins/kwh_counter.txt');
                              my $wert_alt = <File>;
                              close File;
                              # Differenz gestern zu heute ausrechnen und in kWh umrechnen
                              my $diff = $wert_neu - $wert_alt;
                              my $diff_kwh = $diff / 75;
                              # RRD mit neuem Verbrauch beschreiben
                              if (!-e '/var/www/rrd/waermepumpe_tagesverbrauch.rrd') {
                              RRDs::create('/var/www/rrd/waermepumpe_tagesverbrauch.rrd',
                                           '--step' => 86400, 
                                           'DS:value:GAUGE:88000:0:10000000000', 
                                           'RRA:AVERAGE:0.5:1:365', 'RRA:AVERAGE:0.5:7:300');
                              }      
                              update_rrd("waermepumpe_tagesverbrauch","",$diff_kwh);
                              # File mit neuem Wert beschreiben
                              open(File,'>/var/www/plugins/kwh_counter.txt');
                              print File $wert_neu;
                              close File;
                              # Datum für die nächste Berechnung in plugin_info speichern
                              $plugin_info{$plugname.'_vortag'} = $heute;
                              }
                              return;
                              obs funktioniert kann ich in ein paar Tagen sagen

                              lg Werner
                              KNX, DMX, 1Wire, WireGate, CometVisu

                              Kommentar

                              Lädt...
                              X