Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Oderfunktion funktioniert nicht richtig

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

    [wiregate] - √ - Oderfunktion funktioniert nicht richtig

    Hallo zusammen,

    ich versuche gerade mein 1. WireGate Plugin eine 5-fach Oderfunktion zu realisieren.

    Ich habe auch schon einen Versuch gestartet:

    Code:
    ###################################################################################### 
    # 
    # Oder Verknüpfung
    # V0.1 2012-04-05 
    #
    ###################################################################################### 
    
    ######################### 
    ### BEGINN DEFINITION ### 
    ######################### 
    
    # Aufruf-Zyklus auf 300 Sekunden setzen
    $plugin_info{$plugname.'_cycle'} = 300;
    
    #Variablen
    my $Oder1 = 0;
    my $Oder2 = 0;
    my $Oder3 = 0;
    my $Oder4 = 0;
    my $Oder5 = 0;
    
    #GA´s
    my $AusgangOderGA = '0/0/7';
    my $Oder1GA = '0/0/2';
    my $Oder2GA = '0/0/3';
    my $Oder3GA = '0/0/4';
    my $Oder4GA = '0/0/5';
    my $Oder5GA = '0/0/6';
    
    
    #Plugin auf GAs anmelden
    $plugin_subscribe{$Oder1GA}{$plugname} = 1;
    $plugin_subscribe{$Oder2GA}{$plugname} = 1;
    $plugin_subscribe{$Oder3GA}{$plugname} = 1;
    $plugin_subscribe{$Oder4GA}{$plugname} = 1;
    $plugin_subscribe{$Oder5GA}{$plugname} = 1;
    
    
    ######################### 
    ###  ENDE DEFINITION  ### 
    ######################### 
    
    # Plugin aufgrund eines eintreffenden Telegramms oder zyklisch bearbeiten
    # bei eintreffenden Telegrammen auf "Write" reagieren
    
    if ($msg{'apci'} eq "A_GroupValue_Write") {
       if ($msg{'dst'} eq $Oder1GA) {
          $Oder1 = $msg{'value'};
       }
    
       if ($msg{'dst'} eq $Oder2GA) {
          $Oder2 = $msg{'value'};
       }
    
       if ($msg{'dst'} eq $Oder3GA) {
          $Oder3 = $msg{'value'};
       }
    
       if ($msg{'dst'} eq $Oder4GA) {
          $Oder4 = $msg{'value'};
       }
    
       if ($msg{'dst'} eq $Oder5GA) {
          $Oder5 = $msg{'value'};
       }
    } else { # zyklischer Aufruf
       $Oder1 = knx_read($Oder1GA,300,1);
       $Oder2 = knx_read($Oder2GA,300,1);
       $Oder3 = knx_read($Oder3GA,300,1);
       $Oder4 = knx_read($Oder4GA,300,1);
       $Oder5 = knx_read($Oder5GA,300,1);
    }
    
    #Auswertung Oderfunktion
    if (($Oder1 == 1) || ($Oder2 == 1) || ($Oder3 == 1) || ($Oder4 == 1) || ($Oder5 == 1)) {
        knx_write($AusgangOderGA,1,1);
        $plugin_info{$plugname.'_Ausgang'} = 1;
    } else {
        knx_write($AusgangOderGA,0,1);
        $plugin_info{$plugname.'_Ausgang'} = 0;
    }
    
    return;
    das ganze funktioniert auch schon teilweise das Plugin wird bei neuen Telegramm abgearbeitet. Allerdings funktioniert die Oderfunktion selbst nicht d.h. es wird immer das 0 Telegramm an den Ausgang weitergegeben obwohl ein anderen Eingang noch logisch 1 anliegt.
    GA sind im WG importiert.

    Warum funktioniert das Oder nicht?
    Könnte evtl. jemand drüberschaun?

    Gruß

    #2
    Hi,

    ich vermute es liegt daran, dass das $msg{'value'} den String "01" und keine Zahl 1 zurückgibt.

    Versuch mal, ein int() um den Wert herum zu schreiben, also z.B.

    Code:
    $Oder1 = int($msg{'value'});
    Alternativ, bzw. wenn o.g. Lösung nicht klappt, kannst du dir mal im Log die Werte der $oder-Variablen ausgeben lassen um zu sehen ob, bzw. was da ankommt.
    Viele Grüße
    Christian

    Kommentar


      #3
      scheint zu funktionierten, habs aber nur kurz getestet. Danke
      muss ich bei knx_read das int() auch verwenden? Vermute ja da man bei anderen DPT auch ein decode verwenden muss?

      edit: nach nem Neustart des WG funktionierts nicht mehr. Wie verfrachte ich die Variabeln in die Log?
      edit2: mit decode_dpt1() stat int() funktioniert es atm wieder.

      Kommentar


        #4
        Die decode_dpt1-Funktion ist denke ich sogar die elegantere Variante.

        Noch zur Beantwortung Deiner Frage, ins Log schreibst du mit

        Code:
        plugin_log($plugname,"Logeintrag");
        Viele Grüße
        Christian

        Kommentar


          #5
          Zitat von Michi26206 Beitrag anzeigen
          edit: nach nem Neustart des WG funktionierts nicht mehr. Wie verfrachte ich die Variabeln in die Log?
          Wahrscheinlich willst Du nicht den Wert im Log festhalten, sondern den Wert der Variablen remanent halten; zu diesem Zweck kannst Du

          Code:
              #abgespeicherte Wert in Variable einlesen
              $sperre_wert = $plugin_info{$plugname.'_sperre_wert'};
              #Wert der Variable abspeichern 
              $plugin_info{$plugname.'_sperre_wert'} = $sperre_wert;
          verwenden.

          Details siehe hier: https://knx-user-forum.de/wiregate/1...her-im-wg.html

          Kommentar


            #6
            Zitat von Fechter65 Beitrag anzeigen
            Wahrscheinlich willst Du nicht den Wert im Log festhalten, sondern den Wert der Variablen remanent halten;
            ne War schon Log gemeint. christian523 meinte weiter oben wenn es nicht funktioniert solle ich die Variablen zum Debug mal in der Log ausgeben.

            Habe jetzt ein weiteres Problem:
            Code:
            Undefined subroutine &main::decode_dpt1
            Muss ich da nen include setzen? Manchmal funktionierts manchmal nicht...

            Kommentar


              #7
              Ich habe das mal getestet, die Funktion decode_dpt1 gibt es so wie es aussieht gar nicht. Der Grund, dass es manchmal geht muss also ein anderer sein. Kann es sein, dass es über knx_read funktioniert, nur über die GA-Abfrage nicht?

              Verwende bitte nochmal das int(), denn was anderes passiert beim decodieren der dpt1-Werte so wie es aussieht auch nicht.
              Dann kannst die Werte mal mit Punkt aneinanderreihen und ins Log schreiben, also z.B.

              Code:
              plugin_log($plugname, ":   Oder1= ".$Oder1." Oder2= ".$Oder2);
              Wenn es immer noch nicht geht, poste doch bitte nochmal den aktuelle Code.
              Viele Grüße
              Christian

              Kommentar


                #8
                Jetzt werden die 0 Telegramme trotz 1 an einem anderen Eingang durchgeleitet zum Ausgang.

                Auszug aus der Log:

                2012-04-09 14:02:13.607,Oder Verknüpfung,: Oder1= 0 Oder2= 0 Oder3= 0 Oder4= 0 Oder5= 0 2012-04-09 14:02:13.610,Oder Verknüpfung,Ausgang Oder: 0 2012-04-09 14:02:25.342,Oder Verknüpfung,: Oder1= 1 Oder2= 0 Oder3= 0 Oder4= 0 Oder5= 0 2012-04-09 14:02:25.345,Oder Verknüpfung,Ausgang Oder: 1 2012-04-09 14:02:25.375,Oder Verknüpfung,: Oder1= 0 Oder2= 1 Oder3= 0 Oder4= 0 Oder5= 0 2012-04-09 14:02:25.379,Oder Verknüpfung,Ausgang Oder: 1 2012-04-09 14:02:25.404,Oder Verknüpfung,: Oder1= 0 Oder2= 0 Oder3= 1 Oder4= 0 Oder5= 0 2012-04-09 14:02:25.415,Oder Verknüpfung,Ausgang Oder: 1 2012-04-09 14:02:25.438,Oder Verknüpfung,: Oder1= 0 Oder2= 0 Oder3= 0 Oder4= 1 Oder5= 0 2012-04-09 14:02:25.450,Oder Verknüpfung,Ausgang Oder: 1 2012-04-09 14:02:25.472,Oder Verknüpfung,: Oder1= 0 Oder2= 0 Oder3= 0 Oder4= 0 Oder5= 1 2012-04-09 14:02:25.484,Oder Verknüpfung,Ausgang Oder: 1
                Ich simuliere das ganze im Moment durch die CometVisu. Ich habe nacheinander Oder1, Oder2, Oder3, Oder4, Oder5 auf 1 gesetzt aber in der Log kommt immer nur die letzte 1 an? Außerdem ist mir aufgefallen, das nach dem zyklischen Aufruf der Oder Ausgang wieder 0 annnimt.

                Aktueller Code:
                Code:
                ###################################################################################### 
                # 
                # Oder Verknüpfung
                # V0.1 2012-04-05 
                #
                ###################################################################################### 
                
                ######################### 
                ### BEGINN DEFINITION ### 
                ######################### 
                
                # Aufruf-Zyklus auf 300 Sekunden setzen
                $plugin_info{$plugname.'_cycle'} = 300;
                
                #Variablen
                my $Oder1 = 0;
                my $Oder2 = 0;
                my $Oder3 = 0;
                my $Oder4 = 0;
                my $Oder5 = 0;
                
                #GA´s
                my $AusgangOderGA = '0/0/7';
                my $Oder1GA = '0/0/2';
                my $Oder2GA = '0/0/3';
                my $Oder3GA = '0/0/4';
                my $Oder4GA = '0/0/5';
                my $Oder5GA = '0/0/6';
                
                
                #Plugin auf GAs anmelden
                $plugin_subscribe{$Oder1GA}{$plugname} = 1;
                $plugin_subscribe{$Oder2GA}{$plugname} = 1;
                $plugin_subscribe{$Oder3GA}{$plugname} = 1;
                $plugin_subscribe{$Oder4GA}{$plugname} = 1;
                $plugin_subscribe{$Oder5GA}{$plugname} = 1;
                
                
                ######################### 
                ###  ENDE DEFINITION  ### 
                ######################### 
                
                # Plugin aufgrund eines eintreffenden Telegramms oder zyklisch bearbeiten
                # bei eintreffenden Telegrammen auf "Write" reagieren
                
                if ($msg{'apci'} eq "A_GroupValue_Write") {
                   if ($msg{'dst'} eq $Oder1GA) {
                      $Oder1 = int($msg{'data'});
                   }
                
                   if ($msg{'dst'} eq $Oder2GA) {
                      $Oder2 = int($msg{'data'});
                   }
                   
                   if ($msg{'dst'} eq $Oder3GA) {
                      $Oder3 = int($msg{'data'});
                   }
                
                   if ($msg{'dst'} eq $Oder4GA) {
                      $Oder4 = int($msg{'data'});
                   }
                
                   if ($msg{'dst'} eq $Oder5GA) {
                      $Oder5 = int($msg{'data'});
                   }
                } else { # zyklischer Aufruf
                   $Oder1 = knx_read($Oder1GA,300,1);
                   $Oder2 = knx_read($Oder2GA,300,1);
                   $Oder3 = knx_read($Oder3GA,300,1);
                   $Oder4 = knx_read($Oder4GA,300,1);
                   $Oder5 = knx_read($Oder5GA,300,1);
                }
                
                plugin_log($plugname, ":   Oder1= ".$Oder1." Oder2= ".$Oder2." Oder3= ".$Oder3." Oder4= ".$Oder4." Oder5= ".$Oder5);
                
                #Oder-Funktion
                if (($Oder1 == 1) || ($Oder2 == 1) || ($Oder3 == 1) || ($Oder4 == 1) || ($Oder5 == 1)) {
                    knx_write($AusgangOderGA,1,1);
                    $plugin_info{$plugname.'_oder'} = 1;
                    plugin_log($plugname,"Ausgang Oder: 1");
                } else {
                    knx_write($AusgangOderGA,0,1);
                    $plugin_info{$plugname.'_oder'} = 0;
                    plugin_log($plugname,"Ausgang Oder: 0");
                }
                
                return;

                Kommentar


                  #9
                  [QUOTE=Michi26206;221587]Undefined subroutine &main::decode_dpt1

                  das sind interne Routinen, die es nur für komplexere DPT's sep. gibt; (und etwas "gewachsen")
                  Universeller ist
                  decode_dpt(<GA>,<ROHDATEN>,<DPT>)

                  (<GA> ist hier völlig überflüssig bei angabe des DPT->"")
                  Beim DPT1 kann man sich den decode eigentlich sparen. machste im letzten ja eh schon so (-> int($msg{'data'}) ) und passt auch so..

                  Zitat von Michi26206 Beitrag anzeigen
                  ...
                  #Variablen
                  my $Oder1 = 0;
                  my $Oder2 = 0;
                  ...
                  Da dürfte das Problem liegen. Diese $Oder1 sind über die Aufrufe hinweg nicht persistent sondern jew. lokale Variablen! selbst wenn sie das nicht wären, würden sie bei jedem Aufruf vorher mit 0 befüllt.
                  z.B.
                  -> $plugin_info{$plugname.'_Oder1'} = int($msg{'data'});

                  Makki

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

                  Kommentar


                    #10
                    jetzt funktionierts. :-)

                    Lag wirklich am
                    Code:
                    $Oder1 = 0;
                    usw.

                    Danke an alle!

                    Kommentar


                      #11
                      Zitat von Michi26206 Beitrag anzeigen
                      jetzt funktionierts. :-)
                      Fein, dann beim nächsten Mal auch gleich den "gelöst" Haken setzen.

                      Kommentar


                        #12
                        hoppla vergessen.... Sorry

                        Kommentar


                          #13
                          Und wenn Du noch die funktionierende Version posten würdest wäre es perfekt. Danke!

                          Plusch

                          Kommentar


                            #14
                            Richtig, denn die gehört für die Nachwelt ins SVN

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

                            Kommentar


                              #15
                              So bin erst jetzt dazu gekommen. Sorry

                              Code:
                              ###################################################################################### 
                              # 
                              # Oder Verknüpfung
                              # V0.1 2012-04-05 
                              # by Michi26206 - www.knx-user-forum.de
                              #
                              ###################################################################################### 
                              
                              ######################### 
                              ### BEGINN DEFINITION ### 
                              ######################### 
                              
                              # Aufruf-Zyklus auf 300 Sekunden setzen
                              $plugin_info{$plugname.'_cycle'} = 300;
                              
                              
                              #GA´s
                              my $Oder1GA = '0/3/2';
                              my $Oder2GA = '0/3/3';
                              my $Oder3GA = '0/3/9';
                              my $Oder4GA = '0/3/10';
                              my $Oder5GA = '0/3/11';
                              my $AusgangOderGA = '0/3/1';
                              
                              
                              #Plugin auf GAs anmelden
                              $plugin_subscribe{$Oder1GA}{$plugname} = 1;
                              $plugin_subscribe{$Oder2GA}{$plugname} = 1;
                              $plugin_subscribe{$Oder3GA}{$plugname} = 1;
                              $plugin_subscribe{$Oder4GA}{$plugname} = 1;
                              $plugin_subscribe{$Oder5GA}{$plugname} = 1;
                              
                              
                              ######################### 
                              ###  ENDE DEFINITION  ### 
                              ######################### 
                              
                              # Plugin aufgrund eines eintreffenden Telegramms oder zyklisch bearbeiten
                              # bei eintreffenden Telegrammen auf "Write" reagieren
                              
                              if ($msg{'apci'} eq "A_GroupValue_Write") {
                                 if ($msg{'dst'} eq $Oder1GA) {
                                    $plugin_info{$plugname.'_Oder1'} = int($msg{'data'});
                                 }
                              
                                 if ($msg{'dst'} eq $Oder2GA) {
                                    $plugin_info{$plugname.'_Oder2'} = int($msg{'data'});
                                 }
                                 
                                 if ($msg{'dst'} eq $Oder3GA) {
                                    $plugin_info{$plugname.'_Oder3'} = int($msg{'data'});
                                 }
                              
                                 if ($msg{'dst'} eq $Oder4GA) {
                                    $plugin_info{$plugname.'_Oder4'} = int($msg{'data'});
                                 }
                              
                                 if ($msg{'dst'} eq $Oder5GA) {
                                    $plugin_info{$plugname.'_Oder5'} = int($msg{'data'});
                                 }
                              } else { # zyklischer Aufruf
                                 $plugin_info{$plugname.'_Oder1'} = knx_read($Oder1GA,300,1);
                                 $plugin_info{$plugname.'_Oder2'} = knx_read($Oder2GA,300,1);
                                 $plugin_info{$plugname.'_Oder3'} = knx_read($Oder3GA,300,1);
                                 $plugin_info{$plugname.'_Oder4'} = knx_read($Oder4GA,300,1);
                                 $plugin_info{$plugname.'_Oder5'} = knx_read($Oder5GA,300,1);
                              }
                              
                              #Oder-Funktion
                              if (($plugin_info{$plugname.'_Oder1'} == 1) || ($plugin_info{$plugname.'_Oder2'} == 1) || ($plugin_info{$plugname.'_Oder3'} == 1) || ($plugin_info{$plugname.'_Oder4'} == 1) || ($plugin_info{$plugname.'_Oder5'} == 1)) {
                                  knx_write($AusgangOderGA,1,1);
                                  $plugin_info{$plugname.'_Ausgang'} = 1;
                              } else {
                                  knx_write($AusgangOderGA,0,1);
                                  $plugin_info{$plugname.'_Ausgang'} = 0;
                              }
                              
                              return;
                              edit: in den SVN kommt er sobald ich die nötigen Rechte habe

                              Kommentar

                              Lädt...
                              X