NEWS
[gelöst] Problem mit einer "while"-Schleife
-
Ich habe ein Problem mit einer while-Scheife, die wie folgt aussieht:
Starte ich das Skript und triggere "resetBaraban" auf true, wird die function "reset" ausgelöst, doch das Javascript-Adapter bleibt sofort hängen, Javascript-Adapter springt auf rot als ob das Script in eine Endlosschleife verfallen würde.
Was mache ich falsch? Hat jemand einen Tipp für mich?
-
@mumurik sagte:
Was mache ich falsch?
Der Block "wiederhole solange" erzeugt eine Endlosschleife !
Was möchtest Du erreichen ? -
die Funktion schaut in ein Datenpunkt "is opened". Solange dieser true ist, wird ein Sonoff Basic mit einer Verzögerung von 20 sek. eingeschaltet und nach 3 sek. wieder ausgeschaltet. Das ist die Schleife und diese ist nicht endlos, sondern läuft solange "is opened"=true
Schreibe ich die Funktion in Javascript, funktioniert das Script wie gewollt und ohne jegliche Probleme bzw. Abstürze:
async function reset() { while (getState("mihome.0.devices.state").val != false) { switchOn(); await sleep(3000); switchOff(); await sleep(20000); } } on({id: 'javascript.0.Bewaesserung.resetBaraban'/*resetBaraban*/, change: "ne"}, function (obj) { var value = obj.state.val; if (value == true) { resetBaraban(); } }); async function switchOn() { setState("sonoff.0.Gartenbewaesserung.POWER", true); } async function switchOff() { setState("sonoff.0.Gartenbewaesserung.POWER", false); } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
Wie bilde ich dies 1-zu-1 im Blockly ab? Das ist eigentlich meine Frage...
-
@mumurik sagte:
Schreibe ich die Funktion in Javascript, funktioniert das Script wie gewollt
... aber nur mit await und async. Das kennt Blockly nicht. Das, was Du möchtest, macht man mit einem Intervall von 23 s.
-
wo finde ich in Blockly den Intervall?
Bin nicht so fit in Blockly, könntest du eventuell die gewünschte Funktion in Blockly für mich nachbauen? Dafür wäre ich dir sehr dankbar!
-
@mumurik ich glaube ganz einfach die 3s auf 23s erhöhen. Die beiden Zeiten laufen ja nicht nacheinander los, sondern gleichzeitig/parallel. Also schon nach 3s ist false und nach 20s true.
-
@mumurik sagte in Problem mit einer "while"-Schleife:
wo finde ich in Blockly den Intervall?
schau mal ...
-
Nein, kriege das nicht hin
Kann mir jemand dieses JavaScript in Blockly nachbauen?
async function reset() { while (getState("mihome.0.devices.state").val != false) { switchOn(); await sleep(3000); switchOff(); await sleep(20000); } } on({id: 'javascript.0.Bewaesserung.resetBaraban'/*resetBaraban*/, change: "ne"}, function (obj) { var value = obj.state.val; if (value == true) { resetBaraban(); } }); async function switchOn() { setState("sonoff.0.Gartenbewaesserung.POWER", true); } async function switchOff() { setState("sonoff.0.Gartenbewaesserung.POWER", false); } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
Danke im Voraus!
-
@mumurik sagte:
kriege das nicht hin
Dann versuche es mal so:
Trigger "ist größer als letztes" bedeutet Wertänderung von false auf true.
-
@paul53 sagte in Problem mit einer "while"-Schleife:
@paul53 sagte:
Dann versuche es mal so:Super, so läuft's, vielen Dank!!!
Und wie mache ich das mit einer "for"-Schleife? So wird es ja nicht klappen:
-
@mumurik sagte:
Und wie mache ich das mit einer "for"-Schleife?
Gar nicht. Die for-Schleife dient zum Abarbeiten einer bestimmten Anzahl - i.d.R. alle Elemente eines Arrays. Verzögerungen innerhalb der Schleifen-Funktion führen nicht zur Verzögerung des Schleifen-Durchlaufs, sondern es werden N Timer quasi gleichzeitig gestartet.
Was soll die Funktion goTo(x) machen ?EDIT: Im Prinzip muss man es so machen wie oben, nur dass die Abbruch-Bedingung anders ist.
-
@paul53 sagte in Problem mit einer "while"-Schleife:
Was soll die Funktion goTo(x) machen ?
Ich habe eine hydraulische Wassertrommel mit 6 Ausgängen. Sobald die Wasserzufuhr unterbrochen wird (in meinem Fall gesteuert über einen Sonoff Basic) und der Wasserdruck in der Trommel nachlässt, dreht sich die Trommel weiter zum nächsten Ausgang (also z.B. von Ausgang 1 zum Ausgang 2) usw.
Jetzt habe ich am Ausgang 1 einen Tür/Fenstersensor angebracht, so dass ich immer weiß, wann die Trommel am Ausgang 1 sich befindet. Nun würde ich gerne die Trommel soweit ansteuern, dass ich über die VIS+Datenpunkt einen bestimmten Ausgang manuell ansteuern kann, z.B. GoTo Ausgang 3, deswegen dachte ich, ich könnte mit einer var-Schleife das gewünschte Ergebnis erreichen...
Deswegen denke ich, dein Vorschlag müsste etwas anders aussehen, oder?
-
@mumurik sagte:
dein Vorschlag müsste etwas anders aussehen, oder?
Weshalb ? Die Funktion goTo(x) kann mit der gewünschten Anzahl von 3-s-Impulsen aufgerufen werden.
-
achso, stimmt natürlich, vielen Dank!!!