NEWS
Verzögerung abbrechen
-
Hallo zusammen,
ich habe mir ein Script gebastelt, was mein Aussenlicht steuert.
Mitlerweile ist es ganz schön gewachsen :-), aber das "Problem" ist relativ weit oben.Was will ich im Grunde erreichen?
Vor meiner Haustür habe ich zwei Lampen. Eine Deckenlampe und eine Wandlampe.
Diese kann ich mit einen Serienschalter schalten.Wenn mind. ein Schalter an ist, soll ein weiteres Aussenlicht "um die Hausecke" mit angeschaltet werden.
Wenn beide Schalter aus sind, soll das "Eckenlicht" erst mit einer Verzögerung von 3 Minuten ausgehen.So weit so gut, es funktioniert alles.
Jetzt ist nur ein Fall eingetreten, den ich auch noch "abfangen" möchte.
Aussenlicht Decke war an.
Ich wollte aber das Wandlicht einschalten.
Leider habe ich zuerst das Deckenlicht ausgeschaltet und dann direkt das Wandlicht eingeschaltet.
Für mich war alles in Ordnung.
Allerdings ist meine Schaltung weiter gelaufen und hat, als kurz beide Lichter aus waren (der Zustand hat keine 2 Sekunden gedauert), nach 3 Minuten das Eckenlicht auch ausgeschaltet.
Was ja auch zunächst richtig ist. Beide Aussenlampen aus -> Eckenlicht auch aus mit 3min Verzögerung.Eigentlich müsste das Eckenlicht ja wieder angehen, weil der entgültige Zustand ja so ist, dass wenn mind. ein Aussenlicht an ist auch das Eckenlicht angeht.
Ich kann mir es mir nur so erklären, dass das Programm noch am laufen war (3 Minuten) und daher nicht auf eine neuen Trigger reagiert hat.Wie seht ihr das und wie löse ich es elegant, damit solche Schalter "Verdrücker" keine Auswirkung haben.

-
Hallo zusammen,
ich habe mir ein Script gebastelt, was mein Aussenlicht steuert.
Mitlerweile ist es ganz schön gewachsen :-), aber das "Problem" ist relativ weit oben.Was will ich im Grunde erreichen?
Vor meiner Haustür habe ich zwei Lampen. Eine Deckenlampe und eine Wandlampe.
Diese kann ich mit einen Serienschalter schalten.Wenn mind. ein Schalter an ist, soll ein weiteres Aussenlicht "um die Hausecke" mit angeschaltet werden.
Wenn beide Schalter aus sind, soll das "Eckenlicht" erst mit einer Verzögerung von 3 Minuten ausgehen.So weit so gut, es funktioniert alles.
Jetzt ist nur ein Fall eingetreten, den ich auch noch "abfangen" möchte.
Aussenlicht Decke war an.
Ich wollte aber das Wandlicht einschalten.
Leider habe ich zuerst das Deckenlicht ausgeschaltet und dann direkt das Wandlicht eingeschaltet.
Für mich war alles in Ordnung.
Allerdings ist meine Schaltung weiter gelaufen und hat, als kurz beide Lichter aus waren (der Zustand hat keine 2 Sekunden gedauert), nach 3 Minuten das Eckenlicht auch ausgeschaltet.
Was ja auch zunächst richtig ist. Beide Aussenlampen aus -> Eckenlicht auch aus mit 3min Verzögerung.Eigentlich müsste das Eckenlicht ja wieder angehen, weil der entgültige Zustand ja so ist, dass wenn mind. ein Aussenlicht an ist auch das Eckenlicht angeht.
Ich kann mir es mir nur so erklären, dass das Programm noch am laufen war (3 Minuten) und daher nicht auf eine neuen Trigger reagiert hat.Wie seht ihr das und wie löse ich es elegant, damit solche Schalter "Verdrücker" keine Auswirkung haben.

