Naja - jetzt basteln wir aber ein bißchen viel, um eine einfache Treppenlichtfunktion hinzubekommen
Für mich persönlich habe ich ja nun eine Lösung für das obige Beispiel.
Spannender für mich (evtl. auch andere) wäre ja nun die Frage: hab ich hier einen Bug gefunden (aktuelles Verhalten ist ungleich der Doku)?
Und falls ja - reicht dieser Thread für die Verfolgung oder gibt es einen anderen Weg wie Bugs zum Logikprozessor geordnet gesammelt werden?
Bin heute gleich über das nächste Problem gestolpert:
Die Timer funktionieren auch nicht so, wie ich es von der Doku erwartet hätte. Wenn es keinen Bustraffic gibt auf den der Logikprozessor hört, passiert es, dass Timer nur verspätet aufgerufen werden. Vermutlich fällt das bei Leuten mit voll gefüllten Logiken nicht auf.
Bei meiner jungfreulichen Logik mit nur zwei Einträgen aber eben doch.
Als konkretes Beispiel die folgende Logik.
Zu einem definierten Zeitpunkt (im Beispiel für Testzwecke jede Minute) wird geprüft, ob eine GA gesetzt ist.
Falls ja, soll die GA zur gewünschten Uhrzeit zurückgesetzt werden sonst nichts passieren.
Wenn auf GA 15/2/0 regelmäßig etwas passiert, wird auch der Timer zur korrekten Zeit aufgerufen.
Man sieht auch in der Plugin-Übersicht, dass der "Aufrufzyklus" definiert ist.
Wenn aber der Timer "undef" zurückgibt, und dann auf den GAs des Logikprozessors in der nächsten Minute nichts mehr passiert, kommt der Logikprozessor durcheinander:
- die Cycle-Time für das Plugin ist nicht mehr gesetzt (die nächste Ausführung also nicht mehr garantiert)
- Die Variable "Logikprozessor.pl__einmalige_sperre_bewaesserung_l oesen_timer" ist aber immer noch (zunächst) ohne Effekt gesetzt. Eigentlich will der Logikprozessor die Logik also zur korrekten Zeit ausführen.
Wenn jetzt irgendwann später auf der GA 15/2/0 doch eine 1 gesetzt wird, wacht der Logikprozessor auf.
Dann stellt der Logikprozessor fest, dass der Timer längst überfällig ist und führt nun meine Logik zur völlig falschen Zeit aus. Mit der oben definierten Logik wird meine 1 auf GA 15/2/0 sofort wieder auf 0 zurückgestellt, was nicht Sinn der Erfindung war.

Für mich persönlich habe ich ja nun eine Lösung für das obige Beispiel.
Spannender für mich (evtl. auch andere) wäre ja nun die Frage: hab ich hier einen Bug gefunden (aktuelles Verhalten ist ungleich der Doku)?
Und falls ja - reicht dieser Thread für die Verfolgung oder gibt es einen anderen Weg wie Bugs zum Logikprozessor geordnet gesammelt werden?
Bin heute gleich über das nächste Problem gestolpert:
Die Timer funktionieren auch nicht so, wie ich es von der Doku erwartet hätte. Wenn es keinen Bustraffic gibt auf den der Logikprozessor hört, passiert es, dass Timer nur verspätet aufgerufen werden. Vermutlich fällt das bei Leuten mit voll gefüllten Logiken nicht auf.
Bei meiner jungfreulichen Logik mit nur zwei Einträgen aber eben doch.
Als konkretes Beispiel die folgende Logik.
Zu einem definierten Zeitpunkt (im Beispiel für Testzwecke jede Minute) wird geprüft, ob eine GA gesetzt ist.
Falls ja, soll die GA zur gewünschten Uhrzeit zurückgesetzt werden sonst nichts passieren.
Code:
# 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+1m-23:30'], }, translate => sub { plugin_log($plugname, "Timer tatsächlich aufgerufen"); return ($input eq 1) ? 0 : undef; }, debug => 1 }
Man sieht auch in der Plugin-Übersicht, dass der "Aufrufzyklus" definiert ist.
Wenn aber der Timer "undef" zurückgibt, und dann auf den GAs des Logikprozessors in der nächsten Minute nichts mehr passiert, kommt der Logikprozessor durcheinander:
- die Cycle-Time für das Plugin ist nicht mehr gesetzt (die nächste Ausführung also nicht mehr garantiert)
- Die Variable "Logikprozessor.pl__einmalige_sperre_bewaesserung_l oesen_timer" ist aber immer noch (zunächst) ohne Effekt gesetzt. Eigentlich will der Logikprozessor die Logik also zur korrekten Zeit ausführen.
Wenn jetzt irgendwann später auf der GA 15/2/0 doch eine 1 gesetzt wird, wacht der Logikprozessor auf.
Dann stellt der Logikprozessor fest, dass der Timer längst überfällig ist und führt nun meine Logik zur völlig falschen Zeit aus. Mit der oben definierten Logik wird meine 1 auf GA 15/2/0 sofort wieder auf 0 zurückgestellt, was nicht Sinn der Erfindung war.
Kommentar