Ankündigung
Einklappen
Keine Ankündigung bisher.
Neues Plugin: Logikprozessor.pl
Einklappen
X
-
Hallo,
ich möchte gerne mit dem Logikprozessor folgende Logik aufsetzen:
· wenn Luftfeuchtigkeit Keller > 60% und Taupunkt außen mindestens 5°C weniger als Taupunkt Keller dann Lüfter an sonst Lüfter aus
Bisher habe ich nur bestehende Logiken verändert und bin damit ganz gut klargekommen. Hier stoße ich aber an meine Grenzen. Kann mir jemand vielleicht einen Tipp geben, ob es etwas bestehendes gibt, woran ich mich orientieren kann. Oder ist das ganze so rudimentär, das jemand mir dafür einen Code zur Verfügung stellen könnte?
Danke schon mal vorab, SvenMfG, Sven
endlich eingezogen, aber noch lange nicht fertig...
Kommentar
-
So aus der Hand aufgeschrieben, ohne das getestet zu haben. Zweifelhafte Kommasetzung ist gegeben...
Code:beispiellogik => { receive=>['LF_Keller','TP_Aussen','TP_Keller'], transmit=>'luefter', translate=>sub{ if ($input->[0] < "60") {return 0;} // Luftfeuchte unter 60%, also aus if ($input->[1] < ($input->[2]-5)) {return 1;} // ein bei LF-Differenz else {return 0;} // ansonsten aus }, },
Obiges is allerdings eventuell etwas nervig, weil es bei jedem Update einer der GA's gestartet wird - je nach Einstellung der Sensoren schaltet das dann alle paar Sekunden, wenn's gerade am Limit hängt. Dem kann man abhelfen, indem man eine Hysterese einbaut, d.h. bei >5 Unterschied wird eingeschaltet, aber erst bei <3 Unterschied wird wieder ausgeschaltet.
Oder man macht einen Timer und kuckt einfach nur alle halbe Stunde drauf:
Aus dem receive=> wird ein fetch=> gemacht (fetch triggert die Logik nicht, holt aber Werte ab, wenn sie getriggert wird) und eine timer-Zeile einfügen:
Code:timer => { time => ['0:00+30m-23:59'] },
Du könntest Dir auch überlegen, ob Dir ein default-Status des Lüfters wichtig ist und den Ausgang als Treppenhauslicht parametrieren. Falls Dir ein nichtlaufender Lüfter als default passt, parametrierst Du 31 Minuten einschalten als Treppenlicht und ersetzt die 'return 0;' durch 'return undef;' in der Logik. Du schaltest mit de rLogik also den Lüfter nur ein, nie aus.
Natürlich umgekehrt parametriert, wenn der Lüfter per default an sein soll.
Das verhindert, dass bei Problemen an Sensoren oder Wiregate der Lüfter unvorhersehbar schaltet.
Kommentar
-
Moin zusammen,
in dem Versuch meine Szenen mit Logikprozessor auf Geräte zu erweitern die keine Szenen unterstützen komme ich einfach nicht weiter.
Meine Grundidee besteht darin bei Eingang einer Szenen-Nr. über die Szenen-GA unterschiedliche Werte auf diverse andere GA´s zu senden.
Hat da vielleicht einer einen Vorschlag wie der Code dazu aussehen könnte?
Bin leider ziemlicher Anfänger was Plugins angeht und komme mit meinem try and error einfach nicht weiter.
Schon einmal vielen Dank für eure Hilfe!!!
Gruß
Kay
Kommentar
-
Wenn Du mit einer einzigen Logik verschiedene Werte auf verschiedene GA's senden willst, kommst Du mit den Hausmitteln des Logikprozessors nicht weiter - er erlaubt nur senden des gleichen Wertes auf eine oder mehrere GA's. Du kannst das zwar mit knx_write umschiffen, aber ich finde es am einfachsten, mit mehreren Logiken zu arbeiten. Du benutzt halt eine Logik pro Ausgang, und wenn eine Szenen-GA reinkommt, werden alle aufgerufen. Wenn Du alles in eine grosse Logik packst und willst dann nach 2 Jahren mal was ändern, ist das immer unübersichtlich.
Die einfachen Logiken sehen dann so aus:
Code:szene_siebzehn => { receive=>'Szenen_GA', transmit=>'Output_GA', translate=>sub{ if ($input = 1) {return 7;} if ($input = 2) {return 3;} [... soviele Inputs Du eben brauchst...] else {return undef;} }, },
Kommentar
-
Zitat von johnnychicago Beitrag anzeigenSo aus der Hand aufgeschrieben, ohne das getestet zu haben. Zweifelhafte Kommasetzung ist gegeben...
MfG, Sven
endlich eingezogen, aber noch lange nicht fertig...
Kommentar
-
So, konnte gestern erst ausprobieren und es hat leider nicht auf anhieb geklappt. Aber nach etwas rum probieren habe ich es zum laufen bekommen.
Hier meine Änderungen:
Code:
Code:# Szenen-Erweiterungen %logic=( Szenen_siebzehn => { receive=>'Szenen_GA', transmit=>'Output_GA_1', translate=>sub{ if ($input == 0) {return 0;} if ($input == 1) {return 1;} if ($input == 2) {return 0;} else {return undef;} }, }, Szenen_achtzehn => { receive=>'Szenen_GA', transmit=>'Output_GA_2', translate=>sub{ if ($input == 0) {return 70;} if ($input == 1) {return 0;} if ($input == 2) {return 50;} else {return undef;} }, }, )
1. Logiken so "eingefasen" (bin blutiger Anfänger was Perl und Wiregate Plugins angeht):Code:%logic=( . . . )
Code:[INDENT][/INDENT]
Dazu eine Frage:
Mache ich das für jeden Logik-Block neu oder für alle Logiken nur einmal?
2. Das Doppel-Gleich (==) bei der AusgabeCode:if ($input == 0) {return 0;} )
Gibt es vielleicht irgendwo diese Basics zum nachlesen? Hatte schon gesucht aber leider nix gefunden.
Aber vielen Dank für eure Hilfe!!!
Nun kann ich weiter rum tüfteln.
Kommentar
-
Moin,
mit dem Logikprozessor wird eine Beispieldatei ausgeliefert.
Diese befindet sich im Ordner in dem auch die conf Datei ist.
Oder du schlägst bei Github nach.
Github Logikprozessor.conf_sample
Gruß, Sebastian
Kommentar
-
Guten Morgen,
ich habe das Problem, dass das Plugin laut Log auf den Bus sendet, es kommt allerdings nichts an (laut EIBlog wird nichts empfangen).
2017-08-10 06:26:44.529,Logikprozessor,1.1.51 5/1/3:1 -> $logic->{mal2}{receive}(Logik) -> 1/1/35:1 gesendet; ,0s,
2017-08-10 07:03:30.582,Logikprozessor,1.1.51 5/1/3:0 -> $logic->{mal2}{receive}(Logik) -> 1/1/35:0 gesendet; ,0s,
2017-08-10 07:03:33.723,Logikprozessor,1.1.51 5/1/3:1 -> $logic->{mal2}{receive}(Logik) -> 1/1/35:1 gesendet; ,0s,
2017-08-10 07:05:46.375,Logikprozessor,1.1.51 5/1/3:0 -> $logic->{mal2}{receive}(Logik) -> 1/1/35:0 gesendet; ,0s,
Das Empfangen von Werten über den Bus funktioniert, siehe obiges Log. Auch wird laut Log ein Wert an eine Gruppenadresse geschickt. In diesem Fall soll testweise eine Lampe geschalten werden auf 1/1/35. Hat jemand eine Idee woran das liegen kann? VG Tino
Lasse ich Warnungen mitloggen wird folgendes ausgegeben:
Code:2017-08-10 11:46:01.045,Logikprozessor,Naechster Aufruf der timer-Logik 'Test' morgen um 11:46. 2017-08-10 11:46:01.046,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 173. 2017-08-10 11:46:01.047,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 174. 2017-08-10 11:46:01.047,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 175. 2017-08-10 11:46:01.048,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 176. 2017-08-10 11:46:01.048,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 177. 2017-08-10 11:46:01.048,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 178. 2017-08-10 11:46:01.049,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 179. 2017-08-10 11:46:01.049,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 180. 2017-08-10 11:46:01.049,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 181. 2017-08-10 11:46:01.050,Logikprozessor,Warning: Use of uninitialized value $_ in smart match at (eval 2314) line 182. 2017-08-10 11:46:01.050,Logikprozessor,Warning: Use of uninitialized value $_ in smart match at (eval 2314) line 183. 2017-08-10 11:46:01.051,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 184. 2017-08-10 11:46:01.051,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 185. 2017-08-10 11:46:01.051,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 186. 2017-08-10 11:46:01.052,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 187. 2017-08-10 11:46:01.052,Logikprozessor,Warning: Use of uninitialized value $_ in pattern match (m//) at (eval 2314) line 188. 2017-08-10 11:46:01.053,Logikprozessor,Warning: Use of uninitialized value $dpt in concatenation (.) or string at (eval 2314) line 189. 2017-08-10 11:46:01.082,Logikprozessor,$logic->{Test}{transmit}(Logik) -> 1/1/35:1 gesendet (timer); ,0s,
Code:Aug 10 18:30:03 wiregate1622 /usr/sbin/wiregated.pl: WARN - None or unsupported DPT: sent to 1/1/35 value 1 Aug 10 18:30:03 wiregate1622 /usr/sbin/wiregated.pl: WARN - None or unsupported DPT: sent to 1/1/35 value 1
Zuletzt geändert von tinom86; 11.08.2017, 06:22.
Kommentar
-
Hallo zusammen, Hallo Fry,
Ich glaube, dass ich einen Bug gefunden habe. Zurerst einmal Danke für dieses geniale Plugin.
Kann es sein, dass der LP nicht auf DPT 5.003 hört?
Ich habe deine (Frys) Sonnenstandslogik übernommen (passender Post) und in der eibga.conf den DPT auf 5.003 eingestellt, weil es ja eine Gradangabe ist. Ich habe auch Werte auf den Bus bekommen. Andere Logiken reagierten aber nicht auf diesen Wert. Auch wenn ich den Wert auf den Bus geschrieben habe, dann passierte nicht.
Mit dem Auslesen den input-Hashes (passender Post) habe ich gemerkt, dass dort kein Wert enthalten ist. Nach dem Umstellen auf 5.001 geht es.
Habe ich irgendwo einen Denkfehler oder ist ein Bug im LP?
Viele Grüße,
Linuxer
Kommentar
Kommentar