@Doppellhelix sagte: Programm noch am laufen war (3 Minuten)
Setze mal den Haken bei "löschen falls läuft".
-
Oha. Das war einfach.
Danke sehr :-)
-
Das hat leider nichts gebracht. Oder habe ich "löschen falls läuft" an der falschen sTelle angehakt?

-
Guten Morgen,
der erste Test sieht ganz gut aus.
Ich habe aber jetzt doch ein paar Fragen, damit ich das verstehe.
Die Funktion "Aussenlicht_steuern" läuft so ab:
Falls die drei Bedingunen eintreten, passiert erstmal nichts weiter, wegen dem Stop mit Namen "Timeout"
Nach zwei Sekunden wird dann der Stop mit Namen "Timeout" aufgehoben, bzw fortgeführt.Was ich aber noch nicht verstehe ist diese "Stop Timeout" auch an den anderen Stellen in diesem Programm.
Warum muss an diesen Stellen auch ein Stop "Timeout"? Die haben doch mit dem Programmablauf in der Funktion "Aussenlicht_steuern" erstmal nichts zu tun.
Und warum muss ich an den beiden anderen Stellen nicht eine Fortführung einfügen?
Z.b. links in dem Trigger "Aussenlicht bei Sonnenaufgang"
Der Sonnenaufgang kommt. Es kommt zu einem Stop und mehr passiert doch dann nicht, oder?Und wofür ist dann die Funktion "löschen falls läuft", die Paul53 mir zuerst vorgeschlagen hat.
Danke für die Hilfe und die Erklärung.
Gruß Helix

-
Guten Morgen,
der erste Test sieht ganz gut aus.
Ich habe aber jetzt doch ein paar Fragen, damit ich das verstehe.
Die Funktion "Aussenlicht_steuern" läuft so ab:
Falls die drei Bedingunen eintreten, passiert erstmal nichts weiter, wegen dem Stop mit Namen "Timeout"
Nach zwei Sekunden wird dann der Stop mit Namen "Timeout" aufgehoben, bzw fortgeführt.Was ich aber noch nicht verstehe ist diese "Stop Timeout" auch an den anderen Stellen in diesem Programm.
Warum muss an diesen Stellen auch ein Stop "Timeout"? Die haben doch mit dem Programmablauf in der Funktion "Aussenlicht_steuern" erstmal nichts zu tun.
Und warum muss ich an den beiden anderen Stellen nicht eine Fortführung einfügen?
Z.b. links in dem Trigger "Aussenlicht bei Sonnenaufgang"
Der Sonnenaufgang kommt. Es kommt zu einem Stop und mehr passiert doch dann nicht, oder?Und wofür ist dann die Funktion "löschen falls läuft", die Paul53 mir zuerst vorgeschlagen hat.
Danke für die Hilfe und die Erklärung.
Gruß Helix

@Doppellhelix sagte: wofür ist dann die Funktion "löschen falls läuft"
Sie sollte das gleiche machen wie die 3 "stop timeout" im Vorschlag von @asgothian: Bei jedem "steuere" auf den DP "Schalter Aussenlampe Ecke" wird ein laufender Timer gestoppt.
-
Guten Morgen,
der erste Test sieht ganz gut aus.
Ich habe aber jetzt doch ein paar Fragen, damit ich das verstehe.
Die Funktion "Aussenlicht_steuern" läuft so ab:
Falls die drei Bedingunen eintreten, passiert erstmal nichts weiter, wegen dem Stop mit Namen "Timeout"
Nach zwei Sekunden wird dann der Stop mit Namen "Timeout" aufgehoben, bzw fortgeführt.Was ich aber noch nicht verstehe ist diese "Stop Timeout" auch an den anderen Stellen in diesem Programm.
Warum muss an diesen Stellen auch ein Stop "Timeout"? Die haben doch mit dem Programmablauf in der Funktion "Aussenlicht_steuern" erstmal nichts zu tun.
Und warum muss ich an den beiden anderen Stellen nicht eine Fortführung einfügen?
Z.b. links in dem Trigger "Aussenlicht bei Sonnenaufgang"
Der Sonnenaufgang kommt. Es kommt zu einem Stop und mehr passiert doch dann nicht, oder?Und wofür ist dann die Funktion "löschen falls läuft", die Paul53 mir zuerst vorgeschlagen hat.
Danke für die Hilfe und die Erklärung.
Gruß Helix

