NEWS
[gelöst] mehrere setTimeouts unterbrechen?
-
Ich habe mir folgendes Skript erstellt - es geht um die WLED Beleuchtung, wo mehrere definierte Presets mit einem Zeitversatz ablaufen sollen:
//Lichtschaltung Garagentor WLED const idWLED = 'wled.0.8cce4ed829ab.on'/*On / Off*/; const idWLEDFavorit = 'wled.0.8cce4ed829ab.ps'/*ID of currently set preset*/; //const idStatusTor = 'hm-rpc.3.00241A49A7696D.1.DOOR_STATE'/*00241a49a7696d:1 door state*/; const idStatusTor = 'javascript.0.Garage.Trigger'/*Trigger*/; const idHelligkeit = 'javascript.0.Bewegungsmelder.Helligkeit'/*Helligkeit*/; var dauer = 2.5; // in Sekunden var wled = getState(idWLED).val; var wledfavorit = getState(idWLEDFavorit).val; var statustor = getState(idStatusTor).val; var helligkeit = getState(idHelligkeit).val; var helligkeit_grenzwert = 300; on(idStatusTor, function(dp) { helligkeit = getState(idHelligkeit).val; if (helligkeit<helligkeit_grenzwert) { wled = getState(idWLED).val; if (dp.state.val === 3) { setState(idWLEDFavorit, 1); setState(idWLED, true); }; if (dp.state.val === 2 || dp.state.val ===1) { setState(idWLEDFavorit, 2); //gruen setTimeout(function() { setState(idWLEDFavorit, 3); //Animation }, dauer*1000); setTimeout(function() { setState(idWLEDFavorit, 4); //alles weiß }, 1.5*dauer*1000); setTimeout(function() { setState(idWLEDFavorit, 5); // Spots }, 2.10*dauer*1000); }; if(dp.state.val === 0) { setState(idWLED, false); }; }; });Was passiert aber, wenn das Programm z.B. noch im Ablauf gerade irgendwo zwischen den Zeilen 27-30 steckt, sich dann aber durch den Trigger der Datenpunkt ändert (z.B. in den Wert 3 oder 0)? Wie kann ich dann die setTimeouts alle unterbrechen und quasi die function von vorne starten?
danke
Marcus
-
Ich habe mir folgendes Skript erstellt - es geht um die WLED Beleuchtung, wo mehrere definierte Presets mit einem Zeitversatz ablaufen sollen:
//Lichtschaltung Garagentor WLED const idWLED = 'wled.0.8cce4ed829ab.on'/*On / Off*/; const idWLEDFavorit = 'wled.0.8cce4ed829ab.ps'/*ID of currently set preset*/; //const idStatusTor = 'hm-rpc.3.00241A49A7696D.1.DOOR_STATE'/*00241a49a7696d:1 door state*/; const idStatusTor = 'javascript.0.Garage.Trigger'/*Trigger*/; const idHelligkeit = 'javascript.0.Bewegungsmelder.Helligkeit'/*Helligkeit*/; var dauer = 2.5; // in Sekunden var wled = getState(idWLED).val; var wledfavorit = getState(idWLEDFavorit).val; var statustor = getState(idStatusTor).val; var helligkeit = getState(idHelligkeit).val; var helligkeit_grenzwert = 300; on(idStatusTor, function(dp) { helligkeit = getState(idHelligkeit).val; if (helligkeit<helligkeit_grenzwert) { wled = getState(idWLED).val; if (dp.state.val === 3) { setState(idWLEDFavorit, 1); setState(idWLED, true); }; if (dp.state.val === 2 || dp.state.val ===1) { setState(idWLEDFavorit, 2); //gruen setTimeout(function() { setState(idWLEDFavorit, 3); //Animation }, dauer*1000); setTimeout(function() { setState(idWLEDFavorit, 4); //alles weiß }, 1.5*dauer*1000); setTimeout(function() { setState(idWLEDFavorit, 5); // Spots }, 2.10*dauer*1000); }; if(dp.state.val === 0) { setState(idWLED, false); }; }; });Was passiert aber, wenn das Programm z.B. noch im Ablauf gerade irgendwo zwischen den Zeilen 27-30 steckt, sich dann aber durch den Trigger der Datenpunkt ändert (z.B. in den Wert 3 oder 0)? Wie kann ich dann die setTimeouts alle unterbrechen und quasi die function von vorne starten?
danke
Marcus
@mguenther sagte: Wie kann ich dann die setTimeouts alle unterbrechen und quasi die function von vorne starten?
Jedem setTimeout() eine eigene timer-Variable zuweisen und mit clearTimeout(timer) den Timer stoppen.
var timer1, timer2, timer3; on(idStatusTor, function(dp) { clearTimeout(timer1); clearTimeout(timer2); clearTimeout(timer3); -
@mguenther sagte: Wie kann ich dann die setTimeouts alle unterbrechen und quasi die function von vorne starten?
Jedem setTimeout() eine eigene timer-Variable zuweisen und mit clearTimeout(timer) den Timer stoppen.
var timer1, timer2, timer3; on(idStatusTor, function(dp) { clearTimeout(timer1); clearTimeout(timer2); clearTimeout(timer3);@paul53
danke Paul - das hatte ich gesucht.//Lichtschaltung Garagentor WLED const idWLED = 'wled.0.8cce4ed829ab.on'/*On / Off*/; const idWLEDFavorit = 'wled.0.8cce4ed829ab.ps'/*ID of currently set preset*/; //const idStatusTor = 'hm-rpc.3.00241A49A7696D.1.DOOR_STATE'/*00241a49a7696d:1 door state*/; const idStatusTor = 'javascript.0.Garage.Trigger'/*Trigger*/; const idHelligkeit = 'javascript.0.Bewegungsmelder.Helligkeit'/*Helligkeit*/; var dauer = 2.5; // in Sekunden var wled = getState(idWLED).val; var wledfavorit = getState(idWLEDFavorit).val; var statustor = getState(idStatusTor).val; var helligkeit = getState(idHelligkeit).val; var helligkeit_grenzwert = 300; var timer1, timer2, timer3 = null; on(idStatusTor, function(dp) { clearTimeout(timer1); clearTimeout(timer2); clearTimeout(timer3); helligkeit = getState(idHelligkeit).val; if (helligkeit<helligkeit_grenzwert) { wled = getState(idWLED).val; if (dp.state.val === 3) { setState(idWLEDFavorit, 1); setState(idWLED, true); }; if (dp.state.val === 2 || dp.state.val ===1) { setState(idWLEDFavorit, 2); //gruen timer1=setTimeout(function() { setState(idWLEDFavorit, 3); //Animation }, dauer*1000); timer2=setTimeout(function() { setState(idWLEDFavorit, 4); //alles weiß }, 1.5*dauer*1000); timer3=setTimeout(function() { setState(idWLEDFavorit, 5); // Spots }, 2.10*dauer*1000); }; if(dp.state.val === 0) { setState(idWLED, false); }; }; }); -
@paul53
danke Paul - das hatte ich gesucht.//Lichtschaltung Garagentor WLED const idWLED = 'wled.0.8cce4ed829ab.on'/*On / Off*/; const idWLEDFavorit = 'wled.0.8cce4ed829ab.ps'/*ID of currently set preset*/; //const idStatusTor = 'hm-rpc.3.00241A49A7696D.1.DOOR_STATE'/*00241a49a7696d:1 door state*/; const idStatusTor = 'javascript.0.Garage.Trigger'/*Trigger*/; const idHelligkeit = 'javascript.0.Bewegungsmelder.Helligkeit'/*Helligkeit*/; var dauer = 2.5; // in Sekunden var wled = getState(idWLED).val; var wledfavorit = getState(idWLEDFavorit).val; var statustor = getState(idStatusTor).val; var helligkeit = getState(idHelligkeit).val; var helligkeit_grenzwert = 300; var timer1, timer2, timer3 = null; on(idStatusTor, function(dp) { clearTimeout(timer1); clearTimeout(timer2); clearTimeout(timer3); helligkeit = getState(idHelligkeit).val; if (helligkeit<helligkeit_grenzwert) { wled = getState(idWLED).val; if (dp.state.val === 3) { setState(idWLEDFavorit, 1); setState(idWLED, true); }; if (dp.state.val === 2 || dp.state.val ===1) { setState(idWLEDFavorit, 2); //gruen timer1=setTimeout(function() { setState(idWLEDFavorit, 3); //Animation }, dauer*1000); timer2=setTimeout(function() { setState(idWLEDFavorit, 4); //alles weiß }, 1.5*dauer*1000); timer3=setTimeout(function() { setState(idWLEDFavorit, 5); // Spots }, 2.10*dauer*1000); }; if(dp.state.val === 0) { setState(idWLED, false); }; }; });@mguenther du kannst dir auch alle timer in ein object schreiben und dann per schleife alle löschen
const objTimer = { timer: null, timer1: null, timer2: null }; // alle timer loeschen, falls sie bereits laufen for (const i of Object.keys(objTimer)) { if (objTimer[i]) { clearTimeout(objTimer[i]); objTimer[i] = null; }; }; objTimer.timer = setTimeout(() => { console.log('timer abgelaufen'); }, 1000); objTimer.timer1 = setTimeout(() => { console.log('timer 1 abgelaufen'); // timer 2 abbrechen falls läuft if (objTimer.timer2) { clearTimeout(objTimer.timer2); objTimer.timer2 = null; console.log('timer 2 abgebrochen'); }; }, 1000); objTimer.timer2 = setTimeout(() => { console.log('timer 2 abgelaufen'); }, 10000);So ist es wesentlich übersichtlicher, wenn du mehrere timer in einem Skript nutzt :)
-
@mguenther du kannst dir auch alle timer in ein object schreiben und dann per schleife alle löschen
const objTimer = { timer: null, timer1: null, timer2: null }; // alle timer loeschen, falls sie bereits laufen for (const i of Object.keys(objTimer)) { if (objTimer[i]) { clearTimeout(objTimer[i]); objTimer[i] = null; }; }; objTimer.timer = setTimeout(() => { console.log('timer abgelaufen'); }, 1000); objTimer.timer1 = setTimeout(() => { console.log('timer 1 abgelaufen'); // timer 2 abbrechen falls läuft if (objTimer.timer2) { clearTimeout(objTimer.timer2); objTimer.timer2 = null; console.log('timer 2 abgebrochen'); }; }, 1000); objTimer.timer2 = setTimeout(() => { console.log('timer 2 abgelaufen'); }, 10000);So ist es wesentlich übersichtlicher, wenn du mehrere timer in einem Skript nutzt :)
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden