Ankündigung

Einklappen
Keine Ankündigung bisher.

Logikprozessor.pl: Fehler in config oder im Code?

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

    [wiregate] Logikprozessor.pl: Fehler in config oder im Code?

    Hallo zusammen,

    ich möchte gerade mit dem Logikprozessor.pl eine (in meinen Augen eigentlich einfache) Regel erstellen: Wenn mind. eine von zwei Türen offen ist, dann sende 1, ansonsten (also beide zu) eine 0.
    In der config steht
    Code:
        oderTuer1 => { receive=>['5/0/40','5/0/45'], transmit=>'5/0/49', translate => sub { $input->[0] or $input->[1]; }, debug=>1 },
    • mache ich Tür 1 (5/0/40) auf (1) und zu (0), wird auch 5/0/49 zu 1 bzw. 0 (also alles OK)
    • mache ich Tür 2 (5/0/45) auf (1), bleibt 5/0/49 auf 0
    • mache ich dann noch Tür 1 auf, passt's wieder (1)

    Irgendwie führt also der Wechsel von 0 auf 1 bei der 2. Adresse nicht dazu, dass die Bedingung neu überprüft und der entsprechende Wert gesendet wird. Wenn ich die beiden Adressen vertausche, habe ich die gleiche Situation, nur eben mit vertauschten Türen.

    Hat mir jemand eine schnelle Abhilfe? Oder zumindest eine Erklärung?

    Dankeschön schon mal...
    CU,
    Mathias

    #2
    Nachtrag:
    auch mit der in der config als Beispiel enthaltenen "und"-Funktion gibt's (bei mir) ein Problem:
    • Tür 1 auf -> 5/0/49: 0
    • Tür 2 auch noch auf: Wechsel auf 1
    • Tür 2 wieder zu: bleibt auf 1

    Mache ich im letzten Step statt Tür 2 die Tür 1 zu, kriege ich wieder die korrekte 0

    Hier führt also wohl der Wechsel an der 2. Adresse von 1 zu 0 nicht zur Neubewertung...
    CU,
    Mathias

    Kommentar


      #3
      Das klingt nach dem gleichen Problem, dass ich mit der einfachen UND-Logik habe. Schau mal, ob im plugin log eine Meldung kommt "nichts zu senden", wenn er eigentlich eine 1 senden müsste....

      Ciao, PP

      Kommentar


        #4
        Logfile ist ein gutes Stichwort:

        Tür 1 auf/zu (korrekt):
        Code:
        2013-12-12 18:30:26.540,Logikprozessor.pl,1.1.137 5/0/40:1 -> $logic{oderTuer1}{receive}(Logik) -> 5/0/49:1 gesendet ,0s,
        2013-12-12 18:30:28.153,Logikprozessor.pl,1.1.137 5/0/40:0 -> $logic{oderTuer1}{receive}(Logik) -> 5/0/49:0 gesendet ,0.3s,
        Tür 2 auf/zu (falsch):
        Code:
        2013-12-12 18:33:35.488,Logikprozessor.pl,1.1.137 5/0/45:1 -> $logic{oderTuer1}{receive}(Logik) -> 5/0/49:0 gesendet ,0.3s,
        2013-12-12 18:33:36.464,Logikprozessor.pl,1.1.137 5/0/45:0 -> $logic{oderTuer1}{receive}(Logik) -> 5/0/49:0 gesendet ,0s,
        Es wird also fälschlicherweise eine 0 geschrieben, wenn Tür 2 eine 1 sendet :-(
        CU,
        Mathias

        Kommentar


          #5
          Ich hatte mal kurz das gleiche Problem (bei mir im Fensterstatus, mit gleichem Hintergrund). Ich kann leider erst zuhause nachschauen, weiß aber sicher, dass es dort läuft.

          Versuch evtl mal:
          Code:
              oderTuer1 => { receive=>['5/0/40','5/0/45'], transmit=>'5/0/49', translate => sub { $input->[0] || $input->[1]; }, [URL="http://redaktion.knx-user-forum.de/lexikon/debug/"]debug[/URL]=>1 },
          Hier dürfte die Erklärung für deinen Fehler sein:
          What is the difference between Perl's ( or, and ) and ( ||, && ) short-circuit operators? - Stack Overflow

          Grüße
          Guste

          Kommentar


            #6
            Bitte versucht einfach mal statt $input->[0] zu schreiben int($input->[0]).
            Gleiches für $input->[1].
            Außerdem statt or lieber ||.

            Außerdem unbedingt dafür sorgen, dass die DPTSubIds aller benutzten GAs korrekt in /etc/wiregate/eibga.conf eingepflegt sind.

            Wenn es dann immer noch nicht funktioniert: bitte dafür sorgen, dass die beiden receive-Adressen zyklisch gesendet werden, damit die Werte im Cache sind. Versuchsweise mal relativ häufig senden.

            Wenn es dann immer noch nicht klappt: Congratulations, you have found a bug. Bitte wieder melden.

            Have fun,
            Fry

            PS. Ich poste mehr bei den Code-Schnipseln, weil dieses das offizielle Supportforum ist, das von der Herstellerfirma des WG betrieben wird.
            (wobei die Moderation hier eher lockerer ist als dort, aber -> anderes Thema).

            Kommentar


              #7
              Hallo zusammen,

              danke für die Hinweise - werde ich die Tage testen und dann hier berichten.
              Jetzt ist erst mal Feier-Marathon angesagt
              CU,
              Mathias

              Kommentar


                #8
                So, hier bin ich wieder:

                im Code habe ich das "or" durch "||" ersetzt:
                Code:
                oderTuer1 => { receive=>['5/0/40','5/0/45'], transmit=>'5/0/49', translate => sub { $input->[0] || $input->[1]; }, debug=>1 },
                Die DPTs für alle beteiligten Adressen sind im WG als 1.001 definiert.

                Bis hierher keine Verbesserungen. Anbei noch ein Auszug aus dem Busmonitor:
                Tür 1 (5/0/40) auf/zu: s. Anhang "Tuer1" (alles gut)
                Tür 2 (5/0/45) auf/zu: s. Anhang "Tuer2" (nicht gut; sendet auch bei "Tür auf" eine 0)

                Ich teste dann mal weiter....
                Angehängte Dateien
                CU,
                Mathias

                Kommentar


                  #9
                  Und noch 'n Ergebnis:

                  nach einem Neustart des Plugins wird bei Änderung der Tür2 korrekterweise der Status von Tür1 (0) vom Plugin abgefragt und auch korrekt beantwortet. Dann aber wird 0 zurückgegeben, obwohl Tür2 auf 1 steht.
                  Tür 1 auf/zu arbeitet nach wie vor korrekt.
                  Probleme mit dem Cache können es also nicht sein, zumal das auch bei wiederholtem Öffnen/Schließen immer wieder gleich auftritt.

                  Code wurde wie von Fry angeregt geändert:
                  Code:
                  oderTuer1 => { receive=>['5/0/40','5/0/45'], transmit=>'5/0/49', translate => sub { int($input->[0]) || int($input->[1]); }, debug=>1 },
                  Angehängte Dateien
                  CU,
                  Mathias

                  Kommentar


                    #10
                    Diesen Effekt habe ich in meinen Logiken auch. Es wird nur auf die erste
                    GA getriggert. Eine Änderung der zweiten GA löst die Logik nicht aus.
                    Ich habe das bei mir nur so lösen können dass ich diese Logiken inzwischen
                    auf dem Raspberry Pi mit Smarthome.py laufen lasse.

                    Kommentar


                      #11
                      Hi,

                      sieht im Busmonitor aber anders (bei mir) aus:
                      egal, welche Tür ich aufmache: die andere wird abgefragt - so weit, so gut...
                      Nur ist das Ergebnis im ersten Fall (1 || 0 => 1) richtig, im zweiten Fall falsch (0 || 1 => 0)
                      CU,
                      Mathias

                      Kommentar

                      Lädt...
                      X