Eine vernünftige Doku (statt der Sample-Config) könnte man ja mal machen (einfach aus der Sample-Config rauskopieren und besser formatieren).
Ankündigung
Einklappen
Keine Ankündigung bisher.
Neues Plugin: Logikprozessor.pl
Einklappen
X
-
Zitat von Fry Beitrag anzeigenEin Hinweis von meiner Seite: wenn durch einen dieser Bugfixes das Verhalten des LP verändert wird, sollte explizit darauf hingewiesen werden.
Das betrifft zB den Fall receive==transmit. Ohne "delay" macht das wenig Sinn und wird vom LP abgefangen in der Weise, dass er versucht eine Endlosschleife zu vermeiden. Mit "delay" hat das eine (sogar häufige) Anwendung, nämlcih als "Repeater" für Zustände von Aktoren, die ihren Zustand nicht regelmäßig senden können. Das ist zB bei mir so für die Stellwerte der Heizungsventile.
Das einfache von dir dokumentierte Treppenlicht-Beispiel
Code:[COLOR=#0086B3][FONT=Consolas]stair[/FONT][/COLOR][COLOR=#333333][FONT=Consolas] [/FONT][/COLOR][COLOR=#A71D5D][FONT=Consolas]=>[/FONT][/COLOR][COLOR=#333333][FONT=Consolas] { [/FONT][/COLOR][COLOR=#0086B3][FONT=Consolas]receive[/FONT][/COLOR][COLOR=#A71D5D][FONT=Consolas]=>[/FONT][/COLOR][COLOR=#183691][FONT=Consolas]'1/2/9'[/FONT][/COLOR][COLOR=#333333][FONT=Consolas], [/FONT][/COLOR][COLOR=#0086B3][FONT=Consolas]transmit[/FONT][/COLOR][COLOR=#A71D5D][FONT=Consolas]=>[/FONT][/COLOR][COLOR=#183691][FONT=Consolas]'1/2/9'[/FONT][/COLOR][COLOR=#333333][FONT=Consolas], [/FONT][/COLOR][COLOR=#0086B3][FONT=Consolas]delay[/FONT][/COLOR][COLOR=#A71D5D][FONT=Consolas]=>[/FONT][/COLOR][COLOR=#333333][FONT=Consolas]600, [/FONT][/COLOR][COLOR=#0086B3][FONT=Consolas]translate[/FONT][/COLOR][COLOR=#333333][FONT=Consolas] [/FONT][/COLOR][COLOR=#A71D5D][FONT=Consolas]=>[/FONT][/COLOR][COLOR=#333333][FONT=Consolas] 0, },[/FONT][/COLOR]
Habe beim schnellen überfliegen auch keinen Code (mehr) gefunden, der sich um die Endlossschleife kümmern würde. eibd_backend_address wird z.B. nur noch für Log-Ausgaben mit Warnungen vor einer cycle-Logik verwendet. Das ist möglicherweise so auch korrekt, denn auch alles was von der comet_visu kommt, hat die eibd_backend_address.
Siehe sonst meinen allerersten Post mit Beispiel + Logausgaben: https://knx-user-forum.de/forum/öffe...170#post842170)
Kommentar
-
Ja, richtig. Das "stair"-Beispiel war veraltet und fehlerhaft.
Unter "zu vermeidender Endlosschleife" habe ich Situationen verstanden, wo der LP immer wieder sich selbst antwortet, und zwar ohne Verzögerung. Sobald ein "delay" drin ist, kann so eine Endlosschleife sehr wohl die Intention des Users sein. Die Doku war in dieser Hinsicht veraltet.
Das Abfangen von (einfachen) Endlosschleifen funktionierte vielleicht mal, ist aber mittlerweile lange nicht mehr getestet worden. Es hat außerdem bei komplexeren Configs gar keine Chance - dazu müsste der LP den Code wesentlich tiefer analysieren, was wieder nicht gewünscht ist - es soll ja einfach bleiben.
Danke für deine Edits!
VG, Fry
Kommentar
-
Zitat von CornholioLU Beitrag anzeigenHi, ich bin gerade auch bei den ersten Versuchen mit dem tollen Plugin, jedoch habe ich bei folgender Logik ein Problem:
Code:EZWaldSperren => { receive=>['14/0/40','7/1/1'], fetch=>'6/3/3', transmit=>'6/3/3', translate => sub { (int($input->[0]) && !int($input->[1])) ? 1 : 0 }, debug=>1 },
Ziel der Logik ist die Jalousie zu sperren (6/3/3 -> 1) (und dementsprechend hoch zu fahren) wenn das Fenster geöffnet (7/1/1 -> 0) wird. 14/0/40 ist ein globaler "Schalter" um dieses Sperren über den Fenstergriff zu erlauben.
Nun funktioniert die Logik aber nicht immer. Meistens geht es erst beim 2. mal öffnen (also: auf -> zu -> auf), so wie hier:
Code:2015-07-05 18:35:50.191,Logikprozessor.pl,1.1.50 7/1/1:0 -> $logic->{EZWaldSperren}{receive}(Logik) -> 6/3/3:0 gesendet; ,0.9s, 2015-07-05 18:35:53.858,Logikprozessor.pl,1.1.50 7/1/1:1 -> $logic->{EZWaldSperren}{receive}(Logik) -> 6/3/3:0 gesendet; ,0s, 2015-07-05 18:35:55.313,Logikprozessor.pl,1.1.50 7/1/1:0 -> $logic->{EZWaldSperren}{receive}(Logik) -> 6/3/3:1 gesendet; ,0s, [COLOR=#111111][FONT=Arial][SIZE=15px][/SIZE][/FONT][/COLOR]
Danke,
Emmanuel
Ich antworte mir mal selbst:
Es scheint, als ob die Logiken in denen Werte verwendet werden die nicht im eibd cache sind (oder einfach nur älter als xxx sekunden) nicht richtig funktionieren. Ich dachte das Plugin würde beim auslösen einer Logik für sämtliche Adressen in receive und fetch die Werte anfordern und auch auf die Antwort warten. Scheint aber nicht so. Gibt es da einen Trick um solange mit der Auswertung zu warten bis sämtliche Werte gelesen wurden?
(aktuell sende ich einfach zyklisch, würde das aber lieber nicht tun)
Danke,
Emmanuel
Kommentar
-
Zitat von CornholioLU Beitrag anzeigenGibt es da einen Trick um solange mit der Auswertung zu warten bis sämtliche Werte gelesen wurden?
(aktuell sende ich einfach zyklisch, würde das aber lieber nicht tun)
erstens: zyklisch senden ist nicht schlimm. Ich finde es sogar besser, da so auch ein Teilnehmer den Status bekommt, der zum initialen Sendezeitpunkt nicht "anwesend" war.
zweitens: schau mal in die conf_sample zum Stichwort eibd_cache, evtl. hilft das.
VG
Micha
Kommentar
-
Zitat von mivola Beitrag anzeigen
Hi,
erstens: zyklisch senden ist nicht schlimm. Ich finde es sogar besser, da so auch ein Teilnehmer den Status bekommt, der zum initialen Sendezeitpunkt nicht "anwesend" war.
zweitens: schau mal in die conf_sample zum Stichwort eibd_cache, evtl. hilft das.
VG
Micha
Hi,
in den allermeisten Fällen ist zyklisch senden ja kein Problem, nur hat es mich halt gewundert, dass nicht auf die Response zum Read gewartet wird bei den Adressen in receive und fetch.
Ich habe jetzt einfach eine Logik die alle 300sekunden im Fetch Teil sämtliche betroffenen Adressen abfragt, so müssen diese Aktoren nicht aktiv zyklisch senden und der eibd-cache bleibt trotzdem frisch:
Code:refresh => { receive=>'14/5/100', transmit_on_startup=>1, fetch=>['6/3/5','6/3/6','6/3/15','6/3/16','6/3/2','6/3/3','6/3/13','6/3/14','6/3/4','6/3/0','6/3/1','6/3/7','6/3/8','6/3/9','6/3/10','6/3/11','6/3/12','14/0/40'], transmit=>'14/5/100', translate=>1, delay=>300 }
Kommentar
-
Hallo zusammen,
Die letzte Änderung von bluegaspode (das Trennen der Timer-Schleife in zwei Schleifen) hat zwar einen Bug korrigiert, aber auch dazu geführt, dass der Logikprozessor unnötigerweise für "cool"-Timer auch aufgerufen wurde (um dann nichts zu tun außer interne Verwaltung, einmal im Kreis). Das hat bei mir (>1200 Logiken) zu einer signifikanten Verlangsamung des LP geführt. Nun gepatcht und ins Github hochgeladen.
Viele Grüße,
Fry
Kommentar
-
@CornholioLU: für diese Aufgabe gibt es eine geschicktere Lösung: Dein umfangreicher "fetch" blockiert nämlich den Logikprozessor und damit den Wiregate für jeweils eine Sekunde, falls einer oder mehrere der Aktoren nicht antworten. Geschickter ist da ein "non-blocking-read":
Code:knx_write('6/3/5',0,$eibgaconf{'6/3/5'}{DPTId},2); # die 2 heisst: setze read-request ab, aber warte nicht auf Antwort ...
VG, Fry
Kommentar
-
Hallo,
ich habe ein Problem mit einer Logikprozessor-Regel.
Über meine Wetterstation wird bei Windalarm die Raffstore hochgefahren. Leider gibt es kein Objekt, dass bei keinem Windalarm die letzte Position angefahren wird. Daher war der Plan, per Logik auf den Windalarm zu lauschen und eine definierte Zeit später die Raffstore einfach runter zu fahren.
Folgende Logik habe ich im EInsatz:
Code:# Nach Auslösen des Windalarms wird mit einer Zeitverzögerung von 20 min automatisch die folgenden Raffstore heruntergefahren. # 10/1/3: Windalarm # 3/1/0: Raffstore Schlafzimmer auf/ab # 3/3/13: Raffstore Wohnen auf/ab # 3/3/0: Raffstore Wohnen Nord auf/ab # 3/3/14: Raffstore Küche auf /ab # delay: 1200s = 20 min Windalarm_End_Shutter_down => { receive=>'10/1/3', transmit=>['3/1/0','3/3/13','3/3/0','3/3/14'], delay=>1200, translate => sub { return 1 if $input = 1; return 0;}, debug=>1 },
Zeitlicher Ablauf:- Letzter Windalarm heute:
Code:
2015-07-25 21:30:16.786,A_GroupValue_Write,1.1.20,10/1/3,01,1,DPT_Alarm,1.005,0,low,6,T_DATA_XXX_REQ,0
- LP-Logik wird getriggert:
Code:
2015-07-25 21:30:16.879,Logikprozessor.pl,1.1.20 10/1/3:1 -> $logic->{Windalarm_End_Shutter_down}{receive}(Logik) -> [3/1/0,3/3/13,3/3/0,3/3/14]:1 wird in 1200s gesendet; ,0s,
- Aktion vom LP:
Code:
2015-07-25 21:50:16.711,A_GroupValue_Write,1.1.20,10/1/3,00,0,DPT_Alarm,1.005,0,low,6,T_DATA_XXX_REQ,0
Auf den Adressen 3/1/0,3/3/13,3/3/0,3/3/14 habe ich danach keine einträge im Protokoll mehr.
Wo ist in meiner Logik der Fehler?
Danke für jegliche Tipps.
VG AlexGruß
alexbeer
Kommentar
- Letzter Windalarm heute:
-
Zitat von alexbeer Beitrag anzeigenLeider gibt es kein Objekt, dass bei keinem Windalarm die letzte Position angefahren wird. Daher war der Plan, per Logik auf den Windalarm zu lauschen und eine definierte Zeit später die Raffstore einfach runter zu fahren.
VG
Micha
Kommentar
-
Hallo Micha,
im Zweifel fahren die Raffstoren dann wieder...
das funktioniert aber so auch noch nicht zufriedenstellend, da innerhalb dieser 20 min ein neuer Status auf der lauschenden GA kommt und somit die 20 min von neu starten - hab ich zumindest den Eindruck.
Dein Einwand ist daher mehr als berechtigt.... Ich werde das mal umbauen.
VG AlexGruß
alexbeer
Kommentar
-
Jetzt benötige ich doch nochmal Hilfe, denn meine Beregnungslogik funktioniert immer noch nicht wie gewünscht
Zur Problemvorstellung, in der Visu habe ich die folgenden 2 Buttons:
"Beregnung Aktiviert" geht direkt auf das Sperrobjekt meines Aktors. Ich kann damit dauerhaft und unbefristet unabhängig von irgendeiner Logik die Beregnung stoppen.
"Einmalig Aussetzen" wird derzeit noch manuell zu Regenzeiten verwendet. Der Button geht auf eine virtuelle GA. Wird der Button aktiviert, wird auch automatisch die Beregnung gesperrt (funktioniert soweit).
An jedem Tag um 09:00 Uhr soll geprüft werden, ob "Einmalig Aussetzen" aktiviert ist. Falls ja, wird die Sperre zurückgenommen. Diese Logik funktioniert aber nicht.
Hier mein aktueller Code:
Code:# wenn einmalige Sperre aktiviert (oder deaktiviert) wird, dieses auf die eigentliche Sperre übertragen einmalige_sperre_bewaesserung_uebertragen => { receive => '15/2/0', transmit => '15/0/0', translate => sub {$input}, debug => 1 }, memory_einmalige_sperre => { transmit=>'15/2/0', reply_to_read_requests=>1, debug => 1 }, # wenn einmalige Sperre aktiviert, dann zum gegebenen Zeitpunkt die einmalige Sperre zurücksetzen. # über die Logik "einmalige_sperre_bewaesserung_uebertragen" wirkt sich das ganze auch auf die Hauptsperre aus einmalige_sperre_bewaesserung_loesen => { fetch => '15/2/0', transmit => '15/2/0', timer=>{ time=>['09:00'], }, translate => sub { return ($input eq 1) ? 0 : undef; }, debug => 1 },
'einmalige_sperre_bewaesserung_uebertragen' => funktioniert. Sorgt dafür, dass der zweite Button seine Befehle auf den ersten überträgt.
'memory_einmalige_sperre' => soll den aktuellen Status der virtuellen GA verwalten => Read Request werden korrekt mit dem aktuellen Status beantwortet
'einmalige_sperre_bewaesserung_loesen' => ist mein Sorgenkind.
Der 'fetch' auf 15/2/0 läuft irgendwie ins Leere und ist morgens um 09:00 IMMER '0' (auch wenn der Button aktiviert ist). Interessanterweise bemerke ich dass ein knx_read ausgeführt wird der sogar eine '1' liefert. Aber da scheint die Logik schon längst ausgeführt worden zu sein mit irgendeinem uninitialisiertem Wert?
Kommentar
-
Zitat von bluegaspode Beitrag anzeigenDer 'fetch' auf 15/2/0 läuft irgendwie ins Leere und ist morgens um 09:00 IMMER '0' (auch wenn der Button aktiviert ist). Interessanterweise bemerke ich dass ein knx_read ausgeführt wird der sogar eine '1' liefert. Aber da scheint die Logik schon längst ausgeführt worden zu sein mit irgendeinem uninitialisiertem Wert?
VG
Micha
Kommentar
Kommentar