NEWS
[Gelöst] Schleife langsamer ausführen
-
Hallo,
ich versuche vergebens eine Schleife langsamer ablaufen zu lassen. In der Schleife wird ein IR Signal gesendet, aber leider so schnell hintereinander dass das Gerät es nicht regestriert.
Schön wäre das einmal pro Sekunde gedrückt wird. Habe schon geguckt wegen Timeout, aber das bezieht sich wohl eher auf knopf gedrückt x sekunden später ausführen oder?
Wenn ich versuche die Schleife mit einer Schleife auszubremsen so:
while (k <= i){
setState("broadlink.0.learnedSignals.Ventiplus",true);
for(z = 1;z <= 50000; z++) {}
k++;
}
Dann wird einmal gedrückt, für eine zeit gewartet und dann wieder schnell gedrückt…. also würde die zweite Schleife nur 1 mal ausgeführt.
Gibt es da eine einfache Lösung?
-
In der Schleife wird ein IR Signal gesendet, aber leider so schnell hintereinander dass das Gerät es nicht regestriert. `
Sollen mehrere Kommandos/Werte gesendet werden ? Oder soll ein Kommando mehrmals wiederholt werden ?Beschreibe bitte erst einmal, was in der Schleife unter welchen Bedingungen (Zeitabstand ?) passieren soll.
-
Es soll das gleiche Kommando mehrmals ausgeführt werden. Im Abstand von einer Sekunde. Zeile mit broadlink. Die sendet ein IR Signal zum Ventilator, um die Luftstärke zu erhöhen bzw. niedriger. Habe dazu Variablen die die aktuelle Stufe speichern, so das der Wert ausgerechnet wird für x mal hoch oder runter schalten. Da die while Schleife aber z. B. 5 mal sofort hintereinander sendet, kommt höchstens 3 mal an. Da der Ventilator 10 Stufen hat und ich das mit Alexa steuer, wäre es super die Signale im richtigen Abstand zu senden.
-
Es soll das gleiche Kommando mehrmals ausgeführt werden. Im Abstand von einer Sekunde. `
Dafür gibt es die JS-Funktion timer = setInterval(callback, 1000) (Abstand 1 s). Wenn das Senden der gewünschten Anzahl Kommandos erfolgt ist, wird mit clearInterval(timer) beendet. Etwa so:var timer = null; var anzahl; // wird irgendwo im Skript berechnet function CountDown(s) { setState("broadlink.0.learnedSignals.Ventiplus",true); s--; timer = setInterval(function () { if (s > 0) { setState("broadlink.0.learnedSignals.Ventiplus",true); s--; } else { if(timer) clearInterval(timer); } }, 1000); } CountDown(anzahl);
-
VIELEN DANK ^^ Funktioniert bestens.
Noch eine Frage nebenbei. Ich habe einen Datenpunkt als Zahl, die Unit habe ich leer gelassen, da nicht nötig. Min 0 Max 100. So kann ich sagen Alexa Stelle Stufe auf 7. Das komische ist, dass dann als Wert 7.0000001 übergeben wird. Aber warum??? Bei 3 ist es genau 3. Habe das im Code mit Math.round gelöst. Kann man einem Objekt im vorraus Nachkommastellen streichen lassen? Ist das mit der 1 am Ende ein Fehler von Alexa oder dem Cloud Adapter?
Falls noch jemand Infrarot Geräte hat und so ein Code benötigt:
! ````
var Stufe;
var interval;
var timer = null;
var anzahl;
function CountDownPlus(s) { //Funktion Taste Plus im Abstand 1 Sekunde drücken.
setState("broadlink.0.learnedSignals.Ventiplus",true);
s--;
timer = setInterval(function () {
if (s > 0) {
setState("broadlink.0.learnedSignals.Ventiplus",true);
s--;
} else {
if(timer) clearInterval(timer);
}
}, 1000);
}
! function CountDownMinus(s) { //Funktion Taste Minus im Abstand 1 Sekunde drücken.
setState("broadlink.0.learnedSignals.Ventiminus",true);
s--;
timer = setInterval(function () {
if (s > 0) {
setState("broadlink.0.learnedSignals.Ventiminus",true);
s--;
} else {
if(timer) clearInterval(timer);
}
}, 1000);
}
! on({id: "javascript.0.Wind"/javascript.0.Wind/, change: "any"},
! function (obj) {
var x = obj.state.val; //Übergebener Wert von der .Wind ID
x = Math.round(x); //Nachkommastellen wegkürzen
Stufe = (getState("javascript.0.Stufe").val); //Aktuelle Stufe
Stufe = Math.round(Stufe);
! if (Stufe < x) {
anzahl = x - Stufe;
! CountDownPlus(anzahl);
! Stufe = x;
setState("javascript.0.Stufe", Stufe); //Neue aktuelle Stufe
! } else if (Stufe > x) {
anzahl = Stufe - x;CountDownMinus(anzahl);
Stufe = x; setState("javascript.0.Stufe", Stufe);
}});