NEWS
Verzögerte Programmausführung bei Subscribe/On
-
Ich bin noch ioBroker-Anfänger, daher ist es vielleicht eine dumme Frage. Dann bitte ich schon mal im voraus um Entschuldigung!
Ich steuere u.a. einen Entfeuchter. 2 Minuten nachdem dieser angelaufen ist, prüfe ich (bisher in der Homematic) ob er auch wirklich Strom verbraucht. Wenn nicht, gibt es eine E-Mail, dass der Wasserbehälter geleert werden muss (Entfeuchter an, aber ohne Stromverbrauch bedeutet: der ist voll und zieht deswegen keinen Strom).
In der Homematic starte ich deswegen 2 Minuten nach dem ersten Script (an/aus) das zweite Script zur Überprüfung. Geht dort mit einem einzigen Auslöser und ein Script wird sofort gestartet, das andere verzögert.
Bei dem Befehl Subscribe/On gibt es einen solchen verzögerten Programmstart nicht, oder? Ich habe mir überlegt, ich könnte am Ende des ersten Scripts eine Variable verzögert schreiben (SetStateDelayed) die dann ein zweites Script triggert. Dann brauche ich aber eine zusätzliche Variable, das widerstrebt mir.
Zweite Möglichkeit wäre ein SubscribeDelayed/OnDelayed, das gibt es aber nicht, oder?
Dritte Möglichkeit wäre es in der Funktion eine Verzögerung zu bauen (in der Zeit müssten aber natürlich parallel andere Programme ausgeführt werden können). So eine Art Wait(120s). Gibt es so etwas?
Was wäre denn Best Practice?
-
-
@Eisenbahnbär sagte in Verzögerte Programmausführung bei Subscribe/On:
Dritte Möglichkeit wäre es in der Funktion eine Verzögerung zu bauen (in der Zeit müssten aber natürlich parallel andere Programme ausgeführt werden können). So eine Art Wait(120s). Gibt es so etwas?
Was wäre denn Best Practice?Das geht ganz einfach. Grundsätzlich arbeitet ioBroker so, dass du nicht Programme/Skripte startest, sondern in immer laufenden Skripten auf Ereignisse wie die Änderung eines Datenpunktes reagierst.
Das machst du mit
subscribe/on
. Innerhalb des Triggers kannst du wie gehabt dein Gerät starten. MittelssetTimeout
kannst du verzögert weiteren Code ausführen, der z.B. den Stromverbrauch überprüft.Einen Befehl zum Warten gibt es nicht, da die Codeausführung grundsätzlich asynchron arbeitet. Ein Beispiel:
on("...", () => { setState("entfeuchter-datenpunkt", true); setTimeout(() => { // wird nach 2 Minuten ausgeführt }, 120000); // wird sofort nach dem "Anstoßen" der Wartezeit ausgeführt });
Die "Reihenfolge" der Befehlszeilen in obigem Skript wäre demnach:
2: Bei Trigger/Ereignis
3: Direkt nach 2 (startet nur den Timer)
4: 2 Minuten nach 3
6: Direkt nach 3Falls du kein JavaScript kannst ist ggf. Blockly was für dich. Oder du arbeitest dich ein, dann empfehle ich dir, die Grundlagen für modernes JavaScript drauf zu schaffen.
Edit: Einen Link zu den in ioBroker vorhandenen Funktionen hat Paul dir gerade gepostet. -
Super, danke an euch beide!