NEWS
Blockly Timeout Erläuterung
-
Hallo liebe Community,
ich bin noch recht neu im Thema SmartHome unterwegs. Ich komme allerdings beruflich aus der IT-Richtung, das nur als Hintergrund. Trotzdem, oder gerade deshalb muss ich hier mal eine vermutlich echt Anfängerfrage stellen.
Und zwar, wie viele Einträge hier, habe auch ich ein Licht, welches per Shelly schaltet und einen PIR, der auf Personen reagiert, wodurch das Licht einschalten soll.
Mein Script funktioniert auch wie gewünscht, allerdings habe ich den Aufbau mit dem "Stop Timeout" und "Ausführen Timeout" aus einem anderen Forumbeispiel.
Meine Frage ist nun: Kann mir bitte jemand verständlich erklären, wie dieser Mechanismus des Timeouts funktioniert ?
Ich sehe das Script und denke wie folgt:- Wenn sich der Eingang ändern, dann...
... 2. Wenn der Eingang dann "true" ist, dann...
...3. Schalte das Licht ein
....3. Stoppe Timeout
... 2. Wenn der Eingang aber "false" ist, dann...
3. Starte Timeout von 5 Sekunden und schalte dann das Licht aus
Die Zahlen 1, 2, 3 sollen die IF, ELSE - Ebenen im Script sein.
Was ich nicht verstehe ist, wenn einmal die Bedingung erfüllt ist, dass der PIR ausschaltet und die 5 Sekunden Timeout laufen, wie kann während dieser Zeit dann ein erneutes Auslösen des PIR dazu führen, dass das Script erneut reagiert und dadurch Stop Timeout aufgerufen wird ? Verstehe diese "Abbruch"-Bedingung des Timeouts nicht bzw. wie das überhaupt funktioniert, dass beim erneuten Auslösen innerhalb der Timeout Zeit das Script überhaupt nochmal reagiert darauf ?Hier noch ein Screenshot:
- Wenn sich der Eingang ändern, dann...
-
@dewaldo sagte: wie das überhaupt funktioniert, dass beim erneuten Auslösen innerhalb der Timeout Zeit das Script überhaupt nochmal reagiert darauf ?
Javascript arbeitet nicht zyklisch, sondern Ereignis gesteuert. Ein Ereignis ist z.B. die Wertänderung eines Datenpunktes (PIR-Trigger) oder auch der Ablauf eines Timeout.
-
@paul53 :
D.h. ich muss mir das so vorstellen ?- Bewegungsmelder löst aus -> Event, welches das erste IF triggert und welches dann abläuft
- Bewegungsmelder schaltet ab -> Event, welches das "Else If" startet und das Timeout dort startet
- Bewegungsmeldet löst erneut aus -> Event, welches das erste IF triggert, während das andere Else If noch abgearbeitet wird ?
-> Und weil oben dann "Stop Timeout" steht, bricht das Event oben die Abarbeitung im unteren ab ?
Oh ha, ich habe bislang nur Erfahrung mit zyklischen Skripten, das wird eine ganz schöne Umstellung so zu denken ...
Aber vielen Dank für die Erläuterung, sofern ich es jetzt so richtig wiedergegeben habe ...Gruß, dewaldo
-
@dewaldo sagte: Event, welches das erste IF triggert, während das andere Else If noch abgearbeitet wird ?
Es wird nicht das else if abgearbeitet, sondern im Hintergrund läuft der Timer, der nun gestoppt wird.
@dewaldo sagte in Blockly Timeout Erläuterung:
das wird eine ganz schöne Umstellung so zu denken ...
Das ging mir auch so.
-
Oh je... dann muss ich leider nochmal nachhaken, Entschuldigung...
Wenn also im "Else if" nur das Timeout sozusagen angestoßen wird, dass der Timer im Hintergrund läuft, wie wird dann das Ausschalten des Lichts bewerkstelligt ?
Merkt sich Javascript diese Bedienung, dass wenn der Timeout abgelaufen ist, dies wiederum ein Ereignis darstellt, das dann das Kommando "Licht aus" ausführt ?Bedeutet das weiter, dass "Timeout" quasi wie eine globale Variable zu sehen ist?
Was heißt das für mehrere Scripts, die parallel ausgeführt werden, wo jedes für sich ebenfalls das Timeout verwendet ? Führt das dann zu Konflikten ? -
Du darfst dir das so vorstellen:
im System gibt es eine Lange liste von Dingen die "in der Zukunft" ausgeführt werden sollen. Mit dem Befehl "Ausführen timeout in x sekunden" fügst du dieser Liste eine neue Aufgabe hinzu (mit Aufgabe und wann es passieren soll). Als Ergebnis bekommst du eine Adresse, an der diese Aufgabe abgelegt ist. Diese Adresse speicherst du in der (in dem Skript globalen) Variable timeout.
Auf die Art und weise kanns der "stop timeout" Befehl den Eintrag aus der globalen Liste wieder entfernen, bevor die Aktion ausgeführt wurde.
A.
-
@dewaldo sagte: wie wird dann das Ausschalten des Lichts bewerkstelligt ?
An den Timer wird eine Referenz zur Callback-Funktion übergeben, die das Ausschalten ausführt: Bei Ablauf ruft der Timer die Callback-Funktion auf.
@dewaldo sagte in Blockly Timeout Erläuterung:
Was heißt das für mehrere Scripts, die parallel ausgeführt werden, wo jedes für sich ebenfalls das Timeout verwendet ? Führt das dann zu Konflikten ?
Nein, es können viele Timer parallel laufen.
-
Vielen Dank euch beiden für die schnellen Informationen zu dem Thema.
Ich kann mir das ganze jetzt schon besser vorstellen.
Ich habe gerade 2 Einzelscripte in eines zusammenkopiert. Das andere Script wertet einen zum Licht gehörenden Wandtaster aus. Da die Scripte themenmäßig zusammengehören, habe ich sie in eins kopiert und sehe jetzt im JavaScript Code auch, wie das mit dem Timeout funktioniert. Ich sehe, dass nun 2 Variablen angelegt wurden: timeout und timeout2, sodass diese jeweils ihren eigenen Callback haben.Also nochmal vielen Dank, das hat mir schonmal einen Schups in die richtige Richtung gegeben, auch wenn ich noch einen langen Weg vor mir habe, bis ich das Werkzeug beherrschen werde...