Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

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

    Zitat von StefanW Beitrag anzeigen
    In der derzeitigen Entwicklerfassung des künftigen PL38 sind die Änderungen alle enthalten. Unsere Test-Plugins laufen bereits 20 fach schneller als zuvor.
    Ohne abschließende Regressionstests können wir noch keine Aussage treffen ob alles drin bleibt, aber ich bin zuversichtlich, wurde schließlich auch lange von Early-Adoptern getestet.
    Oh, sehr schön! Das ist ja fast so schön wie Weihnachten ;-)

    VG
    Micha

    Kommentar


      Zitat von dirk13 Beitrag anzeigen
      Bedeuted das, dass sich alle WG-Plugins einen Namesraum für subs teilen?
      Das ist recht interessant und war zumindest mir jetzt neu. Es könnte u.A. die weiter oben genannte frage nach Plugin-Interferenzen beantworten...
      Korrekt, zumindest soweit ich weiß: Abseits von Klassen (die hier nicht benutzt werden) kennt Perl nach meiner Kenntnis nur einen Namensraum für subs. Geschachtelte Subs gibt es nicht.

      VG, Fry

      Kommentar


        Zitat von mivola Beitrag anzeigen
        • gibt es einen einfacheren Weg um zu prüfen, ob sich der Wert einer GA (hier: Windalarm an/aus) im Vergleich zum letzten Aufruf des Plugins geändert hat? Bisher mache ich das so...

        Meine lokale Version des Logikprozessors kennt bereits die Option "execute_on_input_changes_only=>1,"


        Stelle ich dann demnächst mal ein. Erstmal den neuen wiregated.pl abwarten...




        Wie sollte ich am besten die Werte der Raffstores speichern und später wieder abrufen?
        In %plugin_info oder in %plugin_cache.

        * Ich habe einige Fälle, in denen ich eine Logik nur ausführen will, wenn ein Wert auf der GA X empfangen wird. Zur Berechnung des Wertes der daraufhin gesendet werden soll, benötige ich aber noch die Werte aus 1-n anderen GAs.
        Dafür gibt es neben receive=>.... auch fetch=>...., das sich nur in genau diesem Feature unterscheidet. Ist glaub ich in der letzten geposteten Version des Logikprozessors auch drin.

        VG, Fry

        Kommentar


          Hallo,

          Zitat von Fry Beitrag anzeigen
          Meine lokale Version des Logikprozessors kennt bereits die Option "execute_on_input_changes_only=>1,"
          Na da ist ja ein Zufall :-)

          Zitat von Fry Beitrag anzeigen
          In %plugin_info oder in %plugin_cache.
          OK, danke! %plugin_cache ist nur im Speicher, d.h. nach einem Neustart des wiregated ist alles weg? %plugin_info wird auf Platte gespeichert oder?

          Zitat von Fry Beitrag anzeigen
          Dafür gibt es neben receive=>.... auch fetch=>
          Ja danke, das funktioniert :-) In der conf.sample gibt es ganz unten einen kleinen Hinweis. Wenn du magst kann ich (nach dem neuen PL) gern ein passendes Beispiel hinzufügen.

          Danke!!
          Micha

          Kommentar


            Zitat von mivola Beitrag anzeigen
            OK, danke! %plugin_cache ist nur im Speicher, d.h. nach einem Neustart des wiregated ist alles weg? %plugin_info wird auf Platte gespeichert oder?
            Ja.

            %plugin_info ist ein tie an die Datenbank in der Datei /tmp/wiregate_plugin.db, die regelmäßig nach /etc/wiregate/wiregate_plugin.db kopiert wird. Daten darin sind persistent - was mitunter auch nerven kann. Wenn man die Dateien übrigens löscht und den wiregated neu startet, werden sie neu eingerichtet. Das kann man auch benutzen, um mal so richtig aufzuräumen... Weil %plugin_info ein tie an eine Datenbank ist, sind die Einträge auf Skalare beschränkt! (genau deshalb auch die Gepflogenheit, Variablen wie $plugin_info{$plugname.'_XYZ'} zu nutzen und nicht $plugin_info{$plugname}{XYZ} - letzteres wäre nämlich ein geschachteltes Hash, und das kann das tie nicht).

            %plugin_cache wurde von mir als wiregated-Patch vorgeschlagen und ist meines Wissens für den nächsten PL allgemein vorgesehen. Dieser Hash wird einfach mit dem Start des wiregated eingerichtet, lebt im RAM und stirbt bei einem Neustart des wiregated. Dafür können problemlos komplexe Datenstrukturen dort abgelegt werden, also ist zB sowas wie $plugin_cache{$plugname}{CONFIG}=\%myconfig möglich, um die Config nicht bei jedem Plugin-Aufruf neu einlesen zu müssen. So Sachen nutze ich in allen meinen Plugins zur Beschleunigung.

            VG, Fry

            Kommentar


              Danke für die Erklärung Fry!

              Kommentar


                Ping-Test

                Evtl interessiert es hier auch jmd. Angelehnt an dieses Plugin, habe ich einen Ping-Test für den Logikprozessor erstellt:

                Code:
                pingMediacenter => { transmit=>'1/1/9', timer=>{ time=>'00:00+5m' }, translate => sub { 
                		my $command = "ping -c 2 -w 1 <IP/hostname>";
                		my $status = `$command`;
                		return ($status =~ /bytes from/) ? 1 : 0 }, debug=>1},
                Mehr Details: https://knx-user-forum.de/367961-post12.html

                VG
                Micha

                Kommentar


                  Ich habe zwei Fragen, die ich bisher nicht selbst lösen konnte:

                  1. Treppenlichtfunktion ("delay"): Wie kann ich den Timer unterbrechen?
                  Beispiel: Bei "Zentral aus" (0/0/1) soll die Waschmaschine (2/1/30) automatisch nach drei Stunden ausgeschaltet werden. Klappt auch prima mit:

                  Code:
                   waschmaschine => { receive=>'0/0/1', transmit=>'2/1/30', delay=>10800, translate => 0, },
                  Wenn ich aber früher - sprich innerhalb der drei Stunden - nach Hause komme und wieder Zentral An schalte, soll der Timer unterbrochen und die Waschmaschine *nicht* ausgeschaltet werden.

                  2. Bei meiner zweiten Frage habe ich gefühlte Tomaten auf den Augen. Wie bekomme ich eine if-Funktion hin?

                  Sprich: Wenn Einbruchalarm (1/1/1 == 1) ausgelöst wird, soll die Beleuchtung bestimmter Räume angehen (1/1/2 == 1), aber nur, wenn die EMA unscharf (1/1/3 == 0) ist.
                  Bin bei folgendem Schnipsel hängengeblieben und komme nicht weiter:

                  Code:
                   und => { receive=>['1/1/1','1/1/3'], transmit=>'1/1/2', translate => sub { $input->[0] && $input->[1]; }, debug=>1 },
                  Wie bekomme ich das hin, dass der Logikprozessor auf zwei receive-Adressen jeweils unterschiedliche Werte auswerten kann?

                  PS: Wir brauchen mal ganz, ganz dringend ein Wiki für die Codebeispiele! 33 Seiten zu durchforsten, ist... umfangreich.
                  "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

                  Kommentar


                    Zitat von wuestenfuchs Beitrag anzeigen
                    1. Treppenlichtfunktion ("delay"): Wie kann ich den Timer unterbrechen?
                    Beispiel: Bei "Zentral aus" (0/0/1) soll die Waschmaschine (2/1/30) automatisch nach drei Stunden ausgeschaltet werden. Klappt auch prima mit:

                    Code:
                     waschmaschine => { receive=>'0/0/1', transmit=>'2/1/30', delay=>10800, translate => 0, },
                    Wenn ich aber früher - sprich innerhalb der drei Stunden - nach Hause komme und wieder Zentral An schalte, soll der Timer unterbrochen und die Waschmaschine *nicht* ausgeschaltet werden.
                    In der neuesten Version des Logikprozessors - bei mir zu Hause - gibt es dafür die Möglichkeit eines
                    Code:
                    return "cancel";
                    Die neue Version kommt aber (wie bereits gesagt) erst, wenn ElabNet den wiregated.pl mit den erforderlichen Patches versehen hat.

                    Eine andere Möglichkeit wäre, den Timer einfach per Hand zu löschen, etwa mit
                    Code:
                    delete $plugin_info{$plugname.'__waschmaschine_timer'};
                    Zitat von wuestenfuchs Beitrag anzeigen
                    2. Bei meiner zweiten Frage habe ich gefühlte Tomaten auf den Augen. Wie bekomme ich eine if-Funktion hin?

                    Sprich: Wenn Einbruchalarm (1/1/1 == 1) ausgelöst wird, soll die Beleuchtung bestimmter Räume angehen (1/1/2 == 1), aber nur, wenn die EMA unscharf (1/1/3 == 0) ist.
                    Bin bei folgendem Schnipsel hängengeblieben und komme nicht weiter:

                    Code:
                     und => { receive=>['1/1/1','1/1/3'], transmit=>'1/1/2', translate => sub { $input->[0] && $input->[1]; }, debug=>1 },
                    Wie bekomme ich das hin, dass der Logikprozessor auf zwei receive-Adressen jeweils unterschiedliche Werte auswerten kann?
                    So:

                    Code:
                     und => { receive=>['1/1/1','1/1/3'], transmit=>'1/1/2',  translate => sub { return undef unless defined $input->[0] && defined $input->[1];
                    return undef if int($input->[0])!=1 || int($input->[1])!=0;
                    return 1; 
                    },  debug=>1 },
                    Dieses gibt dann und nur dann eine 1 auf 1/1/2 aus, wenn
                    (i) beide Inputwerte definiert sind, also keine Lesefehler o.ä.
                    (ii) auf 1/1/1 eine 1 kam und auf 1/1/3 eine 0.
                    Andernfalls wird KEIN Wert auf 1/1/2 gesendet.

                    (Bitte denk dran, jede Logik muss einen EINDEUTIGEN Namen haben. Ein Name wie "und" ist gefährlich, weil du ihn vielleicht versehentlich nochmal vergeben könntest. Dann wäre die Folge, dass nur eine dieser Logikdefinitionen gültig wäre.)

                    Zitat von wuestenfuchs Beitrag anzeigen
                    PS: Wir brauchen mal ganz, ganz dringend ein Wiki für die Codebeispiele! 33 Seiten zu durchforsten, ist... umfangreich.
                    Yep. Gerne fängt das mal jemand an. Ich stehe auch zur Seite, werde es aber nicht selbst machen. Mit Wikis kenne ich mich nämlich nicht aus. (außer Lesen, das kann ich :-)

                    have fun,
                    Fry

                    Kommentar


                      Zitat von Fry Beitrag anzeigen
                      In der neuesten Version des Logikprozessors - bei mir zu Hause - gibt es dafür die Möglichkeit eines
                      Code:
                      return "cancel";
                      Die neue Version kommt aber (wie bereits gesagt) erst, wenn ElabNet den wiregated.pl mit den erforderlichen Patches versehen hat.

                      Eine andere Möglichkeit wäre, den Timer einfach per Hand zu löschen, etwa mit
                      Code:
                      delete $plugin_info{$plugname.'__waschmaschine_timer'};
                      Cool, danke!

                      Zitat von Fry Beitrag anzeigen
                      Code:
                       und => { receive=>['1/1/1','1/1/3'], transmit=>'1/1/2',  translate => sub { return undef unless defined $input->[0] && defined $input->[1];
                      return undef if int($input->[0])!=1 || int($input->[1])!=0;
                      return 1; 
                      },  debug=>1 },
                      Dieses gibt dann und nur dann eine 1 auf 1/1/2 aus, wenn
                      (i) beide Inputwerte definiert sind, also keine Lesefehler o.ä.
                      (ii) auf 1/1/1 eine 1 kam und auf 1/1/3 eine 0.
                      Andernfalls wird KEIN Wert auf 1/1/2 gesendet.
                      Whoa, Perl magic! Vielen lieben Dank, da wär ich niemals selbst drauf gekommen, auch wenns im Nachhinein logisch erscheint.

                      Zitat von Fry Beitrag anzeigen
                      Yep. Gerne fängt das mal jemand an. Ich stehe auch zur Seite, werde es aber nicht selbst machen. Mit Wikis kenne ich mich nämlich nicht aus. (außer Lesen, das kann ich :-)
                      IIRC wird es in Stefans geplantem Wiki die Möglichkeit geben, auch Plugins zu beschreiben.Wäre dann jedenfalls eine gute Gelegenheit, mal diesen Thread zu durchforsten und die ganzen Anwendungsfälle übersichtlich zusammen zu tragen. Das kann im Prinzip jeder machen, der sich ein wenig mit Wikis auskennt, selbst wenn man kein Perl/Logikprozessor-Experte ist. Wär eine schöne Aufgabe für die Community (note to myself: mitmachen!)
                      "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

                      Kommentar


                        Zitat von wuestenfuchs Beitrag anzeigen
                        IIRC wird es in Stefans geplantem Wiki die Möglichkeit geben, auch Plugins zu beschreiben.
                        Ich fand die Logikprozessor.conf im SVN sehr hilfreich und würde alle Erklärungen und Beispiele dort reinschreiben. Das ist halt näher am Code ...

                        VG
                        Micha

                        Kommentar


                          Ja, aber dann läge die meiste Arbeit auf den Schultern von Fry, weil nur er (und eine handvoll anderer Entwickler) SVN-Zugriff haben.

                          Im Wiki könnte hingegen jeder mitschreiben, ohne die Hürde eines SVNs.
                          "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

                          Kommentar


                            Naja, es gibt ja schon eine Beispielconfig die viele Beispiele beinhaltet - und ich würde sicherlich auch einiges beisteuern können/wollen. Aber es stimmt schon, im Wiki _könnten_ sich mehr Leute einbringen...

                            Micha

                            Kommentar


                              Zugriff aufs SVN kriegt man einfach, indem man danach fragt. StefanW richtet es dann ein...

                              Kommentar


                                Zitat von dirk13 Beitrag anzeigen
                                ob man der for-Schleife auch GA-Paare für receive und transmit übergeben könnte?
                                Ist zwar nicht ganz dasselbe, aber vom Prinzip her:

                                Code:
                                my %RaffstoresEndlageUnten = (BadOG => "1/1/59", BadEG => "1/2/9", KZ1 => '1/1/6');
                                while (my ($name, $ga) = each(%RaffstoresEndlageUnten)) {
                                      $logic{'Raffstore'.$name.'unten'} = { receive=>$ga, translate=>sub{
                                		plugin_log('Raffstore'.$name.'unten', "ga empfangen: ".$input);
                                		return unless ($input == 1);
                                		my $command = "curl http://localhost/visu-svn/plugins/rsslog/rsslog.php?c=Raffstore%20".$name."%20Runter";
                                		my $status = `$command`;
                                		plugin_log('Raffstore'.$name.'unten', "status: ".$status);
                                	}, debug=>1 };
                                }
                                PS: hiermit (u.a.) fülle ich mein RSSLog welches in der CometVisu auf der Seite der Raffstores angezeigt wird. Einzig die Übergabe von tags ("&t[]=tag1,tag2") ist mir bis jetzt noch nicht gelungen...

                                VG
                                Micha

                                Kommentar

                                Lädt...
                                X