Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] mehrere setTimeouts unterbrechen?

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    [gelöst] mehrere setTimeouts unterbrechen?

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      mguenther last edited by 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

      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @mguenther last edited by 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 1 Reply Last reply Reply Quote 1
        • M
          mguenther @paul53 last edited by

          @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);
                  }; 
              };
          });
          
          Xenon 1 Reply Last reply Reply Quote 0
          • Xenon
            Xenon Forum Testing Developer @mguenther last edited by 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 1 Reply Last reply Reply Quote 0
            • M
              mguenther @Xenon last edited by

              @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 Reply Last reply Reply Quote 0
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate

              892
              Online

              31.8k
              Users

              80.0k
              Topics

              1.3m
              Posts

              javascript
              3
              5
              314
              Loading More Posts
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes
              Reply
              • Reply as topic
              Log in to reply
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
              The ioBroker Community 2014-2023
              logo