Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Naja - jetzt basteln wir aber ein bißchen viel, um eine einfache Treppenlichtfunktion hinzubekommen
    Für mich persönlich habe ich ja nun eine Lösung für das obige Beispiel.

    Spannender für mich (evtl. auch andere) wäre ja nun die Frage: hab ich hier einen Bug gefunden (aktuelles Verhalten ist ungleich der Doku)?
    Und falls ja - reicht dieser Thread für die Verfolgung oder gibt es einen anderen Weg wie Bugs zum Logikprozessor geordnet gesammelt werden?

    Bin heute gleich über das nächste Problem gestolpert:
    Die Timer funktionieren auch nicht so, wie ich es von der Doku erwartet hätte. Wenn es keinen Bustraffic gibt auf den der Logikprozessor hört, passiert es, dass Timer nur verspätet aufgerufen werden. Vermutlich fällt das bei Leuten mit voll gefüllten Logiken nicht auf.
    Bei meiner jungfreulichen Logik mit nur zwei Einträgen aber eben doch.

    Als konkretes Beispiel die folgende Logik.
    Zu einem definierten Zeitpunkt (im Beispiel für Testzwecke jede Minute) wird geprüft, ob eine GA gesetzt ist.
    Falls ja, soll die GA zur gewünschten Uhrzeit zurückgesetzt werden sonst nichts passieren.

    Code:
    # wenn einmalige Sperre aktiviert, dann zum gegebenen Zeitpunkt die einmalige Sperre zurücksetzen.
    # über die Logik "einmalige_sperre_bewaesserung_uebertragen" wirkt sich das ganze auch auf die Hauptsperre aus
    einmalige_sperre_bewaesserung_loesen => {
      fetch => '15/2/0',
      transmit => '15/2/0',
      timer=>{ time=>['09:00+1m-23:30'], },
      translate => sub {
        plugin_log($plugname, "Timer tatsächlich aufgerufen");
        return ($input eq 1) ? 0 : undef;
      }, 
      debug => 1
    }
    Wenn auf GA 15/2/0 regelmäßig etwas passiert, wird auch der Timer zur korrekten Zeit aufgerufen.
    Man sieht auch in der Plugin-Übersicht, dass der "Aufrufzyklus" definiert ist.

    Wenn aber der Timer "undef" zurückgibt, und dann auf den GAs des Logikprozessors in der nächsten Minute nichts mehr passiert, kommt der Logikprozessor durcheinander:
    - die Cycle-Time für das Plugin ist nicht mehr gesetzt (die nächste Ausführung also nicht mehr garantiert)
    - Die Variable "Logikprozessor.pl__einmalige_sperre_bewaesserung_l oesen_timer" ist aber immer noch (zunächst) ohne Effekt gesetzt. Eigentlich will der Logikprozessor die Logik also zur korrekten Zeit ausführen.

    Wenn jetzt irgendwann später auf der GA 15/2/0 doch eine 1 gesetzt wird, wacht der Logikprozessor auf.
    Dann stellt der Logikprozessor fest, dass der Timer längst überfällig ist und führt nun meine Logik zur völlig falschen Zeit aus. Mit der oben definierten Logik wird meine 1 auf GA 15/2/0 sofort wieder auf 0 zurückgestellt, was nicht Sinn der Erfindung war.
    Autor der SonoPhone, SonoPad und SqueezePad Apps.

    Kommentar


      Das neuere Timer Problem konnte ich im Quellcode des Logikprozessors finden und fixen.
      Siehe Pull-Request.
      https://github.com/OpenAutomationPro...iregate/pull/2

      Mein Timer wird nun robust und regelmäßig aufgerufen.
      Autor der SonoPhone, SonoPad und SqueezePad Apps.

      Kommentar


        ich sehe das mit der Treppenlichtfunktion nicht als Bug an... Wenn Du gleiche receive und transmit Adresse hast ist das für mich alles logisch korrekt. Mit receive triggerst Du die Logik immer wieder selbst sobald die 5s ablaufen und Du die 0 sendest.

        Lös es mit trigger=>'15/2/0==1' anstatt des receive und es sollte alles wie gewünscht laufen, da dann die Logik auch nur läuft wenn eine 1 zum Resetieren über Dein Delay anliegt/gesendet wurde.

        Aber wenn meine Hilfe nicht mehr gewünscht ist und das nur gebastel ist lassen wir das einfach so stehen
        Gruß
        Andi

        Kommentar


          ach und dann natürlich noch eine Frage: Hast Du die $eibd_backend_address am Anfang Deiner Config korrekt gesetzt?
          Gruß
          Andi

          Kommentar


            Zitat von tger977 Beitrag anzeigen
            ich sehe das mit der Treppenlichtfunktion nicht als Bug an... Wenn Du gleiche receive und transmit Adresse hast ist das für mich alles logisch korrekt. Mit receive triggerst Du die Logik immer wieder selbst sobald die 5s ablaufen und Du die 0 sendest.
            Das verhalten ist in gewisser Weise nachvollziehbar, entspricht aber nicht der Doku des Logikprozessors:

            Hier die relevanten Ausschnitte (es wird sogar die gleich receive+transmit Adresse verwendet):
            Code:
                # 5. Hier eine "Treppenlichtfunktion". Auf jeden Schreibzugriff auf die receive-Adresse wird 10min spaeter eine 0 an 
                # die transmit-Adresse (hier gleich) geschickt. 
                stair => { receive=>'1/2/9', transmit=>'1/2/9', delay=>600, translate => 0, },
                # Verzoegert wird uebrigens nur das Senden, nicht das Ausfuehren der translate-Routine. 
                # Neu ist hier der "delay"-Parameter, ausserdem der Spezialfall, dass translate einfach eine Konstante 
                # als Rueckgabewert spezifiziert.
                
                # Weitere Bemerkungen:
                # * translate darf nur entweder eine Konstante oder ausführbarer Code (sub {...}) sein.
                # * [B][COLOR=#FF0000]Damit im Fall transmit==receive der Translator nicht auf sein eigenes Schreibtelegramm immer wieder antwortet, 
                # wird nur dann gesendet, wenn Ergebnis!=Input oder Sender des empfangenen Telegramms!=$eibd_backend_address (Wiregate).[/COLOR][/B]
            Wenn ich also eine 0 raussende, sollte nicht in einer Endlosschleife weiter eine 0 gesendet werden.

            In meinem initialem Beispiel habe ich sogar
            transmit_changes_only =>1 ergänzt.

            Insofern ist es entweder
            - ein Verständnisfehler/Konfig-Fehler meinerseits
            - ein Fehler in der Logik-Engine oder
            - ein Fehler in der Doku ?

            Code:
            $eibd_backend_address='1.1.254'; # eigene Adresse zur Vermeidung von Zirkellogiken, ist oft auch '1.1.254'
            habe ich auch in meinem Config-File zu stehen.

            Aber wenn meine Hilfe nicht mehr gewünscht ist und das nur gebastel ist lassen wir das einfach so stehen
            Vielen Dank für den Vorschlag des Workarounds, das hilft (mir) auf alle Fälle weiter.
            Ich sorge mich nur um alle die nach mir folgen, einen 50 Seiten langen Thread nicht durchlesen und viel früher gefrustet aufgeben, weil sie bei zunächst trivialen Logikfunktionen nicht zum gewünschten Ergebnis kommen. Gefrustete Menschen wechseln über zu Homeservern und SmartVisus, dass wollen wir ja nicht

            Autor der SonoPhone, SonoPad und SqueezePad Apps.

            Kommentar


              Hallo zusammen,

              ich versuche immer noch zwei Logiken insofern zu verbinden, dass wenn Logik "A" ausgeführt worden ist Logik "B" für Zeit x gesperrt ist. Jemand eine Idee wie sowas gehen würde?

              Danke & Gruß,
              Hannatz

              Kommentar


                Zitat von Hannatz Beitrag anzeigen
                Hallo zusammen,

                ich versuche immer noch zwei Logiken insofern zu verbinden, dass wenn Logik "A" ausgeführt worden ist Logik "B" für Zeit x gesperrt ist. Jemand eine Idee wie sowas gehen würde?

                Danke & Gruß,
                Hannatz
                Hm. Also ich glaube nicht, dass der LP das so unterstützt. Ich befürchte du müsstest in Logik A zusätzlich prüfen ob die Bedingung für Logik B erfüllt ist oder nicht (und vice versa) und entsprechend reagieren. So zB:

                Code:
                #    Ausschalten bei Zuluft > Abluft
                    CWL300_Zuluft_Abluft => {
                      receive => ['3/5/202','3/5/203'],
                      fetch => '3/5/200',
                      transmit => '3/5/72',
                      translate => sub { return 1 if (($input->[0] > $input->[1]) && $input[2] > $einschalttemp); return undef;},
                      cool=>600,
                      debug=>1 },
                VG
                Micha

                Kommentar


                  Hallo zusammen,

                  ich glaube, ich habe beim Logikprozessor (Version vom 1. Juli 2015 aus Git, getestet auf einem Wiregate v1.2) einen Bug in Zusammenhang mit delay-Statements entdeckt.

                  Nehmen wir folgenden Code als Beispiel:

                  Code:
                      # Licht geht an
                      [B]aussen_sued_timer[/B]    => {
                          receive        => '3/2/10',
                          transmit    => ['3/2/11','3/2/12'],
                          cool        => 1,
                          translate    => sub {
                              plugin_log($plugname, "aussen_sued_timer: ".$input);
                              if ( defined $input && int($input) == 1 )
                                  { return 1; }
                              else
                                  { return undef; }
                          },
                          debug        => 1,
                      },
                      # Licht geht nach 2 Minuten automatisch wieder aus (Treppenlichtfunktion)
                      [B]aussen_sued_timer_delay[/B] => {
                          receive        => '3/2/10',
                          transmit    => ['3/2/11','3/2/12'],
                          delay        => '120',
                          reply_to_read_requests => 1,
                          translate    => sub {
                              if ( defined $input && int($input) == 1 )
                                  { return 0; }
                              else
                                  { return undef; }
                          },
                          debug        => 1
                      },
                  Beim aussen_sued_timer_delay wird nach Ablauf der delay-Zeit nichts hinterher gefeuert, die Treppenlichtfunktion versagt also.

                  Ändere ich den Namen der Funktion jedoch von aussen_sued_timer_delay auf delay_aussen_sued, und lasse alles andere unverändert, dann funktioniert alles wunderbar.

                  Der Logikprozessor scheint also nicht damit zurecht zu kommen, dass der Funktionsname mit denselben String beginnt.
                  "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

                  Kommentar


                    Zitat von mivola Beitrag anzeigen

                    Hm. Also ich glaube nicht, dass der LP das so unterstützt. Ich befürchte du müsstest in Logik A zusätzlich prüfen ob die Bedingung für Logik B erfüllt ist oder nicht (und vice versa) und entsprechend reagieren. So zB:
                    (...)
                    VG
                    Micha
                    Hi Micha,

                    danke für Deinen Hinweis, hatte fast sowas befürchtet...
                    Das macht leider die Programmierung für einen Nicht-Entwickler etwas komplexer, insofern fände ich das eine sehr sinnvolle Erweiterung. Ich werd mich die Tage mal daran setzen das in meiner conf umzusetzen, hoffe mit Deiner "Starthilfe" komme ich aus.

                    Danke & Gruß,
                    Hannatz

                    Kommentar


                      Hi, ich bin gerade auch bei den ersten Versuchen mit dem tollen Plugin, jedoch habe ich bei folgender Logik ein Problem:

                      Code:
                      EZWaldSperren => { receive=>['14/0/40','7/1/1'], fetch=>'6/3/3', transmit=>'6/3/3', translate => sub { (int($input->[0]) && !int($input->[1])) ? 1 : 0 }, debug=>1 },
                      Die Adressen sind all vom DPT typ 1.001.
                      Ziel der Logik ist die Jalousie zu sperren (6/3/3 -> 1) (und dementsprechend hoch zu fahren) wenn das Fenster geöffnet (7/1/1 -> 0) wird. 14/0/40 ist ein globaler "Schalter" um dieses Sperren über den Fenstergriff zu erlauben.

                      Nun funktioniert die Logik aber nicht immer. Meistens geht es erst beim 2. mal öffnen (also: auf -> zu -> auf), so wie hier:

                      Code:
                       
                       2015-07-05 18:35:50.191,Logikprozessor.pl,1.1.50 7/1/1:0 -> $logic->{EZWaldSperren}{receive}(Logik) -> 6/3/3:0 gesendet;  ,0.9s, 2015-07-05 18:35:53.858,Logikprozessor.pl,1.1.50 7/1/1:1 -> $logic->{EZWaldSperren}{receive}(Logik) -> 6/3/3:0 gesendet;  ,0s, 2015-07-05 18:35:55.313,Logikprozessor.pl,1.1.50 7/1/1:0 -> $logic->{EZWaldSperren}{receive}(Logik) -> 6/3/3:1 gesendet;  ,0s, [COLOR=#111111][FONT=Arial][SIZE=15px][/SIZE][/FONT][/COLOR]
                      Hat vielleicht jemand eine Idee wieso ich die Logik 2x auslösen muss damit der korrekte Wert übermittelt wird?

                      Danke,

                      Emmanuel

                      Kommentar


                        Zitat von wuestenfuchs Beitrag anzeigen
                        Hallo zusammen,

                        ich glaube, ich habe beim Logikprozessor (Version vom 1. Juli 2015 aus Git, getestet auf einem Wiregate v1.2) einen Bug in Zusammenhang mit delay-Statements entdeckt.
                        [...]
                        Beim aussen_sued_timer_delay wird nach Ablauf der delay-Zeit nichts hinterher gefeuert, die Treppenlichtfunktion versagt also.
                        Das Problem habe ich gerade auch. Bei mir heißen die Logiken
                        test_delay_1
                        test_timer_3

                        und ich habe nun zwei Tage lang gesucht, woran es liegen könnte. Konkret gibt es eine Codestelle, welche Fehlerhaft die "*_result" Variablen löscht, wenn in deren Namen irgendwo ein "*_delay*" vorkommt.

                        Versuche es mal mit folgender Version des Logikprozessor, wo ich das Problem gelöst habe.
                        https://github.com/bluegaspode/Wireg...ikprozessor.pl
                        Autor der SonoPhone, SonoPad und SqueezePad Apps.

                        Kommentar


                          Zurück zu einem anderen meiner Probleme:

                          Zitat von bluegaspode Beitrag anzeigen
                          Mit leicht abgewandelter Logik (transmit_changes_only ergänzt) funktioniert es aber auch nicht.
                          Code:
                          sperre_bewasserung_12h => { receive=>'15/2/0', transmit=>'15/2/0', translate => 0, delay => '5s', reply_to_read_requests=>1, transmit_changes_only =>1, debug=>1},
                          Der Transmit wird nun verschluckt, obwohl Ergebnis!=Input.
                          Code:
                          2015-06-24 01:53:46.726,Logikprozessor.pl,1.1.254 15/2/0:1 -> $logic->{sperre_bewasserung_12h}{receive}(Logik) -> 15/2/0:0 wird in 5s gesendet; ,0s,
                          [... keine weiteren Log-Einträge ...]
                          Kann mir hier jemand weiterhelfen?
                          Mal davon abgesehen, dass ich zum damaligen Zeitpunkt "transmit_changes_only" völlig falsch verstanden haben (macht nämlich keinen Sinn, wenn die Logik immer konstant eine 0 zurückliefert), ist/war der Logikprozessor hier fehlerhaft.
                          "transmit_changes_only" hat nämlich nie in Zusammenhang mit einem delay funktioniert.

                          Wer es nachvollziehen will nehme folgenden Code-Stand: https://github.com/OpenAutomationPro...ikprozessor.pl

                          Ab Zeile 825 werden delays + timer ausgewertet.
                          In Zeile 852+853 werden zunächst $result und $prevResult mit dem zuletzt gespeicherten Wert vorbelegt (sind damit zunächst gleich).
                          In Zeile 857 werden für alle Timer-Logiken (außer delays) das $result neu bestimmt
                          In Zeile 874 wird transmit_changes_only ausgewertet. Bei delays ist $result aber immernoch $prevResult und somit wird hier nie etwas ausgeführt.

                          Generell find ich das lange if-Statement in Zeile 873/874 überarbeitungsbedürftig. Die Abfrage ist sehr mächtig - und wenn sie fehlschlägt, dann leider ohne Log-Ausgabe.
                          In meinem Fork (https://github.com/bluegaspode/Wireg...ikprozessor.pl) wurde das if-Statement in seine einzelne Bestandteile zerlegt und mit den Log-Ausgaben versehen, welche es auch für normale Logiken gibt. Das hilft deutlich besser zu verstehen, wenn timer-Logiken auslösen (bzw. warum auch nicht).

                          Last but not Least. Für meine Überarbeitung habe ich diverse "Test-Cases" geschrieben. Ich habe leider keine Idee, wo man diese unterbringen sollte, daher zunächst hier gepastet. Würde mich über Vorschläge freuen, wo man diese Configs sinnvoll im Repository hinterlegen kann?

                          Code:
                          # Testinhalt: Standardverhalten von 'timer'
                          # erwartetes Resultat: diverse regelmäßige Einträge im Log, dass der Wert gesendet wurde
                          test_timer_1 => {
                            fetch => '15/5/0',
                            transmit => '15/5/0',
                            timer=>{ time=>['09:00+1m-23:55'], },
                            translate => sub {
                              return 1;
                            }, 
                            debug => 1
                          },
                          
                          # Testinhalt: 'timer' in Verbindung mit der Rückgabe von 'undef'
                          # erwartetes Resultat: diverse Einträge im Log, dass kein Wert gesendet wurde
                          test_timer_2 => {
                            fetch => '15/5/1',
                            transmit => ['15/5/1','15/5/2'],
                            timer=>{ time=>['00:05+1m-23:55'], },
                            translate => sub {
                              return undef;
                            }, 
                            debug => 1
                          },
                          
                          # Testinhalt: 'transmit_only_on_requests' in Verbindung mit 'timer'
                          # erwartetes Resultat: diverse Einträge im Log, dass der Wert nur gespeichert wurde
                          # plugin_Variable "*_result" für den gespeicherten 'transmit' Wert muss gesetzt sein
                          test_timer_3 => {
                            transmit => '15/5/3',
                            timer=>{ time=>['00:05+1m-23:55'], },
                            transmit_only_on_request=>1,
                            translate => 1, 
                            debug => 1
                          },
                          
                          # Testinhalt: 'transmit_changes_only' in Verbindung mit 'timer'
                          # erwartetes Resultat: ein Eintrag für das Versenden des Werts, danach nur Einträge, dass es keine weiteren Änderungen gibt
                          test_timer_4 => {
                            transmit => ['15/5/4','15/5/5'],
                            timer=>{ time=>['00:05+1m-23:55'], },
                            transmit_changes_only =>1, 
                            translate => 0, 
                            debug => 1
                          },
                          
                          
                          # Testinhalt: 'transmit_changes_only' in Verbindung mit 'delay'
                          # erwartetes Resultat: wiederholt den empfangenen Wert auf 2ter GA (allerdings nur, wenn er sich ändert)
                          test_delay_1 => { 
                             receive=>'15/6/1', 
                             transmit=>'15/6/2', 
                             translate => sub {$input}, 
                             delay => '5s', 
                             transmit_changes_only =>1, 
                             debug=>1
                          },
                          Autor der SonoPhone, SonoPad und SqueezePad Apps.

                          Kommentar


                            Zitat von bluegaspode Beitrag anzeigen
                            Last but not Least. Für meine Überarbeitung habe ich diverse "Test-Cases" geschrieben. Ich habe leider keine Idee, wo man diese unterbringen sollte, daher zunächst hier gepastet. Würde mich über Vorschläge freuen, wo man diese Configs sinnvoll im Repository hinterlegen kann?
                            mMn gehört das inkl. einer kurzen Anleitung ins git, zb: https://github.com/mivola/Wiregate/b...ssor.conf_test

                            VG
                            Micha

                            Kommentar


                              Hallo zusammen,
                              nach einiger Zeit lese ich hier auch wieder mal. @bluegaspode: danke für deine Änderungen (jetzt muss ich nur noch rausfinden, wie ich die merge, bin in Github noch unerfahren). Ich gehe mal davon aus, dass du deinen Fork des Logikprozessors in den Hauptzweig übernommen haben willst...
                              Soweit ich das beim kruden Durchblättern überblicke, sind vor allem Bugfixes gemacht worden. Ein Hinweis von meiner Seite: wenn durch einen dieser Bugfixes das Verhalten des LP verändert wird, sollte explizit darauf hingewiesen werden.

                              Das betrifft zB den Fall receive==transmit. Ohne "delay" macht das wenig Sinn und wird vom LP abgefangen in der Weise, dass er versucht eine Endlosschleife zu vermeiden. Mit "delay" hat das eine (sogar häufige) Anwendung, nämlcih als "Repeater" für Zustände von Aktoren, die ihren Zustand nicht regelmäßig senden können. Das ist zB bei mir so für die Stellwerte der Heizungsventile.

                              Deshalb eine Bitte von meiner Seite: bevor das Verhalten des LP verändert wird, bitte erstmal hier nachfragen, ob es jemand so braucht.

                              Viele Grüße,
                              Fry

                              Kommentar


                                Alle Commits von bluegaspode sind gemergt. Danke.
                                Jetzt teste ich das live und schau mal bei meinem Zuhause (1270 Logiken), ob irgendwas jetzt nicht mehr funktioniert....
                                VG, Fry

                                Kommentar

                                Lädt...
                                X