Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • 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

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    8
    1
    333

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    10
    1
    299

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    929

[gelöst] mehrere setTimeouts unterbrechen?

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
5 Beiträge 3 Kommentatoren 377 Aufrufe 1 Beobachtet
  • Ä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

            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
            Antworten
            • In einem neuen Thema antworten
            Anmelden zum Antworten
            • Älteste zuerst
            • Neuste zuerst
            • Meiste Stimmen


            Support us

            ioBroker
            Community Adapters
            Donate

            465

            Online

            32.8k

            Benutzer

            82.8k

            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