Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

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

    Zitat von Fry Beitrag anzeigen
    Gerne!
    OK, ich habe einen Pull Request erstellt: https://github.com/OpenAutomationPro...iregate/pull/1. Das ist meine erster - Ist das so korrekt?
    Wer kann/darf/sollte diesen jetzt mergen?

    VG
    Micha

    Kommentar


      Hallo Fry,
      ich brauch leider wieder mal ein "Schubser" in die richtige Richtung, folgendes Problem:

      Ich will meine KWL anhand dreier Temperatur-GAs
      1. Zuluft (ZU)
      2. Abluft (AB)
      3. Außentemperatur (AU)
      und zweier Konstanten
      1. Hystere" (HY)
      2. Einschalt-Temperatur (EIN)
      steuern, letztendlich ist die Logik recht simpel:

      IF (ZU > (AB + HY)) THEN Lüftung_Stufe_0 = 1 ELSE undef
      IF (AU < EIN) THEN Lüftung_Stufe_0 = 0 ELSE undef

      Langfristig kann man hier sicherlich noch ein paar weitere Sachen einbauen, aber um erst einmal ganz rudimentär das Ding zu steuern reicht diese Logik zunächst aus (da ich kein anderes, passendes Plugin gefunden habe)...

      Meine Fragen:
      • Letztendlich ist es ja besser das Ergebnis jedesmal bei einer Änderung von einer der drei Temperatur-GAs zu berechnen, aber nur bei Eintreffen der Bedingung die Aktion auf den Bus zu schreiben, muß ich dafür dann "transmit_changes_only" verwenden?
      • Wie definiere ich den Vergleich der Temperaturen? Sowas wie "{ receive=>'ZU','AB', transmit=>'Lüftung_Stufe_0', translate => sub { ZU > (AB + HY) },
      Sorry wenn die Fragen etwas "blöd" sind, aber ich steh gerade etwas auf dem Schlauch wie ich beginnen soll...

      Danke & Gruß,
      Hannatz

      Kommentar


        Hab noch mal ein wenig rumgebastelt und denke die Richtung ist so schon mal ok, aber irgendwie ist da noch ein Syntaxfehler drin:

        Code:
        #    Lüfterungssteuerung
        #    Ausschalten bei Zuluft > Abluft
            Zuluft>Abluft => {
              receive => ['3/5/202','3/5/203']
              transmit => '3/5/72',
              translate => sub { return 1 if $input->[0] > $input->[1]; return undef;}, debug=>1 },
              
        #    Einschalten bei Aussenluft < 19°C
            Aussenluft<19C => {
              receive => '3/5/200'
              transmit => '3/5/72',
              translate => sub { return 1 if $input < 19; return undef;}, debug=>1 },
        Als Fehlermeldung kommt:
        Code:
           [TABLE="class: ui_table sortable, width: 1768"]
         	 		[TR="class: mainhigh, bgcolor: #FFFFBB"]
         			[TD]config error: syntax error at (eval 163256) line 104, near "] transmit" Can't use global @_ in "my" at (eval 163256) line 105, near "=@_" syntax error at (eval 163256) line 105, near ";}" Can't use global @_ in "my" at (eval 163256) line 111, near "=@_" syntax error at (eval 163256) line 111, near ";}"[/TD]
         		[/TR]
         	 [/TABLE]
        Ziel ist es im ersten Fall auf beide GAs zu horchen und wenn die 202 größer als die 203 ist dann auf der 72 eine 1 zu senden, im zweiten Fall schlicht eine 0 auf die 72 senden wenn 200 < 19 wird.

        By the way, wie definiere ich noch mal eine Konstante? Bspw. könnte ich dann ja anstatt der "19" ein $KWL-Einschalttemp verwenden...

        Danke & Gruß,
        Hannatz

        Kommentar


          Nur auf die Schnelle, bin gerade unterwegs (aus dem Fenster sehe ich die Niagarafälle): ein Logikname wie "Aussenluft<19C" geht nicht wegen des Sonderzeichens.

          Kommentar


            Hi!

            Dein Hinweis sowie das fehlende Komma hinter der "receive" Anweisung waren das Problem, nun läuft das ganz brav. Hab noch ein "cool" hinzugefügt um etwas Pause zwischen den einzelnen Telegrammen zu bekommen, bislang läuft das sehr zufriedenstellend:

            Code:
            #    Lüfterungssteuerung
            #    Ausschalten bei Zuluft > Abluft
                CWL300_Zuluft_Abluft => {
                  receive => ['3/5/202','3/5/203'],                                                                     #horcht auf beide Temp-GAs
                  transmit => '3/5/72',                                                                                    #CWL300 GA für Stufe null
                  translate => sub { return 1 if $input->[0] > $input->[1]; return undef;}, cool=>300, debug=>1 },        #Wenn Wert GA1 > GA2 dann sende "1", sonst nix. Wenn gesendet dann 5 Min Pause
                  
                CWL180_Zuluft_Abluft => {
                  receive => ['3/5/208','3/5/209'],                                                                        #horcht auf beide Temp-GAs
                  transmit => '3/5/76',                                                                                    #CWL180 GA für Stufe null
                  translate => sub { return 1 if $input->[0] > $input->[1]; return undef;}, cool=>300, debug=>1 },        #Wenn Wert GA1 > GA2 dann sende "1", sonst nix. Wenn gesendet dann 5 Min Pause
                  
            #    Einschalten bei Aussenluft < 19°C
                Aussenluft_Einschalttemperatur => {
                  receive => '3/5/200',                                                                                    #horcht auf GA Aussenluft
                  transmit => ['3/5/72','3/5/76'],                                                                        #Stufe null für CWL300 & CWL180 
                  translate => sub { return 0 if $input < 19; return undef;}, cool=>900, debug=>1 },                    #Wenn Wert GA Aussenluft < 19°C dann sende "0", sonst nix. Wenn gesendet dann 15 Min Pause
            Als nächste Schritte werde ich nun eine Unterscheidung zwischen "Automatik" und "Handbetrieb" einbauen und dann die einzelnen Stufen definierter schalten, aber erst einmal ist das Thema durch morgens auf dem Weg zur Arbeit die Lüftung auszuschalten nur weil die Sonne rauskommt... :-)


            Danke noch einmal für das tolle Plugin!!

            Gruß Hannatz

            Kommentar


              Hallo zusammen,

              am WE hab ich noch mal ein wenig gebastelt und versucht, die jeweilig geschaltete Stufe auf eine GA (1/0/210) zu schreiben und damit in ein rrd zu packen. Der Datentyp 5.010 hat mich dabei erst etwas kirre gemacht, aber nach einem Neustart des WGs hat es dann doch ohne Nachkommastellen funktioniert... ;-)

              Hier der Code:
              Code:
              #    Lüfterstufe in GA schreiben
                  CWL300_Stufe_Null => { 
                      receive => '3/5/72', 
                      transmit => '1/0/210', 
                      translate => sub { return 0 if $input == 1; return undef;}, debug=>1 },
                      
                  CWL300_Stufe_Eins => { 
                      receive => ['3/5/72','3/5/71','3/5/74'], 
                      transmit => '1/0/210', 
                      translate => sub { return 1 if  $input->[0] == 0 and $input->[1] == 0 and $input->[2] == 0; return undef;}, debug=>1 },    
                      
                  CWL300_Stufe_Zwei => { 
                      receive => ['3/5/72','3/5/71','3/5/74'], 
                      transmit => '1/0/210', 
                      translate => sub { return 2 if  $input->[0] == 0 and $input->[1] == 1 and $input->[2] == 0; return undef;}, debug=>1 },        
                      
                  CWL300_Stufe_Drei => { 
                      receive => ['3/5/72','3/5/74'], 
                      transmit => '1/0/210', 
                      translate => sub { return 3 if  $input->[0] == 0 and $input->[1] == 1; return undef;}, debug=>1 },
              Da nun aber die Schaltung selber (siehe Post 740) bereits recht viel auf den Schalt-GAs schreibt wird auch diese Auswertung oft durchlaufen und dementsprechend wird sowohl das Plugin-Log (ca. 10-15 Einträge/min) als auch auf dem KNX-Bus (ca. 3-5 Telegramme/min) selber relativ viel geschrieben. Zwar soll der Bus weitaus mehr verkraften können, aber gibt es einen Weg wie ich die beiden Bereiche vielleicht verkürzen/kombinieren kann?

              Danke & Gruß,
              Hannatz

              Kommentar


                das Schreiben vom Logfile kannst Du einfach lösen indem Du debug von 1 auf 0 setzt für die entsprechenden Logiken. Das mache ich immer sobald eine Logik funktioniert...

                Und dann gibt es noch eine Option im LP: execute_on_input_changes_only=>1, vielleicht hilft das in Deinem Fall auch (hab jetzt nicht im Detail mir die ganzen vorherigen Posts durchgelesen um herauszufinden ob die inputs / receive Adressen sich wirklich so häufig ändern oder ob da immer die gleichen Werte zyklisch geschrieben werden. In letzterem Fall sollte die Option helfen...)

                Gruß
                Andi
                Gruß
                Andi

                Kommentar


                  Hi Andi,

                  danke für den Hinweis, das schränkt insbesondere den KNX-Traffic für das Schreiben der Lüfterstufe deutlich ein!
                  Die Temperaturen sende ich eh nur bei Änderung, aber auch wenn ich das Debug rausnehme muß diese Routine ja trotzdem durchlaufen werden. Wo sind so die Grenzen für die Anzahl der Aktionen bzw. Logiken / sec?

                  Was mich noch ein wenig beschäftigt ist die Abhängigkeit zwischen "Lüftung ausschalten" und "Lüftung einschalten". Das sind aktuell zwei getrennte Logiken, aber eigentlich gehört das zusammen! Aktuell kann es passieren, dass die Lüftung aufgrund der ersten Logik ausgeschaltet wird, aber 5s später durch die zweite Logik wieder einschaltet. Andersherum ebenfalls, die Lüftung schaltet wieder ein aber im Kanal ist noch wärmere, abgestandene Luft und diese löst wieder die erste Logik aus.

                  Code:
                  #    Ausschalten bei Zuluft > Abluft
                      CWL300_Zuluft_Abluft => {
                        receive => ['3/5/202','3/5/203'],
                        transmit => '3/5/72',
                        translate => sub { return 1 if $input->[0] > $input->[1]; return undef;},
                        cool=>600,
                        debug=>1 },
                  
                  #    Einschalten bei Aussenluft < 18°C
                      Aussenluft_Einschalttemperatur => {
                        receive => '3/5/200',
                        transmit => ['3/5/72','3/5/76'],
                        timer=>{ time=>['19:00+20m-10:00']},
                        translate => sub { return 0 if $input < $einschalttemp; return undef;},
                        execute_on_input_changes_only=>1,
                        debug=>1 },
                  Es würde ja schon reichen, dass wenn eine der beiden Logiken greift die jeweils andere für die nächsten paar Minuten gesperrt wäre. Mag da noch jemand helfen und nem Programmierer-DAU etwas unter die Arme greifen...

                  Danke & Gruß,
                  Hannatz
                  Zuletzt geändert von Hannatz; 23.06.2015, 22:31.

                  Kommentar


                    Ich starte gerade meine ersten Versuche mit dem Logikprozessor ... komme leider aktuell auch nicht weiter.
                    Und dabei versuche ich nur eine ganze einfache Treppenlichtfunktion auf einer (virtuellen) GA hinzubekommen.

                    Diese GA (15/2/0) habe ich zunächst in der eibga als DPT1.001 angelegt.

                    Gestartet bin ich mit folgender Mini-Logik entsprechend der Doku:
                    Code:
                    sperre_bewasserung_12h => { receive=>'15/2/0', transmit=>'15/2/0', translate => 0, delay => '5s', reply_to_read_requests=>1, debug=>1},
                    Sende ich eine '1' auf die GA, führt dies zu einer Endlosschleife.
                    Code:
                    2015-06-24 01:49:54.472,Logikprozessor.pl,1.1.254 15/2/0:1 -> $logic->{sperre_bewasserung_12h}{receive}(Logik) -> 15/2/0:0 wird in 5s gesendet;  ,0s,
                    2015-06-24 01:50:00.588,Logikprozessor.pl,$logic->{sperre_bewasserung_12h}{transmit}(Logik) -> 15/2/0:0 gesendet (delay);  ,0s,
                    2015-06-24 01:50:01.059,Logikprozessor.pl,(circle logic?)
                    2015-06-24 01:50:01.073,Logikprozessor.pl,1.1.254 15/2/0:0 -> $logic->{sperre_bewasserung_12h}{receive}(Logik) -> 15/2/0:0 wird in 5s gesendet;  ,0s,
                    2015-06-24 01:50:06.335,Logikprozessor.pl,$logic->{sperre_bewasserung_12h}{transmit}(Logik) -> 15/2/0:0 gesendet (delay);  ,0s,
                    2015-06-24 01:50:06.373,Logikprozessor.pl,(circle logic?)
                    2015-06-24 01:50:06.385,Logikprozessor.pl,1.1.254 15/2/0:0 -> $logic->{sperre_bewasserung_12h}{receive}(Logik) -> 15/2/0:0 wird in 5s gesendet;  ,0s,
                    2015-06-24 01:50:11.637,Logikprozessor.pl,$logic->{sperre_bewasserung_12h}{transmit}(Logik) -> 15/2/0:0 gesendet (delay);  ,0s,
                    [...]
                    Die Aussage der Doku "wird nur dann gesendet, wenn Ergebnis!=Input oder Sender des empfangenen Telegramms!=$eibd_backend_address" scheint nicht zu greifen.

                    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?
                    Autor der SonoPhone, SonoPad und SqueezePad Apps.

                    Kommentar


                      Hallo

                      Ich habe gerade das Problem, dass mein DALI Gateway nur 16 Szenen kann und ich schon alle anderweitig belegt habe. Desweiteren können die in dem betroffenen Raum verwendeten Rolladenaktoren keine Szenen (zu alt).
                      Mit dem Szenencontroller von Fry bin ich auf anhieb nicht zurecht gekommen. Dann habe ich mir gedacht, "nimm doch den Logikprozessor". Gedacht, getan. ;-)

                      Die Logik läuft auch wunderbar. Nach Druck auf Taste A fahren die Rolläden auf 50% und das Licht wird entsprechend gedimmt. Nur leider mit einer Verzögerung von 5 bis 15 Sekunden. Ich kann mir leider nicht erklären, warum das so lange dauert. Hat jemand eine Idee das ganze zu beschleunigen?

                      Anbei die Logiken:
                      Code:
                      # yS Szenen
                      yS_Szene_Karin_1_Rollos     => {receive=>'3/6/20', transmit=>['3/2/10', '3/2/14'], translate => 100, debug=>1 },
                      yS_Szene_Karin_1_Spots         => {receive=>'3/6/20', transmit=>'3/0/53', translate => 10, debug=>1 },
                      yS_Szene_Karin_1_indirekt     => {receive=>'3/6/20', transmit=>'3/02/55', translate => 0, debug=>1 },
                      yS_Szene_Karin_1_Dusche     => {receive=>'3/6/20', transmit=>'3/0/127', translate => 0, debug=>1 },
                      yS_Szene_Karin_1_Nische     => {receive=>'3/6/20', transmit=>'3/6/7,', translate => 0, debug=>1 },
                      
                      yS_Szene_Karin_2_Rollos     => {receive=>'3/6/22', transmit=>['3/2/10', '3/2/14'], translate => 50, debug=>1 },
                      yS_Szene_Karin_2_Spots         => {receive=>'3/6/22', transmit=>'3/0/53', translate => 100, debug=>1 },
                      yS_Szene_Karin_2_indirekt     => {receive=>'3/6/22', transmit=>'3/0/58', translate => 100, debug=>1 },
                      yS_Szene_Karin_2_Dusche     => {receive=>'3/6/22', transmit=>'3/0/127', translate => 1, debug=>1 },
                      yS_Szene_Karin_2_Nische     => {receive=>'3/6/22', transmit=>'3/6/7,', translate => 0, debug=>1 },
                      
                      yS_Szene_Karin_3             => {receive=>'3/6/24', transmit=>['3/2/8', '3/2/12', '3/0/53', '3/0/58', '3/0/130'],translate => 0, debug=>1 },
                      yS_Szene_Karin_3_Nische     => {receive=>'3/6/24', transmit=>'3/6/7', translate => 1, debug=>1 },
                      ---
                      Martin

                      Kommentar


                        Hallo bluegaspode,

                        bist du bei deinem Problem weiter gekommen?
                        So wie ich deine Logik lese macht es der LP doch auch.

                        Oder möchtest du das beim Empfangen einer 1 nach 5s eine 0 gesendet wird?

                        Code:
                         sperre_bewasserung_12h => { receive=>'15/2/0', transmit=>'15/2/0', translate => sub { if ($input ==1) {return 0;}  else {return undef;}}, delay => '5s', reply_to_read_requests=>1, debug=>1},
                        Ich habe es jetzt nicht getestet aber so sollte es funktionieren.

                        Grüße

                        Stefan
                        Zuletzt geändert von Hammer69; 26.06.2015, 11:57.

                        Kommentar


                          Zitat von Hammer69 Beitrag anzeigen
                          Hallo bluegaspode,

                          bist du bei deinem Problem weiter gekommen?
                          So wie ich deine Logik lese macht es der LP doch auch.
                          Eigentlich will ich nur eine einfache Treppenlicht Funktion. Wird eine 1 gesendet, soll automatisch aber nur einmalig (!) eine 0 hinterhergesendet werden (derzeit zum testen nach 5s).
                          Mein Codebeispiel entspricht (wenn mich nicht alles täuscht) auch dem Treppenlicht Beispiel aus der Demo-Config/Doku von Fry . Dort ist zumindest keine if Abfrage im translate Block notwendig. Bzw. dokumentiert, dass eigentlich nur Wertänderungen gesendet werden.

                          Bin immer noch bei meiner Endlosschleife, aber kann die tatsächlich durch ein manuelles if durchbrechen und nur bei einer 1 eine 0 hinterhergesendet, ansonsten undef.
                          Zuletzt geändert von bluegaspode; 26.06.2015, 10:27.
                          Autor der SonoPhone, SonoPad und SqueezePad Apps.

                          Kommentar


                            Zitat von Hammer69 Beitrag anzeigen
                            Ich habe es jetzt nicht getestet aber so sollte es funktionieren.
                            Ja - so ist es gut genug. Bin nun bei folgendem Schnipsel gelandet

                            Code:
                            sperre_bewasserung_12h => { receive=>'15/2/0', transmit=>'15/2/0', translate => sub { return 'cancel' unless $input; return 0; }, delay => '5s', , debug=>1},
                            Autor der SonoPhone, SonoPad und SqueezePad Apps.

                            Kommentar


                              Bin nicht sicher, aber probier mal beim delay anstatt '5s' nur eine 5 ohne irgendwas.
                              Gruß
                              Andi

                              Kommentar


                                Sorry daran liegt es nicht, sieht man im log oben. Was ggf. noch helfen kann ist ein trigger==1, anstatt des receive da du auf selber Adresse liest und schreibst.
                                Gruß
                                Andi

                                Kommentar

                                Lädt...
                                X