Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - if-Anweisung im Plugin geht nicht

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

    [wiregate] - √ - if-Anweisung im Plugin geht nicht

    Hallo,

    ich bin am Ende!

    Endlich hatte ich Zeit gefunden, um mein erstes Wiregate-Plugin zu schreiben und zum Laufen zu bringen (siehe Anhang).
    Sinn: der Dimmaktor von Hager, der einen Deckenstrahler bedient, hat keine Möglichkeit für Szenen. Dies sollte ein Plugin übernehmen.

    Das Plugin läuft. Wenn ich im Gruppenmonitor der ETS 4 auf die GA 8/0/6 den Wert 6 schreibe, wird von dem Plugin auf die 6/0/2 eine 1 geschrieben und auf den Bus geschickt. Aber: ich kann jeden beliebigen Wert in die GA 8/0/6 eintragen, der if-Befehl wird glatt ignoriert und jedesmal eine 1 auf die 6/0/2 geschrieben!

    Ich nutze zum Programmieren die IP-Schnittstelle des Wiregate. Die Gruppenadressen habe ich bewusst nicht importiert (deshalb der decode-Befehl).

    Den else-Anweisungsblock habe ich auskommentiert, um Fehler zu minimieren, sollte später aber auch laufen.

    Bei der abschließenden geschweiften Klammer der 2. if-Anweisung (ist ja ein if innerhalb eines if) habe ich probehalber danach einen Strichpunkt gesetzt. Plugin wird ausgeführt, Ergebnis ist aber das gleiche.

    Ich stehe auf Kriegsfuß mit Perl. Wer erbarmt sich meiner?

    Gruß Harald
    Angehängte Dateien

    #2
    Hallo Harald

    Ich sehe den Fehler schon Du machst in der IF abfrage eine Zuweisung und keine Überprüfung.

    Richtig wäre ==

    also

    if ($szenennummer == 6)
    übrigens solltest du neben der GA noch überprüfen ob es tatsächlich ein Schreibtelegramm und nciht etwa ein Antworttelegramm ist. Das würde dann so aussehen...


    Code:
    if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq '8/0/6') {
    Gruss Patrik alias swiss

    Kommentar


      #3
      Hoi Patrik

      Cool was Du alles weisst. Das mit dem "Schreibtelegramm und nciht etwa ein Antworttelegramm" mein' ich.
      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


        #4
        Das musste ja kommen

        Ich wollte es nur erwähnt haben, da ich es so in der Form in Harald's beispiel nicht gesehen haben. Wäre aber auch nicht soo tragisch solange es nur 2-3 Plugins sind die Telegramme mehrfach versenden. Muss aber nicht sein
        Gruss Patrik alias swiss

        Kommentar


          #5
          Hoi

          Nee wirklich, ich hab' das bisher nirgends gesehen und daher bis jetzt in mein copy-paste-Universum nicht eingebaut.
          Du hast heimlich gelernt, gib's zu
          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


            #6
            Hallo Patrik,

            habe = durch == ersetzt. Jetzt wird die Adresse 6/0/2 gar nicht mehr auf den Bus geschrieben. Was ist denn noch alles falsch?

            Harald

            Kommentar


              #7
              Na dann freue ich mich wenn ich wieder jemandem was beibringen durfte

              Das habe ich von makki gelernt. Mir dient immer wieder das kleine alarmplugin als Vorlage da es sehr gut kommentiert und aufgebaut ist.

              Ist jetzt zwar etwas OT aber es ist wirklich gut kommentiert:

              Code:
              # Eigenen Aufruf-Zyklus auf 1T setzen
              $plugin_info{$plugname.'_cycle'} = 86400; 
              # Zyklischer Aufruf nach restart und alle 86400 sek., dient dem anmelden an die Gruppenadresse, einmalig (0) würde in diesem Fall auch genügen
              
              my $scharf_ga = "6/0/0";
              my $allowed_pa = "1.1.48";
              my $alarm_ga = "6/1/0";
              ### Ende Definitionen
              
              if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $scharf_ga) {
              # $msg{'..'} ist nur mit Telegrammdaten gefüllt, wenn der Aufruf durch ein angemeldetes (plugin_subscribe) Telegramm erfolgte.
              # $msg{'apci'} eq "A_GroupValue_Write" stellt sicher, das es nur bei einem Schreibtelegramm ausgeführt wird (nicht _Read oder _Response)
              # $msg{'dst'} eq $scharf_ga -> nur bei dieser GA - falls z.B. mehrere GA's subscribed wurden kann man so unterscheiden
                 if ($msg{'src'} ne $allowed_pa) {
                    # prüft ob physikalische Quelladresse = Vorgabe -  "ne"  negiert das (= if not)
                    # böser Bube hat von falscher Quelladresse gesendet
                    knx_write($alarm_ga,1,1); # schreibe 1 als DPT 1 auf GA
                 }
              } else { # zyklischer Aufruf
                 # Plugin an Gruppenadresse "anmelden", hierdurch wird das Plugin im folgenden bei jedem eintreffen eines Telegramms auf die GA aufgerufen und der obere Teil dieser if-Schleife durchlaufen
                 $plugin_subscribe{$scharf_ga}{$plugname} = 1;
              }
              
              return;
              # verfügbare Daten in %msg:
              # $msg{'repeated'} 0/1
              # $msg{'sequence'} 0-xxx
              # $msg{'buf'} Rohdaten LPDU 
              # $msg{'src'} Quelladresse 
              # $msg{'tpdu_type'} T_DATA_XXX_REQ
              # $msg{'data'} rohe Telegrammdaten
              # $msg{'rcount'} Routing-Zähler
              # $msg{'apci'} A_GroupValue_Write,A_GroupValue_Read,A_GroupValue_Response (u.v.m)
              # $msg{'class'} low/alarm/high/system
              # $msg{'dst'} Zieladresse x/y/z
              # $msg{'datalen'} Datenlänge
              # $msg{'value'} Dekodierter Klartext-Wert (nur falls ESF importiert!)
              Gruss Patrik alias swiss

              Kommentar


                #8
                habe = durch == ersetzt. Jetzt wird die Adresse 6/0/2 gar nicht mehr auf den Bus geschrieben. Was ist denn noch alles falsch?
                Hallo Harald.

                Ersetze mal das "return;" am Ende durch "return $szenennummer;" und lass es mal ausführen (mit telegramm darauf senden). Mich nimmt es wunder was in der Variabel drinnsteht. Es könnte sein, dass da nicht 6 drinn steht.

                Das Ergebnis siehst du direkt in der Pluginübersicht.
                Gruss Patrik alias swiss

                Kommentar


                  #9
                  Unter Plugin-Info: value 2,4. Da haben wir wohl ein DPT-Problem, der Bursche interpretiert dpt 5 wohl als Prozent. Ich müsste dpt 5.005 haben. Das müsste ich über die Gruppenadresse in der ETS regeln können. Oder braucht der Hager Prozent? Weitere Tests folgen, brauche sicher aber noch euren pfiffigen Input!

                  Harald

                  Kommentar


                    #10
                    Oder probier mal

                    $szenennummer = knx_read($msg{'dst'},0,5.005);

                    Weil ich habe die Methode mit decode_dpt5 noch nie gesehn.
                    Gruss Patrik alias swiss

                    Kommentar


                      #11
                      Zitat von Patholog Beitrag anzeigen
                      Unter Plugin-Info: value 2,4. Da haben wir wohl ein DPT-Problem, der Bursche interpretiert dpt 5 wohl als Prozent. Ich müsste dpt 5.005 haben. Das müsste ich über die Gruppenadresse in der ETS regeln können.
                      Vergleiche nicht mit $msg{'data'} sondern hex($msg{'data'}).

                      Gruss,

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

                      Kommentar


                        #12
                        Ich würde die Variante mit knx_read vorziehen. Das verursacht auf dem BUS keinen Traffic und es ist sichergestellt, dass wirklich der letzte Wert verarbeitet wird. Ist aber bei ausführungszeiten <1sek nicht so relevant.

                        Dazu ist die Decodierung dort schon integriert.
                        Gruss Patrik alias swiss

                        Kommentar


                          #13
                          Wau, das hat funktioniert! Danke!

                          Das mit decode habe ich aus dem Beispiel "Demo_plugin Schwellwertschalter".

                          Das oben diskutierte ..apci.. A_Group_Value.... habe ich in fast jedem Plugin-Beispiel gesehen. Ich werde es auch in diesem Plugin einbauen, die Cracks werden schon genau wissen, warum. Für die Fehlersuch habe ich es nur eliminiert.

                          Danke Patrik! Muss jetzt aber Fußball schauen. Dann weitere Versuche, vermutlich mit weiterem Lehrgeld!

                          Harald

                          Kommentar


                            #14
                            Gern geschehen Dafür ist das Forum ja da
                            Gruss Patrik alias swiss

                            Kommentar


                              #15
                              knx_read mit dpt 1

                              Jetzt geht alles perfekt, habe die knx_read-Lösung genommen. Weil ich die Gruppenadressen nicht importiert habe, benötige ich für die knx_read- bzw. _write-Anweisungen die DPT-Angabe). Übrigens: weitere Tests haben für DPT1 Folgendes ergeben:

                              1. knx_read(Gruppenadresse,0,1): liefert einen Bool´schen Ausdruck (bzw. Hex-Format?) 00 bzw. 01. Will man diesen Ausdruck z.B. in einer if-Anweisung auswerten, dann muss nach dem Vergleichsoperator ein 00 bzw 01 stehen, alleine 0 oder 1 geht nicht!
                              Also z.B.:
                              if (knx_read($gruppenadresse,0,1) == 01 ... (analog 00)
                              keinesfalls .... == 1 ... (bzw. 0)

                              2. Für blutige Perl-Anfänger wie mich (danke Patrik für Deine Geduld):
                              als Vergleichsoperator für den Bool´schen Ausdruck muss ich == nehmen (ein alleiniges = bedeutet eine Zuweisung, keinen Vergleich, siehe obige Ausführung). Auch ein eq geht nicht.

                              Gruß

                              Harald

                              PS: if ($msg{'apci'} eq "A_GroupValue_Write" .... habe ich jetzt in mein Plugin implementiert. Damit reagiert das Plugin nur noch auf die subskribierte GA, wenn auf diese GA geschrieben wurde. Für Tests, in denen ich im Gruppenmonitor GA´s auch mal aktiv auslese, ist das ganz hilfreich, weil sonst auch das entsprechende Plugin loslegen würde. Für den Alltag erschließt sich mir allerdings kein sinnvoller Nutzen, weil doch auf die GA´s immer aktiv nur geschrieben wird und nur passiv (mit-)gelesen. Naja, ich mach´s mal schön brav bei allen Plugins.

                              Kommentar

                              Lädt...
                              X