@Doppellhelix sagte in Verzögerung abbrechen:
Und wofür ist dann die Funktion "löschen falls läuft", die Paul53 mir zuerst vorgeschlagen hat.
Ich beantworte die 2. Frage zuerst.
Der Haken bei
löschen falls läuftist dafür da, das der Baustein nicht mehrere Schaltaktionen ausführt. Er sorgt also dafür das ein erneutes aktivieren des gleichen verzögerten Schaltbefehls dazu führt das immer nur die letzte Verzögerung wirkt.Nehmen wir als Beispiel diesen Code Schnipsel:

-
wenn der obere Trigger ausgelöst wird wird ein DP nach 5 Minuten mit falsch angesteuert.
-
löst der gleiche Trigger nochmal aus bevor die 5 Minuten um sind, dann wird der DP erst 5 Minuten nach dem 2. Auslösen mit falsch angesteuert.
-
wenn der untere Trigger ausgelöst wird wird ein DP nach 5 Minuten mit falsch angesteuert.
-
löst der gleiche Trigger nochmal aus bevor die 5 Minuten um sind, dann wird der DP einmal 5 minuten nach dem ersten auslösen und 5 Minuten nach dem 2. Auslösen mit falsch angesteuert.
-
angenommen die
controlblöcke gehen auf den gleichen Datenpunkt, dann gilt:
-- löst der erste Trigger aus wird der DP nach 5 Minuten mit falsch angesteuert.
-- löst dann der 2. Trigger aus (bevor die 5 min. um sind), dann wird der DP zusätzlich 5 Minuten nach diesem Auslösen mit falsch angesteuert.
- Das gleiche passiert wenn die Trigger in umgekehrter Reihenfolge innerhalb der 5 Minuten auslösen - daslöschen falls läuftweiss nichts von der Verzögerung die aus dem 2. 'control' Block kommt.Edit: Das stimmt nicht. Solange setStateDelayed benutzt wird weiss das System von der Verzögerung.
@Doppellhelix sagte in Verzögerung abbrechen:
Was ich aber noch nicht verstehe ist diese "Stop Timeout" auch an den anderen Stellen in diesem Programm.
Das ist erst einmal eine Absicherung. Immer wenn du den DP
Aussenlampe Eckeansteuerst ist davon auszugehen das die Automatik die diese nach 3 Minuten ausschaltet nicht mehr relevant ist. Deswegen wird der Timeout (sofern er denn läuft) gelöscht.Letztendlich macht es also das was der Haken bei
löschen falls läuftauch macht, allerdings mit der Möglichkeit das auch dann zu machen wenn du den verzögerten Schaltbefehl nicht widerholst.Ich hoffe das reicht als Erklärung.
@paul53 sagte in Verzögerung abbrechen:
@Doppellhelix sagte: wofür ist dann die Funktion "löschen falls läuft"
Sie sollte das gleiche machen wie die 3 "stop timeout" im Vorschlag von @asgothian: Bei jedem "steuere" auf den DP "Schalter Aussenlampe Ecke" wird ein laufender Timer gestoppt.
Sorry wenn ich da widerspreche - meine Erfahrung zeigt das genau das nicht der Fall ist. Ansonsten sollten meine Anpassungen an dem Skript nicht wirken.
edit: Hier ist das Testskript mit dem ich das verifiziert habe. Kannst du selber auch testen:

