Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - KNX-Bus wird durch schlecht geschriebenes Plugin überfüllt

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

    [wiregate] - √ - KNX-Bus wird durch schlecht geschriebenes Plugin überfüllt

    Hallo zusammen,
    ich benötige etwas Hilfe bei der Analyse eines Problemes. Mein Aufbau sieht wie folgt aus: Ich habe insgesamt 3 Stromzähler ( Erzeugung PV, zwischen Haushaltsstrom und Wärmepumpe, zwischen Wärmepumpe und EVU), welche mittels eine optischen Schnittstelle über ein RasberryPI ausgelesen werden. Das Script zum Auslesen ist im RasPI alle 5 Minuten eingeplant. Das Script schreibt über den eibd vom Wiregate die Werte direkt auf den Bus.
    Insgesamt sind das 5 Werte: jeweils den aktuellen Zähler-Stand der 3 Zähler und bei zweien noch die aktuelle Wirkleistung.

    Der nächste Schritt ist nun, dass ich in einem Wiregate-Plugin daraus aktuelle Verbräuche in den verschiedenen Strom-Netzen ( WP und Haushalt) berechnen will. Das Script dafür sieht wie folgt aus:
    Code:
    #############################################################################
    #
    # Plugin zur Aufzeichnung Berechnung von Stromverbrauchswerten
    #
    #############################################################################
    #
    # plugin_info-Werte
    # - Für jeden aufzuzeichnenden Wert einen plugin_info-Wert damit der Wert gemerkt bleibt.
    #
    #############################################################################
    
    # Konstanten für Aufrufart
    use constant EVENT_RESTART => 'restart';
    use constant EVENT_MODIFIED => 'modified';
    use constant EVENT_BUS => 'bus';
    use constant EVENT_SOCKET => 'socket';
    use constant EVENT_CYCLE => 'cycle';
    
    # Variablendefinitionen
    my $show_debug = 1; # switches debug information that will be shown in the log
    my $ga_z1 = '4/2/3';  # Zähler zwischen EVU und Haus
    my $ga_z2 = '4/2/6';  # Zähler zwischen WP und Haushalt
    my $ga_einsp_evu = '4/2/8'; # Einspeisung zum EVU wenn Z1 < 0 dann abs z1 sonst 0
    my $ga_verbrauch_wp = '4/2/9'; # Verbrauch der WP => z2 - Z1
    my $ga_prod_pv = '4/2/10'; # Produktion PV
    my $ga_verbrauch_hh = '4/2/11'; # Verbrauch der HH => z2 - Z1
    my $wert_z1;
    my $wert_z2;
    my $wert_prod_pv;
    my $wert_einsp_evu;
    my $wert_verbrauch_wp;
    my $wert_verbrauch_hh;
    
    
    $plugin_subscribe{$ga_z1}{$plugname} = 1;
    $plugin_subscribe{$ga_z2}{$plugname} = 1;
    $plugin_subscribe{$ga_prod_pv}{$plugname} = 1;
    
    if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $ga_z1) {
       $wert_z1 = $msg{'value'};
       $wert_z2 = knx_read($ga_z2,300);
       $wert_prod_pv = knx_read($ga_prod_pv,300);
       #oder nur falls nicht importiert: $msg{'data'} ist dann leer/undef!
       #$luftfeuchte = decode_dpt9($msg{'data'});
    
    } elsif ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $ga_z2) {
       $wert_z2 = $msg{'value'};
       $wert_z1 = knx_read($ga_z1,300);
       $wert_prod_pv = knx_read($ga_prod_pv,300);
    } elsif ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $ga_prod_pv) {
       $wert_z1 = knx_read($ga_z1,300);
       $wert_z2 = knx_read($ga_z2,300);
       $wert_prod_pv = $msg{'value'};
    } else { # zyklischer Aufruf
       # "9" (DPT) kann entfallen falls richtig importiert!
       $wert_z1 = knx_read($ga_z1,300);
       $wert_z2 = knx_read($ga_z2,300);
       $wert_prod_pv = knx_read($ga_prod_pv,300);
    }
    
    $wert_verbrauch_wp = $wert_z1 - $wert_z2;
    $wert_verbrauch_hh = $wert_prod_pv + $wert_z2;
    if ($wert_z1 > 0) {
       $wert_einsp_evu = 0;
    } else {
       $wert_einsp_evu = $wert_z1 * -1;
    }
    knx_write($ga_einsp_evu,$wert_einsp_evu);
    knx_write($ga_verbrauch_wp,$wert_verbrauch_wp);
    knx_write($ga_verbrauch_hh,$wert_verbrauch_hh);
    Eingestellt ist das Plugin auf einen 60 Sekündigen Zyklus.

    Naja, das müllt mir jedenfalls den Bus nun ziemlich zu:
    Code:
    2014-09-25 20:37:10.285,A_GroupValue_Write,1.1.2,4/2/11,00 00,0,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:10.380,A_GroupValue_Write,1.1.2,4/2/9,26 65,261.92,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:10.481,A_GroupValue_Write,1.1.2,4/0/1,94 23 18,Do 20:35:24,DPT_TimeOfDay,10.001,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:10.527,A_GroupValue_Write,1.1.2,4/0/0,19 09 0E,2014-09-25,DPT_Date,11.001,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:10.581,A_GroupValue_Read,1.1.2,4/2/6,00,0,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:11.816,A_GroupValue_Write,1.1.2,4/2/8,00 00,0,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:11.940,A_GroupValue_Write,1.1.2,4/2/9,26 65,261.92,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:12.040,A_GroupValue_Write,1.1.2,4/2/11,00 00,0,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:12.139,A_GroupValue_Read,1.1.2,4/2/6,00,0,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:13.352,A_GroupValue_Write,1.1.2,4/2/8,00 00,0,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:13.471,A_GroupValue_Write,1.1.2,4/2/11,00 00,0,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:13.591,A_GroupValue_Write,1.1.2,4/2/9,26 65,261.92,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:13.708,A_GroupValue_Read,1.1.2,4/2/6,00,0,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:14.910,A_GroupValue_Write,1.1.2,4/2/8,00 00,0,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:15.013,A_GroupValue_Write,1.1.2,4/2/9,26 65,261.92,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:15.139,A_GroupValue_Write,1.1.2,4/2/11,00 00,0,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    2014-09-25 20:37:15.259,A_GroupValue_Read,1.1.2,4/2/6,00,0,DPT_Power,9.024,0,low,7,T_DATA_XXX_REQ,0
    Das hier ist ein Ausschnitt aus dem Logfile.

    Woher kommt das? Jede Sekunde werden die 3 Werte auf den BUS geschrieben und ein Wert gelesen. Wohingegen das Plugin als "Zuletzt ausgeführt" durchaus auch mal 50 Sekunden stehen hat... Also scheint es sich an seine 60 Sekunden Zyklus-Zeit zu halten.

    Hat jemand eine Idee, was mir den BUS so zumüllt?

    Danke,
    Stefan

    #2
    Ohne jetzt 100% durchgestiegen zu sein denke ich es liegt am else Zweig.

    Du sendest auf eine abonnierte GA ein read und fängst das im Code nicht ab. Bringt damit eine gute Schleife ins rollen. Also einfach den den zyklischen Zweig noch auf msg{'apci'} evaluieren. Beim zyklischen Aufruf ist diese Variable leer.
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    Kommentar


      #3
      Moin,
      ich hab das heute Morgen umgesetzt. Und es funktioniert... Aber verstanden habe ich es zugegebenermaßen noch nicht zu 100%...

      Abonnierte GA, Read, Schleife ist klar. Aber warum zeigt mir "zuletzt ausgeführt" in der Plugin-Übersicht durchaus Zeiten im Bereich von knapp 60 Sekunden an.

      Gruß
      Stefan

      Kommentar


        #4
        Der Zeitstempel des letzten Pluginaufrufs wird nur bei zyklischem Aufruf gesetzt. D.h. wird Dein Plugin durch eine GA aufgerufen, bleibt der Zyklus selbst unverändert (und wird nicht zurückgesetzt)!

        Kommentar


          #5
          Ahhh... Danke für die Erleuchtung :-)

          Kommentar

          Lädt...
          X