Zitat von Hannatz
Beitrag anzeigen
Ankündigung
Einklappen
Keine Ankündigung bisher.
Neues Plugin: Logikprozessor.pl
Einklappen
X
-
Hallo Fry,
zu später Stunde hier mal mein Problem, irgendwie checke ich das mit der Variable $workingday noch nicht so recht...?!
Code:PM_Sperre_Ein => { transmit=>'1/0/99', timer=>{ time=>['09:00+1h-18:00'], $workingday }, translate => 1 }, PM_Sperre_Aus => { transmit=>'1/0/99', timer=>{ time=>['04:30+30-8:45','18:05'], $workingday }, translate => 0 },
Danke und Gruß,
Hannatz
Kommentar
-
...und hier noch ein Problem:
Code:TV_per_Licht => { receive=>'1/1/33', transmit=>['1/1/54','1/1/51'], translate => 1, debug=>1 },
Code:2013-02-09 20:30:19.684,A_GroupValue_Write,1.1.254,1/1/54,01,1,,1.001,0,low,7,T_DATA_XXX_REQ,0
Code:2013-02-09 20:30:19.594,Logikprozessor,1.1.26 1/1/33:1 -> $logic{TV_per_Licht}{receive}(Logik) -> [1/1/54,1/1/51]:1 gesendet ,0.6s,
Bin für jede Hilfe dankbar,
Gruß Hannatz
Kommentar
-
Zitat von Hannatz Beitrag anzeigenHallo Fry,
zu später Stunde hier mal mein Problem, irgendwie checke ich das mit der Variable $workingday noch nicht so recht...?!
Code:PM_Sperre_Ein => { transmit=>'1/0/99', timer=>{ time=>['09:00+1h-18:00'], $workingday }, translate => 1 }, PM_Sperre_Aus => { transmit=>'1/0/99', timer=>{ time=>['04:30+30-8:45','18:05'], $workingday }, translate => 0 },
Danke und Gruß,
Hannatz
Du möchtest wahrscheinlich sowas wie
Code:timer => {time=>['04:30+30min-08:45','18:05'], workingday=>1 }, translate=>0},
Kommentar
-
Zitat von Hannatz Beitrag anzeigenWas läuft da falsch? Beide Adressen sind identisch in der eibga.conf eingetragen, hab´s extra per Weboberfläche noch mal geprüft...
VG, Fry
Kommentar
-
Wenn das Plugin meldet, es habe an beide Adressen gesendet, dann wurde knx_write zweimal aufgerufen. Warum knx_write nicht sendet ... da fällt mir nur wieder die eibga.conf ein. Kannst du die Ausschnitte mal posten?
Naja, rebootet habe ich zwar nicht, aber scheinbar braucht es dennoch 1-2 Tage Warmlaufzeit (das Plugin selber habe ich immer wieder neu gespeichert um es zu initialisieren).
Du möchtest wahrscheinlich sowas wie
Code:
Code:timer => {time=>['04:30+30min-08:45','18:05'], workingday=>1 }, translate=>0},
Gruß Hannatz
Kommentar
-
Ich bräuchte auch leider Hilfe, leider habe ich Schwierigkeiten mit der Timefunktion
Code:eibga.conf -> Status Garangentor [0/3/0] DPTId=1 DPTSubId=1.009 name=Rueckmeldung Garagentor zu garagentor => { receive=>'0/3/0', transmit=>'15/0/4', timer=>{ time=>['08:00','10:00','09:00+2m-09:30','13:00+1h-20:00'], weekend=> 1 }, translate => sub { $input<1 ? 1 : undef } , debug=>1},
Die GA 0/3/0 sendet alle 60 Sekunden den Status des Garagentors.
Nun möchte ich die Meldung über Garagentor "offen" an die transmitGA 15/0/4 nur zu bestimmten Zeitpunkten senden. Das klappt aber nicht.
Alle 60 Sekunden wird die Logik "garagentor" ausgeführt (nämlich immer dann, wenn der Status des Garagentors über den Bus gesendet wird). Meine Logik für die Zeitintervalle wird völlig ignonieriert.
Verstehe das einfach nicht.
So, Nachtrag, hab jetzt mal das in der Config eingetragene Beispiel eingesetzt:
Code:garagentor => { receive=>'0/3/0', transmit=>'15/0/4', timer=>{ time=>['08:00','10:00','09:00+2m-09:30','18:00+1h-20:00'], day_of_month=>'8..14', day_of_week=>'Di' }, translate => sub { $input==0 ? 1 : undef } , debug=>1},
Code:2013-03-17 15:00:28.500,Ansagen.pl,default:Garagentor silence,0s, 2013-03-17 15:00:28.507,Logikprozessor.pl,,0s,Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at (eval 756) line 512. 2013-03-17 15:00:33.038,Logikprozessor.pl,,0s,Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at (eval 758) line 512. 2013-03-17 15:00:43.933,Logikprozessor.pl,,0s,Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at (eval 760) line 512.
Kommentar
-
Kurios, sehr cool, das wars:
Code:garagentor => { fetch=>'0/3/0', transmit=>'15/0/4', timer=>{ time=>['08:00','10:00','09:00+2m-09:30','17:00+5m-20:00'], weekend=>1}, translate => sub { if(defined $input && int($input) == 0) { 1; } else {return undef;}},debug=>1},
Code:2013-03-17 17:13:26.237,Logikprozessor.pl,Naechster Aufruf der Timer-Logik 'garagentor' um 17:15. 2013-03-17 17:15:27.268,Logikprozessor.pl,Naechster Aufruf der Timer-Logik 'garagentor' um 17:20. 2013-03-17 17:15:27.269,Logikprozessor.pl,$logic{garagentor}{transmit}(Logik) -> 15/0/4:1 gesendet (Timer) ,0s, 2013-03-17 17:15:27.274,mpd_Player_6003.pl,Cycle retvalue,0s, 2013-03-17 17:15:28.233,Ansagen.pl,lfd_radio -> -> export MPD_HOST=192.168.2.111; export MPD_PORT=6608; /usr/bin/mpc add "Ansagen/Beep/03.wav" "Ansagen/Ereignisse/Garagentor.wav" "Ansagen/silence.wav"
OK, hab ich wohl was missverstanden, ich dachte immer recieve bedeutet, dass er die GA auslesen soll.
Nachtrag: Also muss mal wirklich sagen, dieses Plugin ist sagenhaft GEEEEIL ! Hab jetzt noch weitere Logiken eingebaut, RadioWecker, Temperatur, Muellabfuhr etc. -> Logiken, danach hab ich lange gesucht, warum hab ich das Plugin erst jetzt gefunden ?
Kommentar
-
[CG] Bekomme die Steuerung per Temperatur nicht hin?
Hallo,
ich versuche seit einer weile, mein Rollo per Temp zu steuern.
Ich die Außentemperatur zu groß soll der Rollo runter fahren.
Ich habe mir hierzu das Beispiel mit der Brause angeschaut und versucht zu übernehmen.
Code:aussen_zu_warm => { receive => '14/5/1', transmit => '0/0/66', transmit_changes_only => 1, translate => sub { return ($input gt 2) ? 70 : 20 }, debug => 1 },
Wenn die Temperatur( der Wert steht wohl im $input) größer als 2 ist wir 20 gesendet, wenn die Zahl kleiner ist wird 70 gesendet.
Egal ob ich gt 20 oder gt 1 eintrage. (Aussen aktuell ca. 5 Grad)
Bei mir wird aber immer 70 gesendet
Hier die Ausgabe vom Debug
Code:2013-03-23 16:46:54.684,Logikprozessor.pl,0.0.0 14/5/1:5.18 -> $logic{aussen_zu_warm}{receive}(Logik) -> 0/0/66:70 gesendet ,0s,
Es soll die Raumtemperatur mit der Außentemperatur verglichen werden.
Wenn der Raum kälter (bis 24 Grad) ist als aussen soll der Rolladen nicht bewegt werden.
Ist es im Raum >24 und ausen auch >=24 dann soll der Rollo zu fahren--
Gruß
Lothar
Kommentar
-
So nun kann ich mir selber antworten.
Es scheint an dem Vergleich mit gt zu liegen.
wenn ich anstatt "gt" ">" benutze funktioniert es.
Diese Variante funktionier.
Code:aussen_zu_warm => { receive => '14/5/1', transmit => '0/0/66', transmit_changes_only => 1, translate => sub { return ( $input > 24 ) ? 100 : 0; }, debug => 1 },
--
Gruß
Lothar
Kommentar
-
transmit_changes_only => 1 zeigt keine Wirkung
Hallo,
die Option transmit_changes_only => 1 soll dach verhindern, das wenn sich der Status nicht ändert auch nichts gesendet wird.
Laut Logfile wird immer das gleiche Ergebnis sehr regelmäßig gesendet.
Code:2013-03-24 09:11:28.626,Logikprozessor.pl,0.0.0 14/5/1:10.06 -> $logic{aussen_zu_warm}{receive}(Logik) -> 0/0/66:0 gesendet ,0s, 2013-03-24 09:12:43.827,Logikprozessor.pl,0.0.0 14/5/1:10.5 -> $logic{aussen_zu_warm}{receive}(Logik) -> 0/0/66:0 gesendet ,0s, 2013-03-24 09:13:59.165,Logikprozessor.pl,0.0.0 14/5/1:10.37 -> $logic{aussen_zu_warm}{receive}(Logik) -> 0/0/66:0 gesendet ,0s,
Code:aussen_zu_warm => { receive => '14/5/1', transmit => '0/0/66', transmit_changes_only => 1, translate => sub { return ( $input > 24 ) ? 100 : 0; }, debug => 1 },
--
Gruß
Lothar
Kommentar
-
Hallo zusammen,
jetzt muss ich mich doch auch mal mit einer Frage melden, nachdem Wiregate und Logikprozessor schon länger wunderbar bei mir laufen.
Momentan habe ich eine Logik, die sich nicht 100%ig so verhält, wie ich es erwarte. Folgender Code öffnet ein Fenster in Abhängigkeit von Innen- und Außentemperatur:
Code:fenster_vorrat => { receive=>['5/5/10','5/6/0'], transmit=>'4/0/5', translate => sub { if ($input->[1] gt 14) { return 1; } else { if ($input->[0] gt 15) { return 0; } else { if ($input->[0] lt 13) { return 1; } else { return undef; }; }; }; } , debug=>1} ,
Kommt ein Telegramm auf 5/5/10 (Innen), wird die 5/6/0 (Aussen) gelesen und korrekt gerechnet => 0 ist Fenster Auf
Kommt jedoch auf 5/6/0 ein Telegramm (siehe Zeile 4-6), schein die 5/5/10 nicht korrekt nachgelesen zu werden.
Dazu ist zu sagen dass 5/5/10 ein WG-Temperatur-Fühler ist, daher wohl auch kein Lese-Telegramm auf dem Bus. Ich kann somit aber nicht checken, ob der Fühler ausgewertet wird, oder nicht.
Auf jeden Fall hätte ich auch in den Fällen 4-6 (s.u.) eine 0 als Ergebnis erwartet, da sich die Werte inhaltlich nicht verändert haben, nur der Auslöser ist ein anderer.
Ich hatte auch schon gt/lt durch </> ersetzt, bringt auch nix.
Code:0.0.0 5/5/10:17.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 gesendet 0.0.0 5/5/10:17.5 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 gesendet 0.0.0 5/5/10:17.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 gesendet 1.1.35 5/6/0:12.8 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:1 gesendet 1.1.35 5/6/0:12.9 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:1 gesendet 1.1.35 5/6/0:12.8 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:1 gesendet
Beste Grüße, Dirk
________________________________________
Haus ist fertig - KNX wird's nie werden ;-)
Kommentar
-
Grundsätzlich ist "int(blabla) > 15" sauberer als "blabla gt 15". Aber das ist nicht der wichtigste Punkt hier.
Ergänze mal "eibd_cache=>300", aktiviere im WG den eibd-Cache und lasse die Innentemperatur zyklisch alle 5min oder besser noch etwas häufiger senden.
Dann findet die Logik den letzten Cache-Wert, wenn sie ihn braucht, und sollte funktionieren.
VG, Fry
Kommentar
-
Hallo Fry,
habe Deine Empfehlungen ausprobiert, es scheint aber noch was zu fehlen, klappt immer noch nicht, je nach Absender geht das Fesnter ständig auf und zu.
Ich poste nochmal die Config im aktuellen Stand:
Code:fenster_vorrat => { receive=>['5/5/10','5/6/0'], transmit=>'4/0/5', translate => sub { if (int($input->[1]) > 14) { return 1; } else { if (int($input->[0]) > 15) { return 0; } else { if (int($input->[0]) < 13) { return 1; } else { return undef; }; }; }; } , debug=>1, eibd_cache=>300, transmit_changes_only => 1 } ,
Code:5/5/10:18.25 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 gesendet ,0.3s, 5/6/0:14.3 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:1 gesendet ,0.3s, 5/5/10:18 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 gesendet ,0.3s, 5/5/10:18 -> $logic{fenster_vorrat}{receive}(Logik) -> ARRAY(0x9eec140):0 unverändert -> nichts zu senden ,0.3s, 5/6/0:14.2 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:1 gesendet ,0.3s, 5/5/10:18 -> $logic{fenster_vorrat}{receive}(Logik) -> 4/0/5:0 gesendet ,0.3s, 5/5/10:18 -> $logic{fenster_vorrat}{receive}(Logik) -> ARRAY(0x9f1ca20):0 unverändert -> nichts zu senden ,0.3s,
Beste Grüße, Dirk
________________________________________
Haus ist fertig - KNX wird's nie werden ;-)
Kommentar
Kommentar