Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

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

    Zitat von Pontius Pilatus Beitrag anzeigen
    Hallo,

    Genügt dafür ein trigger=>'meineGa==1' ?

    Ja benutze ich erfolgreich, funktioniert gut,

    Kommentar


      Hallo,

      ich möchte gerne mit dem Logikprozessor folgende Logik aufsetzen:
      · wenn Luftfeuchtigkeit Keller > 60% und Taupunkt außen mindestens 5°C weniger als Taupunkt Keller dann Lüfter an sonst Lüfter aus

      Bisher habe ich nur bestehende Logiken verändert und bin damit ganz gut klargekommen. Hier stoße ich aber an meine Grenzen. Kann mir jemand vielleicht einen Tipp geben, ob es etwas bestehendes gibt, woran ich mich orientieren kann. Oder ist das ganze so rudimentär, das jemand mir dafür einen Code zur Verfügung stellen könnte?

      Danke schon mal vorab, Sven
      MfG, Sven

      endlich eingezogen, aber noch lange nicht fertig...

      Kommentar


        So aus der Hand aufgeschrieben, ohne das getestet zu haben. Zweifelhafte Kommasetzung ist gegeben...

        Code:
        beispiellogik => {
               receive=>['LF_Keller','TP_Aussen','TP_Keller'],
               transmit=>'luefter',
               translate=>sub{
                       if ($input->[0] < "60") {return 0;} // Luftfeuchte unter 60%, also aus
                       if ($input->[1] < ($input->[2]-5)) {return 1;} // ein bei LF-Differenz
                else {return 0;}  // ansonsten aus
               },
        },
        Unter der Annahme, dass Du entsprechende GA's hast und Taupunkt etc nicht noch selbst rechnen musst.

        Obiges is allerdings eventuell etwas nervig, weil es bei jedem Update einer der GA's gestartet wird - je nach Einstellung der Sensoren schaltet das dann alle paar Sekunden, wenn's gerade am Limit hängt. Dem kann man abhelfen, indem man eine Hysterese einbaut, d.h. bei >5 Unterschied wird eingeschaltet, aber erst bei <3 Unterschied wird wieder ausgeschaltet.

        Oder man macht einen Timer und kuckt einfach nur alle halbe Stunde drauf:

        Aus dem receive=> wird ein fetch=> gemacht (fetch triggert die Logik nicht, holt aber Werte ab, wenn sie getriggert wird) und eine timer-Zeile einfügen:

        Code:
        timer => { time => ['0:00+30m-23:59'] },
        So wird's stur alle 30 Minuten evaluiert, und der Lüfter schaltet auch maximal alle 30 Minuten.

        Du könntest Dir auch überlegen, ob Dir ein default-Status des Lüfters wichtig ist und den Ausgang als Treppenhauslicht parametrieren. Falls Dir ein nichtlaufender Lüfter als default passt, parametrierst Du 31 Minuten einschalten als Treppenlicht und ersetzt die 'return 0;' durch 'return undef;' in der Logik. Du schaltest mit de rLogik also den Lüfter nur ein, nie aus.

        Natürlich umgekehrt parametriert, wenn der Lüfter per default an sein soll.

        Das verhindert, dass bei Problemen an Sensoren oder Wiregate der Lüfter unvorhersehbar schaltet.

        Kommentar


          Ohh, vielen Dank. Das hilft mir enorm. Werde das am Wochenende testen und berichten...
          MfG, Sven

          endlich eingezogen, aber noch lange nicht fertig...

          Kommentar


            Moin Sven,
            ich würde in dem
            Code:
            ($input->[0] < "60")
            die Gänsefüßchen weg lassen.
            Gruß, Sebastian
            Baustelle 2.0 (Detailprogrammierung und Restarbeiten)
            Ruhri? -> Komm zum Stammtisch

            Kommentar


              Moin zusammen,

              in dem Versuch meine Szenen mit Logikprozessor auf Geräte zu erweitern die keine Szenen unterstützen komme ich einfach nicht weiter.

              Meine Grundidee besteht darin bei Eingang einer Szenen-Nr. über die Szenen-GA unterschiedliche Werte auf diverse andere GA´s zu senden.

              Hat da vielleicht einer einen Vorschlag wie der Code dazu aussehen könnte?
              Bin leider ziemlicher Anfänger was Plugins angeht und komme mit meinem try and error einfach nicht weiter.

              Schon einmal vielen Dank für eure Hilfe!!!

              Gruß
              Kay

              Kommentar


                Wenn Du mit einer einzigen Logik verschiedene Werte auf verschiedene GA's senden willst, kommst Du mit den Hausmitteln des Logikprozessors nicht weiter - er erlaubt nur senden des gleichen Wertes auf eine oder mehrere GA's. Du kannst das zwar mit knx_write umschiffen, aber ich finde es am einfachsten, mit mehreren Logiken zu arbeiten. Du benutzt halt eine Logik pro Ausgang, und wenn eine Szenen-GA reinkommt, werden alle aufgerufen. Wenn Du alles in eine grosse Logik packst und willst dann nach 2 Jahren mal was ändern, ist das immer unübersichtlich.

                Die einfachen Logiken sehen dann so aus:

                Code:
                szene_siebzehn => {
                       receive=>'Szenen_GA',
                       transmit=>'Output_GA',
                       translate=>sub{
                               if ($input = 1) {return 7;}
                               if ($input = 2) {return 3;}
                               [... soviele Inputs Du eben brauchst...]
                        else {return undef;}
                       },
                },

                Kommentar


                  Moin Kay,
                  ich würde es genauso machen wie Johnny.
                  Eine Logik je GA auf die der Logikprozessor senden soll.
                  Beachte dabei auch, dass die Szenennummern der GA um -1 verschoben sind. Wenn du als bei Szene 1 etwas auslösen möchtest, musst du auf $Input = 0 prüfen.

                  Gruß, Sebastian
                  Baustelle 2.0 (Detailprogrammierung und Restarbeiten)
                  Ruhri? -> Komm zum Stammtisch

                  Kommentar


                    Super!
                    werde das heute Abend mal ausprobieren.

                    Danke schön!!!

                    Kommentar


                      Zitat von johnnychicago Beitrag anzeigen
                      So aus der Hand aufgeschrieben, ohne das getestet zu haben. Zweifelhafte Kommasetzung ist gegeben...
                      @jonnychicago: War spontan im Urlaub, deshalb erst jetzt die Rückmeldung. Klappt so, wie ich mir das vorstellt habe. Vielen Dank.

                      MfG, Sven

                      endlich eingezogen, aber noch lange nicht fertig...

                      Kommentar


                        So, konnte gestern erst ausprobieren und es hat leider nicht auf anhieb geklappt. Aber nach etwas rum probieren habe ich es zum laufen bekommen.

                        Hier meine Änderungen:
                        Code:
                        Code:
                        # Szenen-Erweiterungen
                        %logic=(
                        
                            Szenen_siebzehn => {
                            receive=>'Szenen_GA',
                            transmit=>'Output_GA_1',
                            translate=>sub{
                                if ($input == 0) {return 0;}
                                if ($input == 1) {return 1;}
                                if ($input == 2) {return 0;}    
                                else {return undef;}
                               },
                            },
                            Szenen_achtzehn => {
                             receive=>'Szenen_GA',
                            transmit=>'Output_GA_2',
                            translate=>sub{
                                if ($input == 0) {return 70;}
                                if ($input == 1) {return 0;}
                                if ($input == 2) {return 50;}    
                                else {return undef;}
                               },
                            },
                        )
                        Wichtig für mich war die Erkenntnisse:

                        1. Logiken so "eingefasen" (bin blutiger Anfänger was Perl und Wiregate Plugins angeht):
                        Code:
                        %logic=(
                        .
                        .
                        .
                        )
                        Code:
                        [INDENT][/INDENT]

                        Dazu eine Frage:
                        Mache ich das für jeden Logik-Block neu oder für alle Logiken nur einmal?

                        2. Das Doppel-Gleich (==) bei der Ausgabe
                        Code:
                        if ($input == 0) {return 0;} )

                        Gibt es vielleicht irgendwo diese Basics zum nachlesen? Hatte schon gesucht aber leider nix gefunden.

                        Aber vielen Dank für eure Hilfe!!!
                        Nun kann ich weiter rum tüfteln.

                        Kommentar


                          Moin,
                          mit dem Logikprozessor wird eine Beispieldatei ausgeliefert.
                          Diese befindet sich im Ordner in dem auch die conf Datei ist.

                          Oder du schlägst bei Github nach.
                          Github Logikprozessor.conf_sample

                          Gruß, Sebastian
                          Baustelle 2.0 (Detailprogrammierung und Restarbeiten)
                          Ruhri? -> Komm zum Stammtisch

                          Kommentar


                            Guten Morgen,

                            ich habe das Problem, dass das Plugin laut Log auf den Bus sendet, es kommt allerdings nichts an (laut EIBlog wird nichts empfangen).

                            2017-08-10 06:26:44.529,Logikprozessor,1.1.51 5/1/3:1 -> $logic->{mal2}{receive}(Logik) -> 1/1/35:1 gesendet; ,0s,
                            2017-08-10 07:03:30.582,Logikprozessor,1.1.51 5/1/3:0 -> $logic->{mal2}{receive}(Logik) -> 1/1/35:0 gesendet; ,0s,
                            2017-08-10 07:03:33.723,Logikprozessor,1.1.51 5/1/3:1 -> $logic->{mal2}{receive}(Logik) -> 1/1/35:1 gesendet; ,0s,
                            2017-08-10 07:05:46.375,Logikprozessor,1.1.51 5/1/3:0 -> $logic->{mal2}{receive}(Logik) -> 1/1/35:0 gesendet; ,0s,

                            Das Empfangen von Werten über den Bus funktioniert, siehe obiges Log. Auch wird laut Log ein Wert an eine Gruppenadresse geschickt. In diesem Fall soll testweise eine Lampe geschalten werden auf 1/1/35. Hat jemand eine Idee woran das liegen kann? VG Tino

                            Lasse ich Warnungen mitloggen wird folgendes ausgegeben:

                            Code:
                            2017-08-10 11:46:01.045,Logikprozessor,Naechster Aufruf der timer-Logik 'Test'  morgen um 11:46.
                            2017-08-10 11:46:01.046,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 173.
                            2017-08-10 11:46:01.047,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 174.
                            2017-08-10 11:46:01.047,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 175.
                            2017-08-10 11:46:01.048,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 176.
                            2017-08-10 11:46:01.048,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 177.
                            2017-08-10 11:46:01.048,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 178.
                            2017-08-10 11:46:01.049,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 179.
                            2017-08-10 11:46:01.049,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 180.
                            2017-08-10 11:46:01.049,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 181.
                            2017-08-10 11:46:01.050,Logikprozessor,Warning: Use of uninitialized value $_ in smart match at (eval 2314) line 182.
                            2017-08-10 11:46:01.050,Logikprozessor,Warning: Use of uninitialized value $_ in smart match at (eval 2314) line 183.
                            2017-08-10 11:46:01.051,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 184.
                            2017-08-10 11:46:01.051,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 185.
                            2017-08-10 11:46:01.051,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 186.
                            2017-08-10 11:46:01.052,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 187.
                            2017-08-10 11:46:01.052,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 188.
                            2017-08-10 11:46:01.053,Logikprozessor,Warning: Use of uninitialized value $dpt in concatenation (.) or string at (eval 2314) line 189.
                            2017-08-10 11:46:01.082,Logikprozessor,$logic->{Test}{transmit}(Logik) -> 1/1/35:1 gesendet (timer);  ,0s,
                            Das Dämon Log zeigt außerdem folgendes an:

                            Code:
                            Aug 10 18:30:03 wiregate1622 /usr/sbin/wiregated.pl: WARN - None or unsupported DPT: sent to 1/1/35 value 1
                            Aug 10 18:30:03 wiregate1622 /usr/sbin/wiregated.pl: WARN - None or unsupported DPT: sent to 1/1/35 value 1
                            Meine Gruppenadressen, einschließlich der 1/1/35 sind korrekt importiert. 1/1/35 dabei mit DPT 1.001 DPT_Switch
                            Zuletzt geändert von tinom86; 11.08.2017, 06:22.

                            Kommentar


                              Hallo zusammen, Hallo Fry,

                              Ich glaube, dass ich einen Bug gefunden habe. Zurerst einmal Danke für dieses geniale Plugin.

                              Kann es sein, dass der LP nicht auf DPT 5.003 hört?
                              Ich habe deine (Frys) Sonnenstandslogik übernommen (passender Post) und in der eibga.conf den DPT auf 5.003 eingestellt, weil es ja eine Gradangabe ist. Ich habe auch Werte auf den Bus bekommen. Andere Logiken reagierten aber nicht auf diesen Wert. Auch wenn ich den Wert auf den Bus geschrieben habe, dann passierte nicht.
                              Mit dem Auslesen den input-Hashes (passender Post) habe ich gemerkt, dass dort kein Wert enthalten ist. Nach dem Umstellen auf 5.001 geht es.
                              Habe ich irgendwo einen Denkfehler oder ist ein Bug im LP?

                              Viele Grüße,
                              Linuxer

                              Kommentar


                                Ich habe selber eine Lösung gefunden. Ich weiß zwar noch nicht, ob es ein Bug ist, aber meine Überlegung war auch nicht ganz passend. Bei DPT 5.003 gibt es nur positive Werte. Bei DPT gibt es auch negative Werte. Damit passt es.

                                Viele Grüße,
                                Linuxer

                                Kommentar

                                Lädt...
                                X