NEWS
async-await sleep stoppen
-
Moin,
habe schon gesucht hier aber irgendwie nix gefunden.
Ich verwende im Script mit einem Bewegungsmelder einen async-await sleep Timer.
Das Licht soll sich einschalten beim betreten des Raums und nach 10 Minuten wieder ausgehen.Beispiel:
on({id: RFCode, val: "123456"}, async function() { setState(Light, true); await Sleep(600000); setState(Light, false); });
Wenn ich aber schon vorher den Bewegungsmelder durch das rausgehen wieder auslöse, soll das Licht natürlich dann schon nach zB. einer Wartezeit von 30 Sekunden wieder ausgehen.
Und der 10Minuten Timer soll gelöscht werden.Falls ich dann innerhalb der Wartezeit von 30 Sekunden den Raum wieder betrete, soll der Wartezeit-Timer wieder gelöscht werden, sodass das Licht gar nicht erst ausgeht.
Und der 10 Minuten-Timer soll erneut wieder starten.Hat jemand so etwas eventuell mal umgesetzt und kann mir zeigen, wie man das machen würde?
Ganz generell bin ich in Javascript nur rudimentär fit und würde mir das ein- und ausschalten sicher irgendwie umständlich hinprokeln. Aber wie ich die await sleep-Timer stoppe weiß ich bis heute nicht.
Wäre klasse, wenn mir jemand auf die Sprünge helfen kann.Grüße aus Hamburg
-
@smartin sagte in async-await sleep stoppen:
Moin,
habe schon gesucht hier aber irgendwie nix gefunden.
Ich verwende im Script mit einem Bewegungsmelder einen async-await sleep Timer.
Das Licht soll sich einschalten beim betreten des Raums und nach 10 Minuten wieder ausgehen.Beispiel:
on({id: RFCode, val: "123456"}, async function() { setState(Light, true); await Sleep(600000); setState(Light, false); });
Wenn ich aber schon vorher den Bewegungsmelder durch das rausgehen wieder auslöse, soll das Licht natürlich dann schon nach zB. einer Wartezeit von 30 Sekunden wieder ausgehen.
Und der 10Minuten Timer soll gelöscht werden.Falls ich dann innerhalb der Wartezeit von 30 Sekunden den Raum wieder betrete, soll der Wartezeit-Timer wieder gelöscht werden, sodass das Licht gar nicht erst ausgeht.
Und der 10 Minuten-Timer soll erneut wieder starten.Hat jemand so etwas eventuell mal umgesetzt und kann mir zeigen, wie man das machen würde?
Ganz generell bin ich in Javascript nur rudimentär fit und würde mir das ein- und ausschalten sicher irgendwie umständlich hinprokeln. Aber wie ich die await sleep-Timer stoppe weiß ich bis heute nicht.
Wäre klasse, wenn mir jemand auf die Sprünge helfen kann.Grüße aus Hamburg
solange du via
setState(Light, true); await Sleep(600000); setState(Light, false);
arbeitest wird es nicht gehen. Was du nutzen musst ist:
setState(Light, true); lightTimeout= setTimeout(function() { setState(Light, false); }, 60000)
nutzen. Dann kannst du durch
clearTimeout(lightTimeout)
den Timeout zum ausschalten löschen.
-
@asgothian
Das hilft mir auf jeden Fall schon mal weiter, danke!
Kann ich mit einer if Abfrage oder so irgendwie herausfinden, ob ein Timeout gerade aktiv ist?
Ich weiß sonst nicht, wie ich herausfinde, ob die Wartezeit von 30 Sekunden gerade läuft. -
@smartin sagte: Kann ich mit einer if Abfrage oder so irgendwie herausfinden, ob ein Timeout gerade aktiv ist?
Ja, wenn die Timer-Variable zum Ablauf der Zeit und beim Stoppen auf
null
gesetzt wird.if(lightTimeout) { clearTimeout(lightTimeout); lightTimeout = null; }
setState(Light, true); lightTimeout = setTimeout(function() { setState(Light, false); lightTimeout = null; }, 60000)
-
Super, vielen Dank für Eure Tipps, !
Habe es jetzt so umgesetztvar Timeout1 = null; var Timeout2 = null; on({id: RFCode, val: "12345"}, function() { if (getState(Light).val === false) { setState(Light, true); TimerLang(); } else if(Timeout1) { clearTimeout(Timeout1); Timeout1 = null; TimerKurz(); } else if(Timeout2) { clearTimeout(Timeout2); Timeout2 = null; TimerLang(); }}); function TimerLang() { Timeout1= setTimeout(function() { setState(Light, false); Timeout1 = null; }, 600000)}; function TimerKurz() { Timeout2= setTimeout(function() { setState(Light, false); Timeout2 = null; }, 30000)};
Falls man das noch eleganter machen kann, immer her mit den Tipps.
Ich bin wie gesagt nicht so der JS Held, aber zumindest funktioniert es