Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [gelöst] mehrere setTimeouts unterbrechen?

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    16
    1
    241

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    4.5k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.3k

[gelöst] mehrere setTimeouts unterbrechen?

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
5 Beiträge 3 Kommentatoren 374 Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Offline
    M Offline
    mguenther
    schrieb am zuletzt editiert von mguenther
    #1

    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

    paul53P 1 Antwort Letzte Antwort
    0
    • M mguenther

      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

      paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von paul53
      #2

      @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);    
      

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      M 1 Antwort Letzte Antwort
      1
      • paul53P paul53

        @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);    
        
        M Offline
        M Offline
        mguenther
        schrieb am zuletzt editiert von
        #3

        @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);
                }; 
            };
        });
        
        XenonX 1 Antwort Letzte Antwort
        0
        • M mguenther

          @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);
                  }; 
              };
          });
          
          XenonX Offline
          XenonX Offline
          Xenon
          Forum Testing Developer
          schrieb am zuletzt editiert von Xenon
          #4

          @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 :)

          wenn euch mein Beitrag geholfen hat, bewertet ihn bitte unten rechts :)

          M 1 Antwort Letzte Antwort
          0
          • XenonX Xenon

            @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 :)

            M Offline
            M Offline
            mguenther
            schrieb am zuletzt editiert von
            #5

            @xenon

            danke für den Hinweis. Ich habe Pauls Lsg umgesetzt, war für mich in dem Moment logischer - kapiere aber auch dein Vorgehen :)

            Danke

            1 Antwort Letzte Antwort
            0
            Antworten
            • In einem neuen Thema antworten
            Anmelden zum Antworten
            • Älteste zuerst
            • Neuste zuerst
            • Meiste Stimmen


            Support us

            ioBroker
            Community Adapters
            Donate

            589

            Online

            32.7k

            Benutzer

            82.5k

            Themen

            1.3m

            Beiträge
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
            ioBroker Community 2014-2025
            logo
            • Anmelden

            • Du hast noch kein Konto? Registrieren

            • Anmelden oder registrieren, um zu suchen
            • Erster Beitrag
              Letzter Beitrag
            0
            • Home
            • Aktuell
            • Tags
            • Ungelesen 0
            • Kategorien
            • Unreplied
            • Beliebt
            • GitHub
            • Docu
            • Hilfe