Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

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

    Ok, im SVN findest du schon mal eine Version mit verbessertem Output (das ARRAY... sollte nicht sein).

    Statt "if(A) { B } else { if(C) { D } else {E} }" kann man in Perl bequem schreiben "if(A) { B } elsif(C) { D } else {E}". Das ist aber nur Ästhetik.

    Zu deinem Problem: was genau ist oben falsch gelaufen, ich kann es dem Log nicht entnehmen. Kannst du den Log mal komplett (mit Uhrzeiten) posten?

    VG, Fry

    EDIT: füge doch mal in die Routine als erste Zeile ein:
    Code:
    plugin_log($plugname."$input=".join(",", @{$input}));"
    Das könnte uns das Debugging erleichtern.

    Gehe ich recht in der Annahme, dass 5/6/0 ein Wiregate-Sensor ist und dieser regelmäßig mindestens alle 5min sendet?

    Bitte auch mal das eib.log posten, am besten gefiltert auf die relevanten GAs.

    Kommentar


      Hallo Fry,

      danke für die schnelle Antwort, es ist genau umgekehrt, 5/5/10 ist der 1Wire-Sensor, 5/6/0 kommt übern Bus von der Wärmepumpe, da die Quadra noch im Keller steht ;-)

      Der 1Wire sendet momentan ca. alle 2,5 Min., die Aussentemperatur kommt nur bei Änderung, da habe ich keine Wahl.

      Die restlichen Daten muss ich erst auslesen, bin aber grad nicht daheim.

      Bzgl. plugin_log: Wohing genau? Plugin oder conf? Ganz oben oder innerhalb Einzelllogik?
      Beste Grüße, Dirk

      ________________________________________
      Haus ist fertig - KNX wird's nie werden ;-)

      Kommentar


        Korrektur: füge bitte innerhalb der sub {} in der Logik als erste Zeile ein:
        Code:
        plugin_log($plugname,"$input=".join(",", @{$input}));
        (im vorigen Posting war ein Punkt statt dem Komma).

        Kann es sein, dass deine Außentemperatur sich schlichtweg nicht so oft ändert und daher der eibd_cache nicht reicht, und dass der KNX-Sensor nicht schnell genug antwortet? Können wir alles dem eib.log entnehmen.

        Wir kriegen das schon hin... bleib dran.

        Viele Grüße,
        Fry

        Kommentar


          Neues Ergebnis dank Log:

          Wenn der 1Wire-Wert der Trigger ist, stimmt das Input-Array, wenn aber über den Bus die Außentemperatur kommt (siehe letzte Zeile), ist zweimal die Innentemperatur im Array.


          Code:
          2013-04-20 22:14:20.487,Logikprozessor,ARRAY(0xcca3288)=16.25,7.7
          2013-04-20 22:14:20.518,Logikprozessor,0.0.0 5/5/10:16.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 gesendet;  ,0.3s,
          2013-04-20 22:16:52.542,Logikprozessor,ARRAY(0xccca2a0)=16.25,7.7
          2013-04-20 22:16:52.559,Logikprozessor,0.0.0 5/5/10:16.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 unveraendert -> nichts zu senden;  ,0.3s,
          2013-04-20 22:19:21.820,Logikprozessor,ARRAY(0xcd06928)=16.25,7.6
          2013-04-20 22:19:21.862,Logikprozessor,0.0.0 5/5/10:16.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 unveraendert -> nichts zu senden;  ,0.3s,
          2013-04-20 22:21:53.874,Logikprozessor,ARRAY(0xccfdc20)=16.25,7.6
          2013-04-20 22:21:53.909,Logikprozessor,0.0.0 5/5/10:16.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 unveraendert -> nichts zu senden;  ,0.3s,
          2013-04-20 22:24:23.992,Logikprozessor,ARRAY(0xcd62548)=16.25,7.6
          2013-04-20 22:24:24.025,Logikprozessor,0.0.0 5/5/10:16.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 unveraendert -> nichts zu senden;  ,0.3s,
          2013-04-20 22:26:54.897,Logikprozessor,ARRAY(0xcd1f1d8)=16.25,7.6
          2013-04-20 22:26:54.913,Logikprozessor,0.0.0 5/5/10:16.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 unveraendert -> nichts zu senden;  ,0.3s,
          2013-04-20 22:29:25.351,Logikprozessor,ARRAY(0xcdb9618)=16.25,7.6
          2013-04-20 22:29:25.368,Logikprozessor,0.0.0 5/5/10:16.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 unveraendert -> nichts zu senden;  ,0.3s,
          2013-04-20 22:31:55.932,Logikprozessor,ARRAY(0xcdcd280)=16.25,7.6
          2013-04-20 22:31:55.966,Logikprozessor,0.0.0 5/5/10:16.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 unveraendert -> nichts zu senden;  ,0.3s,
          2013-04-20 22:34:29.970,Logikprozessor,ARRAY(0xce04ae0)=16.25,7.6
          2013-04-20 22:34:29.988,Logikprozessor,0.0.0 5/5/10:16.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 unveraendert -> nichts zu senden;  ,0.3s,
          2013-04-20 22:36:58.921,Logikprozessor,ARRAY(0xce191a0)=16.25,7.6
          2013-04-20 22:36:58.938,Logikprozessor,0.0.0 5/5/10:16.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 unveraendert -> nichts zu senden;  ,0.3s,
          2013-04-20 22:39:28.767,Logikprozessor,ARRAY(0xce2d428)=16.25,7.6
          2013-04-20 22:39:28.784,Logikprozessor,0.0.0 5/5/10:16.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 unveraendert -> nichts zu senden;  ,0.3s,
          2013-04-20 22:42:02.369,Logikprozessor,ARRAY(0xce653b0)=16.25,7.6
          2013-04-20 22:42:02.387,Logikprozessor,0.0.0 5/5/10:16.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 unveraendert -> nichts zu senden;  ,0.3s,
          2013-04-20 22:43:12.708,Logikprozessor,ARRAY(0xce54208)=16.25,16.25
          2013-04-20 22:43:12.750,Logikprozessor,1.1.35 5/6/0:7.7 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:1 gesendet;  ,0.3s,
          Beste Grüße, Dirk

          ________________________________________
          Haus ist fertig - KNX wird's nie werden ;-)

          Kommentar


            Wir haben gerade einen Bug im Logikprozessor gemeinsam gefunden. Ich habe ihn auch schon behoben (glaube ich). Bitte mal neue Version des Logikprozessors aus dem SVN holen und schauen, ob es nun klappt.
            VG, Fry

            Kommentar


              Coole Sache, sieht so aus, als würde es jetzt klappen!

              Morgen weiß ich mehr, wenn innen abgekühlt ist und außen wieder warm wird.

              Danke für das tolle Plugin und den 1A Support!
              Beste Grüße, Dirk

              ________________________________________
              Haus ist fertig - KNX wird's nie werden ;-)

              Kommentar


                Hallo Fry,

                ich habe heute mal alle "verstreuten" Logiken in Deinem Plugin zusammengezogen, dabei ist mir folgendes Problem untergekommen:

                Ich schicke bei Sonnenaufgang eine 1 auf die 1/0/200, bei Sonnenuntergang eine 0. Weiterhin sollen morgens um 05:30 Uhr die Lichter 1/1/100 und 1/1/10 eingeschaltet und bei Sonnenaufgang ausgeschaltet werden.
                Jetzt kann es jedoch passieren, dass die Sonne vor 05:30 aufgeht, damit also der Trigger für´s ausschalten fehlt. Die Zeile

                Code:
                Beleuchtung_05:30_Ein => { transmit=>['1/1/100','1/1/10'], timer=>{ time=>['05:30'], translate => 1, debug => 1 },
                müsste also noch eine Prüfroutine enthalten, welche den Status der 1/0/200 überprüft, nur wie stelle ich das an? Wie ich in den vorherigen Beiträgen gelesen habe speichert der Cache in der Regel zu kurze Zeiträume...

                Ansonsten noch einmal vollstes Lob für Dein Plugin, hat den Mehrwert vom WG noch einmal richtig gepusht!!

                Danke & Gruß,
                Hannatz

                Kommentar


                  Hallo Hannatz,
                  danke für das Lob, die nächste Sache ist auch schon im Test...

                  Zu deinem Problem: einfach eine zweite Logik machen, die nur auf die 1/0/200 hört und den Wert des Telegramms zB in $plugin_info{$plugname.'Sonne'} speichert. Dort kann die erste - und alle anderen - Logiken das dann abfragen.

                  Have fun!
                  Fry

                  Kommentar


                    Hier übrigens eine knappe Logik, die den Sonnenstand berechnet und alle 5min auf den Bus sendet.

                    EDIT: damit das funktioniert, muss die Zeile
                    Code:
                    use Math::Trig qw(asin acos atan tan);
                    oben in den Logikprozessor eingefügt werden.


                    Code:
                        Sonnenstand => { transmit=>'0/0/1', # GA fuer Elevation
                                         translate=>sub{
                                             # Geografische Breite und Laenge in Grad                                                                                 
                                             my $lat = 50.57;
                                             my $lon = 9.70;
                    
                                             # mittlere Ortszeit in Stunden. Dies ist die "Greenwich-Zeit" mit exakter Zeitzone auf diesem Laengengrad                
                                             my $MOZ = strftime("%H",gmtime())+$minute/60+$lon/15;
                    
                                             # wahre Ortszeit. Beruecksichtigt die Exzentrizitaet der Erdbahn.                                                        
                                             # 12 Uhr entspricht hier dem Sonnenhoechststand (genau im Sueden) des Tages                                              
                                             my $WOZ = $MOZ-0.171*sin(0.0337*$day_of_year+0.465)-0.1299*sin(0.01787*$day_of_year-0.168);
                                             my $tau=($WOZ-12)/12*3.1416; # Stundenwinkel der Sonne
                    
                                             # Deklination der Sonne beim Hoechststand des Tages im Bogenmass                                                         
                                             # dies ist der Breitengrad, an dem die Sonne durch den Zenit geht                                                        
                                             my $dek = 0.4095*sin(0.016906*($day_of_year-80.086));
                    
                                             # Aktuelle Elevation der Sonne in Grad. Die Erdachse ist um 23.44 Grad geneigt                                           
                                             $lat/=57.29578;
                                             my $elev = 57.29578*asin(cos(($WOZ-12)/12*3.1416)*cos($lat)*cos($dek)+sin($lat)*sin($dek));
                    
                                             # Aktueller Azimut der Sonne, 180 Grad ist Sueden                                  my $N=-sin($tau)*cos($dek);
                                             my $D=sin($dek)*cos($lat)-cos($tau)*cos($dek)*sin($lat);
                                             my $azim = 57.29578*atan($N/$D);
                                             $azim += $N<0?-180:180 if $D<0; # Emulation atan2
                                             $azim += 360 if $azim<0;
                    
                                             # Auf Bus schreiben
                                             knx_write('0/0/2',int($azim)); # GA fuer Azimuth
                                             return int($elev);
                                         },
                                         timer=>{ time=>'00:00+5min' },
                                         transmit_on_startup=>1,
                        },
                    EDIT: Die Formel für den Azimut war falsch (mein Fehler, nicht der meiner Quellen). Oben korrigiert.

                    Die GAs müssen natürlich bei Bedarf angepasst werden.

                    Die Formeln habe ich von Formel für Sonnenaufgang, Sonnenuntergang und die Zeitgleichung und aus Wikipedia, und soweit ich bisher sehe, scheint es zu klappen.

                    Ausdrücklich: die Berechnung ist eine Approximation und sicher nicht die allerbeste, dafür aber sicher eine der einfachsten!

                    Sonnenauf- und -untergang haben Elevation 0.

                    Have fun,
                    Fry

                    Kommentar


                      Hallo Fry,

                      vielen Dank für deinen Logikprozessor, den ich von der Idee her schon etzt sehr liebe.

                      Leider hapert es bei mir gerade an der praktischen Anwendung: Ich möchte im ersten Schritt einfach nur dein UND Beispiel in ein ODER verwandeln.

                      PHP-Code:
                      Fenstergruppenstatus => { receive=>['4/0/2','4/0/3'], transmit=>'4/0/0'translate => sub $input->[0] || $input->[1]; }, debug=>}, 
                      Leider gibt er nur eine 1 zurück, wenn 4/0/2 auf 1 ist.
                      Wenn nur 4/0/3 auf 1 ist, dann gibt er eine 0 zurück:
                      PHP-Code:
                      2013-04-28 00:03:16.500,Logikprozessor.pl,1.1.50 4/0/2:-> $logic{Fenstergruppenstatus}{receive}(Logik) -> 4/0/0:1 gesendet ,0s
                      2013-04-28 00:03:17.904,Logikprozessor.pl,1.1.50 4/0/2:-> $logic{Fenstergruppenstatus}{receive}(Logik) -> 4/0/0:0 gesendet ,0s
                      2013-04-28 00:03:23.386,Logikprozessor.pl,1.1.50 4/0/3:-> $logic{Fenstergruppenstatus}{receive}(Logik) -> 4/0/0:0 gesendet ,0s
                      2013-04-28 00:03:25.004,Logikprozessor.pl,1.1.50 4/0/3:-> $logic{Fenstergruppenstatus}{receive}(Logik) -> 4/0/0:0 gesendet ,0s
                      Ist die Syntax für ein Oder im Plugin möglicherweise anders?

                      Danke für jegliche Unterstützung und Grüße
                      Guste

                      Kommentar


                        Guste -
                        $input enthält die Werte, die knx_read zurückliefert. Das sind manchmal Strings wie "00", und dieser ist logisch WAHR.
                        Lösung: verwende int($input->[0]) || int($input->[1]).
                        Have fun,
                        Fry

                        Kommentar


                          Zitat von Fry Beitrag anzeigen
                          Zu deinem Problem: einfach eine zweite Logik machen, die nur auf die 1/0/200 hört und den Wert des Telegramms zB in $plugin_info{$plugname.'Sonne'} speichert. Dort kann die erste - und alle anderen - Logiken das dann abfragen.
                          Hallo Fry,

                          so ganz habe ich Deine Idee noch nicht kapiert?!
                          Meinst Du ich solle diese Variable in der config des Logikprozessors packen oder aber ein eigenes Plugin dafür anlegen?
                          Und weiterhin, Deine Sonnenstandberechnung zielt ja in die gleiche Richtung, wohin sollte diese (Config oder neues Plugin)?

                          Last but not least habe ich auch eine Fehlmeldung für das bisherige Plugin welche ich nicht verstehe:

                          2013-04-28 13:03:46.188,Logikprozessor,config error: Bareword "receive" not allowed while "strict subs" in use at (eval 58043) line 20.
                          Bareword "receive" not allowed while "strict subs" in use at (eval 58043) line 20.
                          Line 20 ist die Zeile "%logic=("
                          Der dazugehörige Code lautet:
                          %logic=(

                          #Abspeicherung Sonnenstand
                          $plugin_info{$plugname.'Sonne'} => {memory => { transmit=>'1/0/200' }},

                          Fenster_Sued_per_Licht => { receive=>'1/1/34', transmit=>'1/1/48', translate => 1, debug=>1 },
                          TV_per_Licht => { receive=>'1/1/33', transmit=>['1/1/54','1/1/51'], translate => 1, debug=>1 },
                          Ankleide_Schlafzimmer_EG_Treppenlichtfunktion => { receive=>'1/1/32', transmit=>'1/1/30', delay => 600, translate => 0, debug=>1 },
                          Radio_Kueche_per_Licht => { receive=>'1/1/41', transmit=>'1/1/44', translate => 1, debug=>1 },
                          Radio_Kueche_per_Lichtszene => { receive=>'1/0/0', transmit=>'1/1/44', translate => 1, debug=>1 },
                          PM_Sperre_Sonnenaufgang_Ein => { receive=>'1/0/200', transmit=>['1/0/100','1/0/99'], translate => 0, debug => 1 },
                          PM_Sperre_Sonnenuntergang_Aus => { receive=>'1/0/201', transmit=>['1/0/100','1/0/99'], translate => 1, debug => 1 },
                          Wecken_Schlafzimmer_EBS => { transmit=>'1/3/30', timer=>{ time=>['07:45'], workingday => 1 }, translate => 20, debug => 1 },
                          Beleuchtung_0530_Ein => { transmit=>['1/1/100','1/1/10'], timer=>{ time=>['05:30']}, translate => 1, debug => 1 },
                          Beleuchtung_Sonnenaufgang_Aus => { receive>'1/0/200',transmit=>['1/1/100','1/1/10','1/1/102','1/1/48','1/1/49','1/1/47','1/1/10'], translate => 0, debug => 1 },
                          Beleuchtung_Sonnenuntergang_Ein => { receive>'1/0/201',transmit=>['1/1/100','1/1/10','1/1/49','1/1/47','1/1/102','1/1/48','1/1/10'], translate => 1, debug => 1 },
                          Beleuchtung_Wochentags_2330_Aus => { transmit=>['1/1/100','1/1/10','1/1/49','1/1/47','1/1/102','1/1/48','1/1/10'], timer=>{ time=>['23:30'], workingday => 1}, translate => 0, debug => 1 },

                          );
                          Wie Du siehst, ich brauche leider noch ein wenig Unterstützung um die wirklich beeindruckenden Möglichkeiten Deines Plugins auszunutzen...

                          Danke & Gruß,
                          Hannatz

                          Kommentar


                            Hi Hannatz,
                            Versuchs mal etwa so:
                            Code:
                            %logic=(
                             
                            # Mit Sonnenaufgang (1 auf 1/0/200) Beleuchtung aus, Praesenzmelder sperren und Sonnenstand merken
                            Beleuchtung_Sonnenaufgang_Aus => {  receive=>'1/0/200',
                            transmit=>['1/1/100','1/1/10','1/1/102','1/1/48','1/1/49','1/1/47','1/1/10','1/0/100','1/0/99'], 
                            translate => sub { $plugin_info{$plugname.'_Sonne_da'} = int($input); return 0 if int($input); return undef; }, 
                            [URL="http://redaktion.knx-user-forum.de/lexikon/debug/"]debug[/URL] => 1 },
                                 
                            # Beleuchtung um 5:30 an, ausser wenn Sonne schon da
                            Beleuchtung_0530_Ein => { transmit=>['1/1/100','1/1/10'], timer=>{ time=>'05:30'}, 
                            translate => sub { return undef if $plugin_info{$plugname.'_Sonne_da'}; return 1; }, 
                            [URL="http://redaktion.knx-user-forum.de/lexikon/debug/"]debug[/URL] => 1 },
                            
                            );
                            Die Punkte "..." stehen für deine übrigen Logiken, ich hab mich jetzt mal auf den einen Punkt beschränkt.

                            Wichtig ist natürlich, dass auf die 1/0/200 bei Sonnenuntergang auch wieder eine 0 gesendet wird. Insofern würde ich auf die separate 1/0/201 verzichten und bei Sonnenuntergang einfach wieder auf 1/0/200 senden.

                            "return undef" führt einfach dazu, dass kein Bustelegramm gesendet wird.

                            VG; Fry

                            PS Die Fehlermeldung "Bareword receive" kam vom Syntaxfehler "receive>..." statt "receive=>..."

                            Kommentar


                              Zitat von Fry Beitrag anzeigen
                              PS Die Fehlermeldung "Bareword receive" kam vom Syntaxfehler "receive>..." statt "receive=>..."
                              Oh man, was bin ich ein Blindfisch!! Habe die letzte halbe Stunde jede Zeile einzeln auskommentiert und just gerade auf die beiden eingrenzen können...

                              Den Rest probiere ich nachher mal aus und melde mich wieder.

                              Super vielen Dank!!!

                              Gruß Hannatz

                              Kommentar


                                Hallo Fry,

                                ich hab Dein Beispiel jetzt auch für Sonnenuntergang eingebaut und erkläre mir gerade die einzelnen Bestandteile, ist das so richtig?

                                # Mit Sonnenuntergang (0 auf 1/0/200) Aussenbeleuchtung ein, Praesenzmelder freigeben und Sonnenstand merken
                                Kommentar, ist klar...

                                Beleuchtung_Sonnenuntergang_Ein => { receive=>'1/0/200',
                                Lausche auf der 1/0/200 egal welcher Wert da kommt

                                transmit=>'1/1/100','1/1/49','1/1/47','1/1/102','1/1/48','1/1/10','1/0/100','1/0/99'],
                                Schreibe auf diese Adressen alle mit dem gleichen Wert welcher im folgenden definiert wird

                                translate => sub { $plugin_info{$plugname.'_Sonne_da'} = int($input);
                                Berechnungsroutine, setzen der Variable '_Sonne_da' mit dem Wert welchen Du auf der Receive-GA bekommen hast

                                return 1 if int($input); return undef; },
                                Gib den Wert 1 auf die Transmit-GAs falls die Bedingung "Variable '_Sonne_da' dem Wert ??? entspricht, andernfalls mach nix

                                debug => 1 },
                                Schreib den Kram ins Log

                                So, wie Du siehst hab ich noch nicht verstanden wo genau geprüft wird ob die Receive-GA eine 1 (-> Tag) oder 0 (-> Nacht) sendet, als

                                Kommentar

                                Lädt...
                                X