Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Plugin Fensterstatus

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

    #16
    Zitat von haegar80 Beitrag anzeigen
    Danke Volker!
    Das Plugin läuft nun ohne Fehlermeldung und wird auch ausgeführt, wenn sich ein Fensterstatus ändert.

    Im ETS-Busmonitor sehe ich aber nicht, daß die Sammeladresse 6/1/0 für den Fensterstatus angesprochen wird...
    muss

    if (($msg{'valuee'} == 01) && ($status == 00)) {

    vielleicht

    if (($msg{'value'} == 01) && ($status == 00)) {

    heissen?

    Gruss,

    der Jan
    KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

    Kommentar


      #17
      Zitat von JNK Beitrag anzeigen
      muss

      if (($msg{'valuee'} == 01) && ($status == 00)) {

      vielleicht

      if (($msg{'value'} == 01) && ($status == 00)) {
      Danke, da habe ich schon gesehen und korrigiert-
      Daran scheint es nicht zu liegen...

      Kommentar


        #18
        ööömmm...

        Ich denke das Problem liegt bei der ersten IF-Abfrage in der foreach schleife

        Code:
        knx_read($msg{'dst'},0,1) != $plugin_info{$plugname.'_' . ($element->{name})
        Das funktioniert bei dir so nicht, weil diese Abfrage erwartet, dass IM Hash @UG ein element mit der bezeichnung name und dem Wert NAME existiert. Du hast also bei der Zuweisung zu viel gelöscht. Diesen Teil habe ich so eingebaut um die Zustände remanent zu speichern. Bei dir fehlt aber der Wert $element->{name}.

        Es müsste also weiter oben eigentlich so aussehen:

        Code:
        push @UG, {name => "KU"};
        push @UG, {name => "WZ"};
        Dann sollte es funktionieren.

        PS: Nö hast noch mehr vergessen...

        Code:
        $msg{'dst'} eq ($element->{GA}
        Da must du also auch noch ein Element GA haben. Also faktisch so:

        Code:
        push @UG, {name => "KU", GA => '6/1/20'};
        push @UG, {name => "WZ", GA => '6/1/100'};
        Gruss Patrik alias swiss

        Kommentar


          #19
          Das sieht mir irgendwie nach Geraffel aus.
          Code:
          #
          # Fensterstatus v0.1
          #
          # by JNK, 2011-09-19
          
          
          my @Fenster_GA = ('7/7/7', '7/7/8');
          my $Sammel_GA = '7/7/9';
           
          # AusfUhren des Plugin
          # $plugin_subscribe >> bei neUm Wert auf GA
          $plugin_info{$plugname.'_cycle'} = 0;
          
          if (($msg{'apci'} eq 'A_GroupValue_Write') && (grep {$_ eq $msg{'dst'};} @Fenster_GA)) {
             # ist wirklich fuer uns
             my $status = 0;
             foreach my $GA (@Fenster_GA) {
               if (knx_read($GA, 0, 1) == 01) {
                 $status = 1;
               }
             }
             knx_write($Sammel_GA, $status, 1);
             return 'Sent Value'.$status;
          }
          
          # keine Telegramme, also Init
          
          foreach my $GA (@Fenster_GA) {
              $plugin_subscribe{$GA}{$plugname} = 1; 
              $retval .= $GA;
          }
          
          return 'Init';
          Sollte genau tun, was Du willst. Wenn eine von den Fenster_GA auf 1 wechselt, wird eine 1 gesendet. Weinn eine von den Fenster_GA auf 0 wechselt, wird eine 0 gesendet.

          Gruss,

          der Jan
          KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

          Kommentar


            #20
            Hallo Jan.

            ??Das Plugin soll die Fensterzustände sammeln und einen sammelstatus ausgeben.

            Dazu soll auf der sammelrückmeldunge eine 1 ausgegeben werden sobald ein oder mehrere Fenster geöffnet werden.

            Auf der sammel rückmeldung soll NUR eine 0 gesendet werden, wenn ALLE Fenster zu sind. Ich verstehe dein Plugin aber irgendwie anders
            Gruss Patrik alias swiss

            Kommentar


              #21
              Zitat von haegar80 Beitrag anzeigen
              Okay Asche auf mein Haupt, Perl scheint da ja extrem rumzuzicken...
              Eher nicht. Ich kenne keine (gängige) Programmiersprache, die Umlaute in Variablennamen duldet.

              Zitat von haegar80 Beitrag anzeigen
              Ich bekomme jetzt das hier:

              syntax error at (eval 398) line 35, near ") {" syntax error at (eval 398) line 44, near "}

              Was will mir mein Wiregate sagen??
              Du wirst nicht drum herum kommen, diese Fehlermeldungen verstehen zu lernen, was aber gar nicht so schwer ist. Die blauen Teile kannst Du für den Anfang ignorieren. Das was rot ist, sagt aber meistens recht genau, worauf es ankommt. In diesem Fall war es die Zeile 44, die es in Deinem Script aber nicht gibt/gab bzw. leer ist/war, weil es nur 43 Zeilen Code hat/te. Das bedeutet, wie zuvor ja bereits aufgeklärt wurde, das am Ende was fehlt/e. In diesem Fall die geschweifte Klammer.

              Das soll nur eine Hilfe zu Selbsthilfe sein. Aber der Lernprozess ist nicht trivial: Perl kann sehr gemein sein, auch zu erfahrenen Perl-Programmierern.
              Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

              Kommentar


                #22
                Zitat von swiss Beitrag anzeigen
                Hallo Jan.

                ??Das Plugin soll die Fensterzustände sammeln und einen sammelstatus ausgeben.

                Dazu soll auf der sammelrückmeldunge eine 1 ausgegeben werden sobald ein oder mehrere Fenster geöffnet werden.

                Auf der sammel rückmeldung soll NUR eine 0 gesendet werden, wenn ALLE Fenster zu sind. Ich verstehe dein Plugin aber irgendwie anders
                Aber genau das tut es doch. Wenn ein oder mehr Fenster 1 hat, kommt eine 1, wenn alle 0 sind, eine 0.

                Das Sammeln macht der Cache vom eibd.

                Gruss,

                der Jan
                KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

                Kommentar


                  #23
                  Ach soo...

                  Jetzt hab ich es auch gesehen. Du beschreibst die Variabel Status mit 1 und überschreibst sie wieder wenn ale GA's 0 haben. Jetzt kapier ich es auch.
                  Gruss Patrik alias swiss

                  Kommentar


                    #24
                    Zitat von swiss Beitrag anzeigen
                    Jetzt hab ich es auch gesehen. Du beschreibst die Variabel Status mit 1 und überschreibst sie wieder wenn ale GA's 0 haben. Jetzt kapier ich es auch.
                    Im Prinzip ist es ja nichts anderes als ein OR der Einzel-Stati. Ich bin auch kein PERL-Experte, vielleicht geht das noch einfacher.



                    Gruss,

                    der Jan

                    Edit: Je nachdem, wie häufig die Einzel-Stati gesendet werden, könnte man sich noch den Sammel-GA-Status vom letzten Aufruf merken und nur bei Änderung auf der Sammel-GA senden.
                    KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

                    Kommentar


                      #25
                      Wäre das nicht schneller ?
                      Code:
                      [FONT="Courier New"]foreach my $GA (@Fenster_GA) {
                           if (knx_read($GA, 0, 1) == 01) {
                              knx_write($Sammel_GA, $status, 1);
                              return 'Sent Value'.$status;
                           }
                         }[/FONT]
                      Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

                      Kommentar


                        #26
                        Hallo Edgar

                        Und wo wird in diesem Codeschnipsel die Sammel-GA wieder auf 0 gesetzt?
                        Gruss Patrik alias swiss

                        Kommentar


                          #27
                          Zitat von emax Beitrag anzeigen
                          Wäre das nicht schneller ?
                          Code:
                          [FONT="Courier New"]foreach my $GA (@Fenster_GA) {
                               if (knx_read($GA, 0, 1) == 01) {
                                  knx_write($Sammel_GA, $status, 1);
                                  return 'Sent Value'.$status;
                               }
                             }[/FONT]
                          Nein. Das sendet ja immer eine 0, weil $status mit 0 initialisiert wird. Wenn dann

                          Code:
                          foreach my $GA (@Fenster_GA) {
                               if (knx_read($GA, 0, 1) == 01) {
                                  knx_write($Sammel_GA, 1, 1); # da war ne1, senden und raus
                                  return 'Sent Value 1';
                               }
                          }
                          knx_write($Sammel_GA, 0, 1); # keine 1 dabei gewesen
                          return 'Sent Value 0';
                          Aber das finde ich ehrlich gesagt weniger schön im Code.

                          gruss,

                          der Jan
                          KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

                          Kommentar


                            #28
                            Vertipper. Ich meinte es so:
                            Code:
                            [FONT="Courier New"]
                            foreach my $GA (@Fenster_GA) {
                                 if (knx_read($GA, 0, 1) == 01) {
                                    knx_write($Sammel_GA, 1, 1);
                                    return 'Sent Value 1';
                                 }
                               }
                            
                            ...
                            
                            [/FONT]
                            In dem Moment, wo die erste '1' entdeckt wird, ist der Käse doch gegessen. return findet ja nicht statt, wenn keine '1' gefunden wurde. Dann wird der Code ausgeführt, der nach dem Loop kommt (hier durch die drei Punkte ersetzt). Da kann man dann zurücksetzen, was zurückzusetzen ist. So hat Jan das im seinem letzten Beispiel ja auch gemacht.

                            Es ist ja nicht sinnvoll, die Schleife weiter zu durchlaufen, wenn man bereits ein offenes Fenster entdeckt hat.


                            PS: Und eben erst sehe ich, dass es exakt der gleiche Code ist.
                            Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

                            Kommentar


                              #29
                              Wenn das nicht gefällt, dann eben so:

                              Code:
                              [FONT="Courier New"]
                              my $status = 0;
                              foreach my $GA (@Fenster_GA) {
                                   if (knx_read($GA, 0, 1) == 1) {
                                      $status=1;
                                      last;
                                   }
                                 }
                              
                              knx_write($Sammel_GA, $status, 1);
                              return "Sent Value $status";
                              
                              ...
                              
                              [/FONT]
                              Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

                              Kommentar


                                #30
                                Ich habs nochmal geändert auf "Nur senden, wenn Status geändert" und "auf/zu" kann zwischen 0 und 1 frei gewählt werden.

                                @emax: auf last; war ich dann auch gekommen.
                                @makki: commit?

                                Code:
                                #
                                # Fensterstatus v0.2
                                #
                                # by JNK, 2011-09-19
                                
                                
                                my @Fenster_GA = ('7/7/7', '7/7/8'); # hier alle Fenster-Einzel-GA
                                my $Sammel_GA = '7/7/9'; # hier die Sammel-GA
                                my $zustand_geschlossen = 01;    # auf richtige polarität achten!
                                my $zustand_offen = 00;
                                
                                 
                                # Flossen weg, der Rest geht automatisch
                                $plugin_info{$plugname.'_cycle'} = 0; # nur bei Telegramm aufrufen
                                
                                if (($msg{'apci'} eq 'A_GroupValue_Write') && (grep {$_ eq $msg{'dst'};} @Fenster_GA)) {
                                   # Telegramm auf einer Einzel-GA erhalten
                                   my $status = $zustand_geschlossen; # mit geschlossen anfangen
                                   my $old_status = $plugin_info{$plugname.'_oldstatus'};
                                   foreach my $GA (@Fenster_GA) {
                                     if (knx_read($GA, 0, 1) == $zustand_offen) { # da war eine 'offen', also Status auf 1 setzen
                                       $status = $zustand_offen;
                                       last;
                                     }
                                   }
                                   if ($old_status != $status){ #
                                       knx_write($Sammel_GA, $status, 1); # Status hat sich geaendert, senden
                                       $plugin_info{$plugname.'_oldstatus'} = $status; # neuen Status speichern
                                   }
                                   
                                   return 'Sent Value'.$status;
                                }
                                
                                # keine Telegramme, also Init
                                
                                foreach my $GA (@Fenster_GA) {  # an allen Fenster-Einzel-GA anmelden
                                    $plugin_subscribe{$GA}{$plugname} = 1; 
                                }
                                # bis zum Beweis des Gegenteils sind alle Fenster zu
                                $plugin_info{$plugname.'_oldstatus'} = $zustand_geschlossen;
                                
                                return 'Init';
                                KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

                                Kommentar

                                Lädt...
                                X