Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

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

    Zitat von Hannatz Beitrag anzeigen
    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 DAS EMPFANGENE TELEGRAMM UNGLEICH 0 IST, andernfalls mach nix
    ...
    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
    In der zweiten Logik wird $plugin_info ausgelesen, in der ersten gesetzt.

    Ok?

    VG, Fry

    Kommentar


      Wieso sendet er denn nicht auf den Bus?

      Hallo,

      komme aktuell nicht weiter oder ich sehe den Wald vor lauter Bäumen nicht. Folgende Logik:

      Code:
      ## Rollladensperre global wenn Aussentemperatur < 20 Grad ##
      Sperre_Rollladen => {receive => '10/0/4', transmit => '11/0/1', translate => sub { return ( int ($input) < 20 ) ?  1 : 0 ;}, debug => 1},
      wird auch ausgeführt:
      Code:
      Logikprozessor.pl,0.0.0 10/0/4: -> $logic{Sperre_Rollladen}{receive}(Logik) -> 11/0/1:1 gesendet ,0.3s,
      ... aber warum kommt denn da nichts auf dem Bus an? Die GA's sind alle in der eibga.conf.

      Ein groupswrite auf 11/0/1 wird auf dem Bus korrekt angenommen. Wieso funktioniert das mit der Logik von oben so nicht?

      Jens
      Viele Grüße Jens

      Kommentar


        Hat sich erledigt!

        Habe den eibd restartet und in der eibga.conf die DPT SubID für die transmit-Adresse rausgenommen. Jetzt funktioniert alles wie erwünscht!

        Jens
        Viele Grüße Jens

        Kommentar


          Zitat von Fry Beitrag anzeigen
          In der zweiten Logik wird $plugin_info ausgelesen, in der ersten gesetzt.

          Ok?

          VG, Fry
          Ok, zwar hab ich den Check auf != 0 noch nicht so ganz gerafft (der Wert 0 ist doch auch im Integer-Zahlenraum?!), aber dann müsste das hier entsprechend auch funktionieren um Abends den Kram bei Sonnenuntergang einzuschalten:

          translate => sub { $plugin_info{$plugname.'_Sonne_da'} = int($input); return undef if int($input); return 1; },
          Wenn ich den Wert nicht extra speichern will sondern lediglich überprüfen was da kommt, würde dann sowas ausreichen?

          translate => sub { return undef if $input =1; return 1; },
          Und da der Appetit mit dem Essen kommt, wie erstelle ich einen unterschiedlichen Delay für Tag und Nacht? Hab mit dem hier rumprobiert, kriege aber irgendwie nicht die Kurve das Delay abhängig von $night einzubinden

          # Nachts die EBS nur kurz laufen lassen
          Ankleide_Nachtriggern_Nachts => { receive=>'1/1/32', transmit=>'1/1/32',
          translate => sub { return unless $input; $night ? 20 : 3;},
          debug=>1 },

          Wie Du siehst, Perl und Co sind nicht mehr meine Welt, ich hab´s lediglich ein wenig mit HTML, PHP und SQL.
          Ich hoffe ich bin nicht zu fordernd das ich Dich hier dauernd belatsche, aber wenn einen das Logikfieber erst mal gepackt hat...

          Danke & Gruß,
          Hannatz

          Kommentar


            Zitat von Hannatz Beitrag anzeigen
            Ok, zwar hab ich den Check auf != 0 noch nicht so ganz gerafft (der Wert 0 ist doch auch im Integer-Zahlenraum?!),
            In allen von C abgeleiteten, mir bekannten Programmiersprachen gilt 0 als logisch FALSCH, alles andere als logisch WAHR. Üblich ist es, für logisch WAHR eine 1 zu wählen.

            aber dann müsste das hier entsprechend auch funktionieren um Abends den Kram bei Sonnenuntergang einzuschalten:
            Ja, so in etwa (sicher kann ich das nicht sagen, ich kenne ja deine GA-Struktur und den Sonnensensor nicht).

            Wenn ich den Wert nicht extra speichern will sondern lediglich überprüfen was da kommt, würde dann sowas ausreichen?
            Genau.

            Und da der Appetit mit dem Essen kommt, wie erstelle ich einen unterschiedlichen Delay für Tag und Nacht? Hab mit dem hier rumprobiert, kriege aber irgendwie nicht die Kurve das Delay abhängig von $night einzubinden
            Da musst du zwei Logiken machen. Die Parameter wie delay=>..., debug=>... usw werden nicht (sicher) zur Laufzeit immer neu ausgewertet. (Bzw auch wenn es im Ausnahmefall funktionieren sollte, ist es nicht so gedacht). Alles, was zur Laufzeit der Logik erst ausgewertet werden soll, sollte auch im translate=>sub{...} durch if-Statements unterschieden werden.

            Wie Du siehst, Perl und Co sind nicht mehr meine Welt, ich hab´s lediglich ein wenig mit HTML, PHP und SQL.
            Ich hoffe ich bin nicht zu fordernd das ich Dich hier dauernd belatsche, aber wenn einen das Logikfieber erst mal gepackt hat...
            Kann ich verstehen. Bitte lies dich aber mal ein wenig in Perl ein - es lohnt sich. :-)

            Have fun,
            Fry

            Kommentar


              Zitat von jensgulow Beitrag anzeigen
              Hat sich erledigt!

              Habe den eibd restartet und in der eibga.conf die DPT SubID für die transmit-Adresse rausgenommen. Jetzt funktioniert alles wie erwünscht!

              Jens
              Das sollte aber nicht sein....führt möglicherweise später zu einem Fehler. Bitte die DPTSubId wieder reinsetzen...

              Den eibd und auch den wiregated sollte man nach Änderungen an eibga.conf immer neu starten.

              VG, Fry

              Kommentar


                Fehler mit prowl

                ich hatte gerade wieder etwas Zeit und mir die Prowl Funktion mal angesehen.

                Alles eingerichtet und getestet, erhalte allerdings folgenden Fehler in der Log:

                Code:
                2013-05-03 19:45:03.187,Logikprozessor.pl,Prowl-Nachricht nicht abgesetzt: LWP will support https URLs if the Crypt::SSLeay module is installed.
                More information at <http://www.linpro.no/lwp/libwww-perl/README.SSL>.
                Der Link funktioniert leider nicht, einem anderen Post von Makki habe ich entnommen, dass Prowl das Paket "libcrypt-ssleay-perl" benötigt und nachinstalliert. Leider klappt das immer noch nicht:

                Code:
                2013-05-03 19:47:56.872,Logikprozessor.pl,Prowl-Nachricht nicht abgesetzt: 500 Can't locate object method "new" via package "LWP::Protocol::https::Socket"
                Woran könnte das liegen?

                Kommentar


                  Da muss ich passen - Prowl habe ich nicht implementiert und kenne mich damit auch nicht aus.

                  Kommentar


                    Wie bekomme ich es hin, dass bei der UND Verknüpfung bei 1 & 1 eine 1 gesendet wird, jedoch bei 0 & 0 keine 0 sondern nichts?

                    Kommentar


                      Code:
                      translate=>sub{ return 1 if int($input->[0]) && int($input->[1]); return undef;  },
                      Bei return undef wird knx_write nicht aufgerufen.
                      VG, Fry

                      Kommentar


                        Danke für die schnelle Rückmeldung, aber ich verstehe es noch nicht, denn jetzt sendet er ja nie etwas, also auch nicht bei 1 und 1.

                        2013-06-03 17:36:19.658,Logikprozessor .pl,1/3/12:1 -> $logic{und}{receive}(Logik) -> nichts zu senden; ,0s,
                        2013-06-03 17:36:23.504,Logikprozessor .pl,1/2/90:1 -> $logic{und}{receive}(Logik) -> nichts zu senden; ,0.3s

                        So ist es eingetragen:
                        und => { receive=>['1/3/12','1/2/90'], transmit=>'2/3/22', translate => sub { $input->[0] && $input->[1]; return undef; }, debug=>1 },

                        Wie hast du es gemeint?

                        Kommentar


                          Vielleicht doch mit explizitem Cast probieren, wie in einem der obigen Beispiele schon zu sehen war?

                          ... int($input->[0]) && int($input->[1]) ...
                          Beste Grüße, Dirk

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

                          Kommentar


                            Es funktioniert so, wie von Fry beschrieben. Ich hätte nur richtig lesen sollen.
                            Jetzt klappt es, Danke!

                            Kommentar


                              Hallo,

                              erstmal dickes DANKE! an dich Fry! Der Logikprozessor leistet mir schon so einige gute Dienste.

                              Ein Thema habe ich allerdings, an dem ich nicht so recht weiterkomme:

                              Meine Gartenbewässerung soll, wenns jetzt für mindestens 30 Minuten regnet (Quadra meldet solange eine 1 an eine GA), die Bewässerung für die nächsten 24 Stunden off bleiben. Es soll also nach einer halben Stunde Regen eine 1 an eine GA gesendet werden und mit 24h delay eine 0 hinterher, der Teil ist nicht schwer - Treppenlichtfunktion.
                              Aber wie counte ich, das eine halbe Stunde Regen war?

                              gruss, crsp

                              Kommentar


                                ungefähr so (ungetestet)

                                Code:
                                bewaesserungssperre => {
                                    receive=>'quadra_regen_ga',
                                    transmit=>'bewaesserungssperre_ga',
                                    translate=>sub{ 
                                                    if(int($input)) # wenn es regnet
                                                      { 
                                           # falls es bisher nicht geregnet hat, Startzeit speichern
                                           $plugin_info{$plugname.'_regen_startzeit'}=time() unless defined $plugin_info{$plugname.'_regen_startzeit'};
                                                         # falls es über 30min konstant geregnet hat, Bewaesserungssperre setzen
                                                         return 1 if time()-$plugin_info{$plugname.'_regen_startzeit'} > 30*60;
                                         }
                                       else # Reset falls es nicht mehr regnet
                                                      { 
                                                         delete $plugin_info{$plugname.'_regen_startzeit'};
                                                      }
                                                      return undef; # nichts senden
                                                 },
                                },
                                Du hast ja gesagt, die Null nach 24h sind kein Problem, deshalb hab ich mich oben nur um die 1 gekümmert...

                                Die Quadra muss so parametriert werden, dass sie zyklisch (alle 5min oder so) eine 1 oder eine 0 an die obige receive-Adresse schickt.

                                Have fun,
                                Fry

                                Kommentar

                                Lädt...
                                X