Nach 5+ Sekunden steht im Test-Dtate ein 'with delay' drin.
/editEin
setState()bricht einsetStateDelayed()auf den gleichen DP nicht ab. Um das zu machen könnte man an jeder relevanten StellesetStateDelayed()mitdelay 0undlöschen falls läuftnutzen - das ist aber etwas undurchsichtig.A.
-
-
@Doppellhelix sagte in Verzögerung abbrechen:
Und wofür ist dann die Funktion "löschen falls läuft", die Paul53 mir zuerst vorgeschlagen hat.
Ich beantworte die 2. Frage zuerst.
Der Haken bei
löschen falls läuftist dafür da, das der Baustein nicht mehrere Schaltaktionen ausführt. Er sorgt also dafür das ein erneutes aktivieren des gleichen verzögerten Schaltbefehls dazu führt das immer nur die letzte Verzögerung wirkt.Nehmen wir als Beispiel diesen Code Schnipsel:

-
wenn der obere Trigger ausgelöst wird wird ein DP nach 5 Minuten mit falsch angesteuert.
-
löst der gleiche Trigger nochmal aus bevor die 5 Minuten um sind, dann wird der DP erst 5 Minuten nach dem 2. Auslösen mit falsch angesteuert.
-
wenn der untere Trigger ausgelöst wird wird ein DP nach 5 Minuten mit falsch angesteuert.
-
löst der gleiche Trigger nochmal aus bevor die 5 Minuten um sind, dann wird der DP einmal 5 minuten nach dem ersten auslösen und 5 Minuten nach dem 2. Auslösen mit falsch angesteuert.
-
angenommen die
controlblöcke gehen auf den gleichen Datenpunkt, dann gilt:
-- löst der erste Trigger aus wird der DP nach 5 Minuten mit falsch angesteuert.
-- löst dann der 2. Trigger aus (bevor die 5 min. um sind), dann wird der DP zusätzlich 5 Minuten nach diesem Auslösen mit falsch angesteuert.
- Das gleiche passiert wenn die Trigger in umgekehrter Reihenfolge innerhalb der 5 Minuten auslösen - daslöschen falls läuftweiss nichts von der Verzögerung die aus dem 2. 'control' Block kommt.Edit: Das stimmt nicht. Solange setStateDelayed benutzt wird weiss das System von der Verzögerung.
@Doppellhelix sagte in Verzögerung abbrechen:
Was ich aber noch nicht verstehe ist diese "Stop Timeout" auch an den anderen Stellen in diesem Programm.
Das ist erst einmal eine Absicherung. Immer wenn du den DP
Aussenlampe Eckeansteuerst ist davon auszugehen das die Automatik die diese nach 3 Minuten ausschaltet nicht mehr relevant ist. Deswegen wird der Timeout (sofern er denn läuft) gelöscht.Letztendlich macht es also das was der Haken bei
löschen falls läuftauch macht, allerdings mit der Möglichkeit das auch dann zu machen wenn du den verzögerten Schaltbefehl nicht widerholst.Ich hoffe das reicht als Erklärung.
@paul53 sagte in Verzögerung abbrechen:
@Doppellhelix sagte: wofür ist dann die Funktion "löschen falls läuft"
Sie sollte das gleiche machen wie die 3 "stop timeout" im Vorschlag von @asgothian: Bei jedem "steuere" auf den DP "Schalter Aussenlampe Ecke" wird ein laufender Timer gestoppt.
Sorry wenn ich da widerspreche - meine Erfahrung zeigt das genau das nicht der Fall ist. Ansonsten sollten meine Anpassungen an dem Skript nicht wirken.
edit: Hier ist das Testskript mit dem ich das verifiziert habe. Kannst du selber auch testen:

Nach 5+ Sekunden steht im Test-Dtate ein 'with delay' drin.
/editEin
setState()bricht einsetStateDelayed()auf den gleichen DP nicht ab. Um das zu machen könnte man an jeder relevanten StellesetStateDelayed()mitdelay 0undlöschen falls läuftnutzen - das ist aber etwas undurchsichtig.A.
@Asgothian sagte: Hier ist das Testskript mit dem ich das verifiziert habe.
Danke, etwas dazu gelernt. Es ist mir bisher nicht aufgefallen, da ich selbst setStateDelayed() nicht verwende.
-


gesetzt werden.