Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

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

    Zitat von johnnychicago Beitrag anzeigen
    Settings und die sub in der .conf, settings vor der sub, alle Aufrufe dahinter.
    Rein vom Gefühl her sollte das funktionieren...
    Bei mir sieht die .conf so aus: %settings, dann %logic, dann die sub. Hilft das?

    Versuch es bitte mal mit einer minimalen .conf (= nur eine Regel) und poste diese ggf hier falls es nicht funktioniert.

    VG

    Kommentar


      Zitat von Fry Beitrag anzeigen
      Hm, seltsam. Hast du nach dem letzten Edit der /etc/wiregate/eibga.conf den wiregated.pl neu gestartet?
      Das war es. Vielen Dank.
      MfG, Sven

      endlich eingezogen, aber noch lange nicht fertig...

      Kommentar


        Summe über $input->[0] ... $input->[X]

        Hallo zusammen,

        vielleicht kann mir hier jemand mit meinem Perl-Problemchen helfen. Folgende Ausgangslage:

        Code:
        sperreRaffstoreEZ => { 
        receive=>['3/1/110', '3/1/117', '3/1/111', '3/1/1', '1/5/3'], 
        transmit=>'1/1/10', 
        translate => sub { return ($input->[0] || $input->[1] || $input->[2] || $input->[3] || $input->[4]); }, 
        debug=>1 },
        Damit versuche ich die diversen Alarm/Sperrmeldungen zu "summieren", d.h. wenn auf mind. einer der GAs (Windalarm, Tür offen, manuelle Sperre, ...) in "recieve" eine "1" kommt, wird eine "1" gesendet; anderfalls eine "0". Das funktioniert soweit schon - allerdings ist die Syntax nicht sehr schön und nicht generisch. Ich würde
        Code:
        return ($input->[0] || $input->[1] || $input->[2] || $input->[3] || $input->[4]);
        gern durch etwas wie
        Code:
        (sum($input) > 0 ? 1 : 0);
        ersetzen. Am liebsten natürlich ohne eine eigene "sum"-Funktion zu schreiben. Gibt es sowas?

        2. Teil: ich brauche ein solches Konstrukt nicht nur für eine Tür/Zimmer sondern mehrmals. Für andere Aufgaben habe ich (nach Frys Anleitung) so etwas gebaut:
        Code:
        my %Leckage = (Geschirrspueler => '1/1/13', Kuehlschrank => '1/1/14', Spuele => '1/1/15');
        while (my ($name, $ga) = each(%Leckage)) {
        	$logic{'Leckage'.$name} = { receive=>$ga, translate=>sub{
        		return unless $input;
        		sendNma(event=>'Leckage erkannt: '.$name, description=>'bitte Wasserschaden prüfen', priority=>2);
        	}, debug=>0 };
        }
        Jetzt würde ich das gern entsprechend übertragen, allerdings fehlt mir das Verständnis wie ich die zwei Variablen (Liste der recieve-GAs und eine transmit-GA) in den Hash und im while-loop wieder heraus bekomme... Jemand eine Idee? Oder muss ich zwei Hashes (je einen für recieve und einen für transmit) bauen?

        Danke!!
        Micha

        Kommentar


          Zitat von mivola Beitrag anzeigen
          Versuch es bitte mal mit einer minimalen .conf (= nur eine Regel) und poste diese ggf hier falls es nicht funktioniert.
          Hier mal die Minimalconfig:

          Code:
          #!/usr/bin/perl
          #
          # Logikprozessor.pl - Konfiguration
          #
          
          $eibd_backend_address='1.1.100'; # eigene Adresse zur Vermeidung von Zirkellogiken, ist oft auch '1.1.254'
          
          # Zentrale Einstellungen, insb. für die Prowl Mechanik, s. u..
          %settings=(
            nma => {
              apikey => 'xxx',
              application => 'SmartHome Logikprozessor',
              targetUrl => 'http://localhost',
              url => 'http://www.notifymyandroid.com/publicapi/notify'
            }
          );
          
          %logic=(
          
          nma_test => {
              receive=>'1/0/16',
              translate=>sub {
                  if ($input = 1) {
                      sendNma(event=>'Test', 
                              description=>'test'
                      );
                      return;
                  }
          
              },
          },
          
          );
          
          sub sendNma {
              my (%parameters)=@_;
              my ($priority, $event, $description, $application, $url, $apikey, $targetUrl);
          
              # Parameter ermitteln
              # dom, 2012-11-05: $settings auch hier auswerten. Damit kann addRssLog() direkt aus der Logik aufgerufen werden!
              $priority = $parameters{priority} || $settings{nma}{priority} || 0;
              $event = $parameters{event} || $settings{nma}{event} || '[unbenanntes Ereignis]';
              $description = $parameters{description} || $settings{nma}{description} || '';
              $application = $parameters{application} || $settings{nma}{application} || 'WireGate KNX';
              $targetUrl = $parameters{targetUrl} || $settings{nma}{targetUrl} || '';
              $url = $parameters{url} || $settings{nma}{url} || '';
              $apikey = $parameters{apikey} || $settings{nma}{apikey} || '';
          
              
              use LWP::UserAgent;
              use URI::Escape;
              use Encode;
          
              # HTTP Request aufsetzen
              my ($userAgent, $request, $response, $requestURL);
              $userAgent = LWP::UserAgent->new;
              $userAgent->agent("WireGatePlugin/1.0");
          
          
              $requestURL = sprintf($url."?apikey=%s&priority=%s&event=%s&description=%s&application=%s&url=%s",
                  uri_escape($apikey),
                  uri_escape($priority),
                  uri_escape(encode("utf8", $event)),
                  uri_escape(encode("utf8", $description)),
                  uri_escape(encode("utf8", $application)),
                  uri_escape($targetUrl));
          
              $request = HTTP::Request->new(GET => $requestURL);
              #$request->timeout(5);
          
              $response = $userAgent->request($request);
                  if ($response->is_success) {
                     plugin_log($plugname, "NMA-Nachricht erfolgreich abgesetzt: $priority, $event, $description, $application") if $parameters{debug};
                  } elsif ($response->code == 401) {
                     plugin_log($plugname, "NMA-Nachricht nicht abgesetzt: API key gültig?");
                  } else {
                     plugin_log($plugname, "NMA-Nachricht ($requestURL) nicht abgesetzt: " . $response->content);
                  }
          
              return undef;
          }
          Die Fehlermeldung ist die:

          2014-05-26 19:52:01.174,Logikprozessor.pl,NMA-Nachricht (?apikey=&priority=0&event=Test&description=test&a pplication=WireGate%20KNX&url=) nicht abgesetzt: 400 URL must be absolute

          Kommentar


            Zitat von johnnychicago Beitrag anzeigen
            URL must be absolute
            versuche es mal, indem du
            Code:
            targetUrl => 'http://localhost',
            ersetzt durch die IP Adresse des Servers. Also z.B.
            Code:
            targetUrl => 'http://127.0.0.1',
            Gruß, Sebastian
            Baustelle 2.0 (Detailprogrammierung und Restarbeiten)
            Ruhri? -> Komm zum Stammtisch

            Kommentar


              Zitat von mivola Beitrag anzeigen
              Hier noch ein Beispiel wie ich es benutze:

              Code:
              sendNma(event=>'Garagentor auf seit 15min!', description=>'bitte Garagentor schließen');
              Da hak' ich direkt auch noch mal nach:

              die delay=>xxx Anweisung ist mir bekannt - damit kann ich im Logikprozessor das Senden der Receive-GA verzögern. Evaluiert wird aber direkt.

              Deine obige Notification - wie hälst Du die denn zurück, dass sie erst nach 15 Minuten sendet?

              Kommentar


                Zitat von johnnychicago Beitrag anzeigen
                Hier mal die Minimalconfig:
                .....
                Die Fehlermeldung ist die:

                2014-05-26 19:52:01.174,Logikprozessor.pl,NMA-Nachricht (?apikey=&priority=0&event=Test&description=test&a pplication=WireGate%20KNX&url=) nicht abgesetzt: 400 URL must be absolute
                Ich habe deine Config mal ausprobiert und es funktioniert:
                Code:
                2014-05-27 11:21:19.117,Logikprozessor,NMA-Nachricht erfolgreich abgesetzt: 0, Test, test, SmartHome Logikprozessor
                Noch eine Idee: nutzt du die von Fry eingeführten Patches des wiregated (if/while, pre-compiled, ...)? Wenn ja, könnte das ein Problem sein - ich nutze den originalen wiregated!

                Noch ein Hinweis (basierend auf meinen rudimentären Perl-Kenntnissen:
                Code:
                        if ([COLOR="Red"]$input = 1[/COLOR]) {
                            sendNma(event=>'Test', 
                                    description=>'test', debug=>1
                            );
                            return;
                        }
                "$input = 1" ist eine Zuweisung, kein Vergleich. Dadurch wird $input immer auf "1" gesetzt und gleichzeitig ist die if-Bedingung immer wahr. Vergleiche lieber mit:
                Code:
                if ($input == 1) {
                oder sogar
                Code:
                if (int($input) == 1) {
                VG
                Micha

                Kommentar


                  Zitat von Bainit Beitrag anzeigen
                  versuche es mal, indem du
                  Code:
                  targetUrl => 'http://localhost',
                  ersetzt durch die IP Adresse des Servers. Also z.B.
                  Code:
                  targetUrl => 'http://127.0.0.1',
                  Gruß, Sebastian
                  Nein, die targetUrl ist ein Parameter der sendNma() Methode. Damit kann man der Notification eine URL (zb zur Visu) mitgeben auf die man dann auf dem Zielgerät klicken kann.

                  Zitat von johnnychicago Beitrag anzeigen
                  Da hak' ich direkt auch noch mal nach:

                  die delay=>xxx Anweisung ist mir bekannt - damit kann ich im Logikprozessor das Senden der Receive-GA verzögern. Evaluiert wird aber direkt.

                  Deine obige Notification - wie hälst Du die denn zurück, dass sie erst nach 15 Minuten sendet?
                  Mit dem gezeigten Code-Schnipsel halte ich nix zurück. Dies wird ausgeführt, nachdem das Garagentor 15min offen steht. Die Logik der 15min fehlt mir noch - ich warte auf die neue offizielle Version des wiregated. Fry hat in dem dazu passenden Logikprozessor noch ein paar Änderungen eingebaut die ich dafür nutzen möchte...

                  VG
                  Micha

                  Kommentar


                    Zitat von mivola Beitrag anzeigen
                    Noch eine Idee: nutzt du die von Fry eingeführten Patches des wiregated (if/while, pre-compiled, ...)? Wenn ja, könnte das ein Problem sein - ich nutze den originalen wiregated!
                    OK, daran könnte es liegen - ich habe den wiregated vom Fry.

                    Rentiert sich nicht, lange nach dem Problem zu suchen - immerhin funktioniert es ja.

                    Noch ein Hinweis (basierend auf meinen rudimentären Perl-Kenntnissen:
                    Code:
                            if ([COLOR=Red]$input = 1[/COLOR]) {
                                sendNma(event=>'Test', 
                                        description=>'test', debug=>1
                                );
                                return;
                            }
                    "$input = 1" ist eine Zuweisung, kein Vergleich. Dadurch wird $input immer auf "1" gesetzt und gleichzeitig ist die if-Bedingung immer wahr. Vergleiche lieber mit:
                    Code:
                    if ($input == 1) {
                    oder sogar
                    Code:
                    if (int($input) == 1) {
                    Ja, das habe ich ungefähr 2 Minuten später auch herausgefunden, dass da ein == hinsollte. Vor allem, wenn mal 0 und 1 unterschiedlich behandeln möchte

                    Kommentar


                      Fehlermeldung bei Nutzung von prowl

                      Hallo Miteinander,

                      nutze erfolgreich den Logikprozessor von fry auf meinem Wiregate. Danke dafür an fry für die tolle Arbeit.

                      Jetzt hab ich versucht die prowl Funktion zu nutzen und bekomme folgende Fehlermeldung wenn versucht wird eine Meldung abzuschicken:

                      500 Can't locate object method "new" via package "LWP::Protocol::https::Socket"

                      Hab rausgefunden, dass da libcrypt-ssleay-perl installiert werden sollte.
                      Mein Wiregate ist auf dem aktuellen Stand PL37 und ich hab auch noch nie was dazu installiert oder gepatcht.

                      Nun meine Frage: Kann mir jemand sagen wo ich Infos darüber bekomme, wie man diese Erweiterung installiert oder aber ist das eventuell im nächsten Update des Wiregate schon mit implementiert und ich warte einfach auf die Veröffentlichung und gut ist´s?

                      Schon mal Danke für die Antworten!

                      Gruss
                      Heiko

                      Kommentar


                        Das Prowl-Addon sollten wir bei Gelegenheit mal neu schreiben. Eleganter als eine eigene prowl=>... - Option wäre schlichtweg eine Funktion prowl(...), die man aus der translate=>sub{...}-Funktion aufruft. So habe ich meinen SMS-Versand über Samurai gelöst.

                        Hintergrund: der Logikprozessor ist zwischenzeitlich noch deutlich verbessert worden. Es gibt nun die Möglichkeit, über followup=>... auch Sequenzen festzulegen (also mehrere Aktionen in einer bestimmten Abfolge), außerdem gibt es zusätzlich zu receive=>... (löst Logik aus, wird bei timer-Logiken abgefragt) und fetch=>... (löst Logik nicht aus, wird aber bei Ausführung abgefragt) nun auch noch trigger=>... (löst Logik aus, wird aber nicht abgefragt). Für trigger kann man dann auch noch komplexe Folgen definieren, zB schalte das Licht nur aus, wenn 1. die Tür zugemacht und 2. auch noch das Tor zugefahren wurde.

                        Da ist m.E. eine Extraoption prowl=>... mit eigener Parameterübergabe usw zu teuer und zu unflexibel. Ist aber nur meine Meinung...

                        Ich poste das alles dann mal, sobald ElabNet den wiregated.pl mit den notwendigen Patches (if/while, plugin_cache, plugin_subscribe_read/write) ausgestattet hat.

                        Bzw. auf Nachfrage poste ich auch gerne wieder die aktuelle Version plus meinem gepatchten wiregated.pl.

                        VG, Fry

                        Kommentar


                          Zitat von Fry Beitrag anzeigen
                          Bzw. auf Nachfrage poste ich auch gerne wieder die aktuelle Version plus meinem gepatchten wiregated.pl.
                          Nachfrage

                          Kommentar


                            L.zip in L.tgz umbenennen und mit tar xvzf entpacken.

                            Neue Features u.a.:

                            followup=>... und followup(...)

                            trigger=>...

                            delay, cool, eibd_cache akzeptieren jetzt Argumente wie '3h' oder '20min'

                            Funktion samurai(...) für SMS-Versand (ist standalone, man kann es also auch einfach rauslöschen, wenn man es nicht braucht)

                            ...und ich hab sicher noch was vergessen.

                            Achtung: das Defaultverhalten bei read-requests auf transmit-Adressen wurde umgedreht. Statt ignore_read_requests=>1 (veraltet) gibt es jetzt die umgedrehte Option reply_to_read_requests=>1. Defaultmäßig wird NICHT auf read-Requests geantwortet.

                            Siehe Sample-Config oder fragt einfach hier im Forum. Bitte keine PN zum Logikprozessor.

                            Da ich massiv GA-Kürzel statt "nackter" GA-Adressen verwende, könnte es sein, dass hier und da Bugs drin sind. Über Bug Reports freue ich mich (naja, so wie man sich drüber freuen kann...)

                            Have fun!
                            Fry

                            Angehängte Dateien

                            Kommentar


                              Als Anwendungsbeispiel für die neuen trigger=> und followup=>... anbei meine Weckerlogik.

                              Dieser Code ermoeglicht es, die Multiroom-Audio-Anlage per CometVisu komfortabel als Wecker (mit Fade-in-Musik) einzusetzen.

                              Hier wiedergegeben nur als Einfachwecker (für eine Zone), die Vervielfältigung auf alle Zonen (wie es bei mir läuft) ist aber straightforward.

                              Nur 160 Zeilen!

                              VG, Fry

                              PS. Hier noch der passende Ausschnitt aus der CometVisu-Config, natürlich sind die GA-Kürzel durch die entsprechenden numerische GAs zu ersetzen:

                              Code:
                              <text><layout colspan="1" />Wecker</text>   
                              <switch mapping="Off_On" styling="Grey_Green"><layout colspan="1" />
                                      <address transform="DPT:1.001" writeonly="true">Alarm_set</address>
                                      <address transform="DPT:1.001" readonly="true">Alarm_set_Status</address>
                              </switch>
                              <slide min="0" max="24" step="0.125"><layout colspan="6" />
                                      <address transform="DPT:9.001" writeonly="true">Alarm_time_dec</address>
                                      <address transform="DPT:9.001" readonly="true">Alarm_time_dec_Status</address>
                              </slide>
                              <info><layout colspan="1" />
                                      <address transform="DPT:10.001" readonly="true">Alarm_time_Status</address>
                              </info>
                              <trigger value="1" mapping="Slumber"><layout colspan="1"/>
                                      <address transform="DPT:1.001">Alarm_slumber</address>
                              </trigger>
                              Angehängte Dateien

                              Kommentar


                                Fry --

                                Klasse - ich freu mich immer, wenn ich sowas nachlesen und nachvollziehen kann. Das hilft mir mehr als eine Beschreibung der Funktion.

                                Ich hab' allerdings ein paar Verständnisprobleme. Bin auch weit weg von meinem Haus, deswegen frag' ich ungetestet mal ein paar Details nach:

                                Code:
                                # Wecker an/aus
                                $logic{"Alarm_set"} = { receive=>"Alarm_set", execute_only_if_input_defined=>1,
                                               translate => sub { 
                                                   $plugin_info{"Logik_Alarm_set"}=$input;
                                                   followup({"Alarm_main"=>0}); # direkt danach aufrufen
                                               },
                                };
                                Du gibst bei mehreren Funktionen den 'execute_only_if_input_defined' an obwohl die Funktionen eigentlich nur einen receive-Parameter haben.

                                Was genau soll der bewirken? Ist das nicht sowieso dadurch gegeben, dass die Logik nur dann feuert, wenn ein Telegramm auf der GA eingeht?

                                Bei den Followups und Cancels fällt mir gerade auf, dass das sich wie GOTO und BREAK liest. Dijkstra wäre nicht Dein Freund


                                Code:
                                # Weckzeit einstellen
                                $logic{"Alarm_time"} = { receive=>"Alarm_time", execute_only_if_input_defined=>1,
                                                transmit=>"Alarm_time_Status", 
                                                translate => sub { 
                                                return undef unless $input=~/([0-2][0-9]):([0-5][0-9]):?([0-5][0-9])?$/;
                                                $plugin_info{"Logik_Alarm_time"}="$1:$2:01"; # 01 is a workaround for decode_dpt10-Bug
                                                knx_write("Alarm_time_dec_Status",$1+$2/60.);
                                                return $plugin_info{"Logik_Alarm_time"};
                                                },
                                                reply_to_read_requests=>1,
                                                followup=>{"Alarm_main"=>0}, # direkt danach aufrufen
                                };
                                Zusätzlich zum execute_only_... verstehe ich hier auch nicht, was das reply_to_read_requests macht. Der einzige, der hier readen könnte, wäre doch der Slider in der Visu. Wieso ist der noch mal in zwei GA's getrennt (alarm_time_dec und alarm_time_dec_status)? Und kann die Logik überhaupt feuern, wenn es keinen Input aus dem Alarm_time_dec gab, wegen 'execute_only...'?

                                Kommentar

                                Lädt...
                                X