Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
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
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:
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?
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
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:
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:
"$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:
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.
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...
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:
"$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
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?
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.
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...)
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...'?
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar