Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

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

    Oh toll! jagut, da hatte ich es mir wohl etwas einfach vorgestellt...doch kein oneliner
    Die Quadra sendet alle 2 min. ob es niederschlägt, denn das male ich schon in einen Graphen.
    Die Wiedereinschaltverzögerung habe ich über deine Treppenlichtlogik hinten dran gehängt:

    Code:
    stair => { receive=>'bewaesserungssperre_ga', transmit=>'wasserwerk_off', delay=>84600, translate => 0, },
    Ich hatte das doch richtig verstanden, dass die Logik auch entsprechende GAs gleich wieder empfangen und weiterverarbeiten kann oder sollte das dann anders übergeben werden?

    Gruss, crsp

    Kommentar


      Da ist noch ein Bug drin: die Null soll ja nur gesendet werden, wenn vorher auch eine 1 kam. Es könnte so funktionieren wie von dir gepostet, aber robuster ist dieser Code:

      stair => { receive=>'bewaesserungssperre_ga', transmit=>'wasserwerk_off', delay=>84600,
      translate => sub{ return int($input) ? 0 : undef; }, },
      Noch ein Hinweis, weil du deiner Logik den Namen "stair" gibst: Jede Logikdefinition braucht einen eigenen, eindeutigen Namen, also "stair" nicht nochmal verwenden, sonst überschreibt die zweite Definition die erste (bzw. outcome ist undefiniert).

      VG; Fry

      Kommentar


        Die Namensvergabe ist klar. Muss eindeutig sein.

        Ok, dann probiere ich das mal so.

        Danke!!!

        Kommentar


          Mal wieder ein Codebeispiel: eine Logik, die auf den Empfang einer GA mit Nummer einen MusicPal anweist, den Favoriteneintrag mit dieser Nummer einzustellen. Die DPT der Receive-GA sollte sowas wie 5.010 (U8) sein, also eine ganze Zahl.

          Code:
          MusicPal_PlayFavorite => { receive=>'1/2/3', translate=>sub {
             system "wget --user=admin --password=admin 'http://musicpal/admin/cgi-bin/admin.cgi?f=favorites\&n=../favorites.html\&a=p\&i=$input &";
          }, },
          Wird auf 1/2/3 bspw eine 1 empfangen, so wird der MusicPal angewiesen, den Favoriten Nr. 1 abzuspielen.

          Ich nutze MusicPals als Zuspieler für einen Russound C5-Multiroomverstärker. Die o.g. einfache Logik - zusammen mit dem Russound_RIO-Plugin und dem Szenencontroller - ermöglicht mir, Szenen inklusive Musik zu definieren. So beginnt morgens, wenn ich dusche (Temp-sensor an der Duschzuleitung), automatisch angenehme Musik zu spielen.

          Have fun,
          Fry

          Kommentar


            transmit_changes_only klappt nicht

            Hallo zusammen,

            hab hier auch mal wieder so ein kleines Problem. Für meine automatische Beschattung prüf ich jede Minute die Außentemperatur und möchte nur Änderungen 0->1 oder 1->0 senden, mit transmit_changes_only.

            Das Telegramm geht aber trotzdem jede Minute auf den Bus. Woran könnte das liegen?

            Code:
            # Memory Funktion Freigabe Beschattungsautomatik EG
            enableShadeEG => { transmit=>'7/0/1' },
            
            # Temperaturueberwachung für Beschattungsautomatik
            # --> Pruefung Temperatur alle 15min, wenn groesser 24°C beschatten.   
            
            timerShadeTemp => { fetch => '5/2/0', 
            	                       transmit => '7/0/1', 
            	                       transmit_changes_only => 1,
            	                       timer => { time => '07:00+1m-19:00' },
            	                       translate => sub { if(defined $input && int($input) > 24){1;}else{0;}},
            	                       eibd_cache => 300, 
            	                       debug=>1},
            Auszug Log:
            Code:
            2013-08-04 15:56:31.647,Logikprozessor.pl,Naechster Aufruf der Timer-Logik 'timerShadeTemp' um 15:57.
            2013-08-04 15:56:31.669,Logikprozessor.pl,$logic{timerShadeTemp}{transmit}(Logik) -> 7/0/1:1 gesendet (Timer);  ,0s,
            2013-08-04 15:57:32.326,Logikprozessor.pl,Naechster Aufruf der Timer-Logik 'timerShadeTemp' um 15:58.
            2013-08-04 15:57:32.345,Logikprozessor.pl,$logic{timerShadeTemp}{transmit}(Logik) -> 7/0/1:1 gesendet (Timer);  ,0s,
            2013-08-04 15:58:33.030,Logikprozessor.pl,Naechster Aufruf der Timer-Logik 'timerShadeTemp' um 15:59.
            2013-08-04 15:58:33.055,Logikprozessor.pl,$logic{timerShadeTemp}{transmit}(Logik) -> 7/0/1:1 gesendet (Timer);  ,0.3s,
            2013-08-04 15:59:33.223,Logikprozessor.pl,Naechster Aufruf der Timer-Logik 'timerShadeTemp' um 16:00.
            2013-08-04 15:59:33.243,Logikprozessor.pl,$logic{timerShadeTemp}{transmit}(Logik) -> 7/0/1:1 gesendet (Timer);  ,0.3s,
            2013-08-04 16:00:33.367,Logikprozessor.pl,Naechster Aufruf der Timer-Logik 'timerShadeTemp' um 16:01.
            2013-08-04 16:00:33.386,Logikprozessor.pl,$logic{timerShadeTemp}{transmit}(Logik) -> 7/0/1:1 gesendet (Timer);  ,0.3s,
            2013-08-04 16:01:34.076,Logikprozessor.pl,Naechster Aufruf der Timer-Logik 'timerShadeTemp' um 16:02.
            2013-08-04 16:01:34.095,Logikprozessor.pl,$logic{timerShadeTemp}{transmit}(Logik) -> 7/0/1:1 gesendet (Timer);  ,0s,
            2013-08-04 16:02:35.025,Logikprozessor.pl,Naechster Aufruf der Timer-Logik 'timerShadeTemp' um 16:03.
            2013-08-04 16:02:35.044,Logikprozessor.pl,$logic{timerShadeTemp}{transmit}(Logik) -> 7/0/1:1 gesendet (Timer);  ,0s,
            Danke und Gruß

            Kommentar


              Kann es sein, dass zwischendurch immer noch ein anderes Plugin oder KNX-Gerät Werte auf der 7/0/1 sendet? Diese Werte würden nämlich abgespeichert und bei "transmit_changes_only" würde mit dem jeweils letzten Wert verglichen.

              Die separate Memoryfunktion kannst du übrigens einsparen, jede Logik speichert Buswerte auf der Transmit-Adresse.

              VG; Fry

              Kommentar


                nein, die Freigabe GA nutze ich momentan nur innerhalb des Logikprozessors.

                Ich nutze die GA dann allerdings in einer anderen Logik. Die hab ich jetzt sicherheitshalber mal von receive auf fetch umgestellt. Problem bleibt aber gleich.

                Code:
                timerShadeEnableOst => { fetch=>'7/0/1', 
                	   			    transmit=>['3/2/127','3/2/128'],
                	   			    transmit_changes_only=>1,
                	   			    timer=>{ time=>'08:00+5m-16:00'}, 
                	                            translate => sub { if(defined $input == 1){1;}else{0;}},
                	                            debug=>1},

                Kann ich denn die time Funktion auch verwenden um Zeitbereiche zu definieren?

                Also ungefähr so:
                Rolladen Süd soll nur im Zeitraum 10:00 - 16:00 Uhr Beschatten, solange die Sonne auf dieser Seite steht.

                Oder abstrakt:
                receive=>'7/0/1', transmit=>['3/2/27','3/2/28'], translate => sub if( "Zeit zwischen 10:00 - 16:00"){1;}else{0;}}}

                Kommentar


                  Neues Plugin: Logikprozessor.pl

                  Zitat von Fry Beitrag anzeigen

                  Die separate Memoryfunktion kannst du übrigens einsparen, jede Logik speichert Buswerte auf der Transmit-Adresse.

                  VG; Fry
                  Ich möchte nicht die aktuelle Frage abwürgen, aber ich habe mit meiner weiter oben erwähnten UND-Verknüpfung auch noch ein Problem, denn sie funktioniert nur, wenn die Schaltvorgänge auf "1" nicht mehrere Stunden auseinander liegen. Werden auch die Receive-Werte gespeichert und vielleicht auch wieder "vergessen"? Oder was könnte das Problem sein?

                  Hier die Config:

                  und => { receive=>['1/2/43','1/2/90'], transmit=>'2/2/10', translate=>sub{ return 1 if int($input->[0]) && int($input->[1]); return undef; }, debug=>1 },

                  Kommentar


                    @Elo: deine receive-Adressen kommen vom Wiregate? (1-wire oder Logik oder anderes Plugin?) Oder von einem KNX-Gerät, das zwar regelmäßig sendet, aber nicht auf Lesetelegramme reagiert? Oder nicht schnell genug? Die beste Lösung ist mE immer, die Werte regelmäßig (alle 5-30min) senden zu lassen und dann mit der Option eibd_cache=>2000 dafür zu sorgen, dass das vom Logikprozessor aufgerufene knx_read ohne Verzögerung den letzten Wert liefert.
                    VG; Fry

                    Kommentar


                      Zitat von firefox Beitrag anzeigen
                      nein, die Freigabe GA nutze ich momentan nur innerhalb des Logikprozessors.

                      Ich nutze die GA dann allerdings in einer anderen Logik. Die hab ich jetzt sicherheitshalber mal von receive auf fetch umgestellt. Problem bleibt aber gleich.
                      Die Option transmit_changes_only mit mehreren transmit-Adressen habe ich nie getestet.

                      Zitat von firefox Beitrag anzeigen
                      Rolladen Süd soll nur im Zeitraum 10:00 - 16:00 Uhr Beschatten, solange die Sonne auf dieser Seite steht.

                      Oder abstrakt:
                      receive=>'7/0/1', transmit=>['3/2/27','3/2/28'],
                      Das geht ungefähr so:
                      Code:
                      translate => sub { return ($hour>10 && $hour<16) ? 1:0; },
                      VG, Fry

                      Kommentar


                        Zitat von Fry Beitrag anzeigen
                        Die Option transmit_changes_only mit mehreren transmit-Adressen habe ich nie getestet.
                        ok, ich hab mittlerweile alles abgeschaltet bis auf:

                        Code:
                        	   # Temperaturueberwachung für Beschattungsautomatik
                        	   # --> Pruefung Temperatur alle 15min, wenn groesser 24°C beschatten.
                        	   timerShadeTemp => { fetch => '5/2/0', 
                        	                       transmit => '7/0/1', 
                        	                       transmit_changes_only => 1,
                        	                       timer => { time => '07:00+1m-19:00' },
                        	                       translate => sub { if(defined $input && int($input) > 24){1;}else{0;}},
                        	                       eibd_cache => 300, 
                        	                       debug=>1},
                        wird aber immer noch gesendet. kann das am timer aufruf liegen?
                        Wie könnte ich der Ursache auf den Grund gehen?

                        Kommentar


                          Ok, ich hab den Code nochmal überprüft. Wenn Timer gesetzt sind, wird transmit_changes_only ignoriert. Das ist ein Bug. Ich habe den jetzt korrigiert, aber meine Version des Logikprozessors setzt mittlerweile COMPILE_PLUGIN voraus. Nutzt du das auch? Dann kann ich helfen. Die alte Version des Logikprozessors (die immer noch im SVN liegt) will ich aber nicht weiter pflegen.
                          VG, Fry

                          Kommentar


                            Hi,
                            also wenn du mir einen kurzen Abriss wie das geht, mach ich das.
                            Ich hab mittlerweile über 50 Logiken im Logikprozessor und würde schon gerne dabei bleiben.
                            Ist das ein fertiges Paket zum installieren?

                            Ich hab parallel auch mal noch das versucht, aber auch das führt zum selben problem.
                            Vermutlich geh ich aber mit dem state hash falsch um.

                            Code:
                            # Temperaturueberwachung für Beschattungsautomatik
                            	   # --> Pruefung Temperatur alle 15min, wenn groesser 24°C beschatten.
                            	   timerShadeTemp => { fetch => '5/2/0', 
                            	                       transmit => '7/0/1', 
                            	                       transmit_changes_only => 1,
                            	                       timer => { time => '07:00+1m-19:00' },
                            	                       #translate => sub { if(defined $input && int($input) > 24){1;}else{0;}},
                            	                       #eibd_cache => 300, 
                            	                       state => {val1 => 0}, 
                            	                       translate => sub { if(defined $input && int($input) > 24){
                            	                       				if ($state->{val1} == 0) {1; $state->{val1}=> 1;}
                            	                       				else {return undef;}}else{
                            	                       				if ($state->{val1} == 1) {0; $state->{val1}=> 0;}
                            	                       				else {return undef;}}},
                            	                       
                            	                       debug=>1},

                            Kommentar


                              Hi firefox:

                              Die angehängte Datei in WG.tgz umbenennen und im root-Verzeichnis des WG auspacken.

                              Damit wird der Wiregate-Daemon /usr/sbin/wiregated.pl und der /etc/wiregated/plugin/generic/Logikprozessor.pl durch meine neuesten ersetzt.

                              @alle: dies ist experimentell! "Mein" Wiregate-Daemon ist nicht der offizielle, sondern enthält ein paar (kleinere aber wesentliche) Patches, die in diesem Posting und dem zugehörigen Thread beschrieben wurden: Vorkompilieren von Plugins, kleine Modifikation von knx_write und %plugin_cache.

                              Ich arbeite nicht bei ElabNet; "mein" Wiregate-Daemon wird daher nicht von ElabNet supported.

                              Wer nicht mit der Linux-Kommandozeile umgehen kann, soll bitte bei der offiziellen Version bleiben.

                              So, jetzt hab ich mir die Arbeit gemacht. Über einen kurzen Erfahrungsbericht würde ich mich freuen.

                              VG; Fry
                              Angehängte Dateien

                              Kommentar


                                Zitat von Fry Beitrag anzeigen
                                Ich arbeite nicht bei ElabNet; "mein" Wiregate-Daemon wird daher nicht von ElabNet supported.
                                Wobei wir die gute Arbeit von Fry sehr wohl beobachten und auch daran denken, die vorgeschlagene Modifikation zu übernehmen.


                                @fry: Nur zur Info, wir haben seit letztem Donnerstag einen neuen wiregated.pl (PL37) im Repository. Änderungen beziehen sich nur auf den Support für den Analogen Lichtsensor an Adv. Multi I/O (TVS).

                                PL37 wurde noch nicht offziell angekündigt, ist aber verfügbar.

                                lg

                                Stefan

                                Kommentar

                                Lädt...
                                X