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] Probleme mit clearTimer

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.3k

[Gelöst] Probleme mit clearTimer

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
7 Beiträge 2 Kommentatoren 587 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.
  • T Offline
    T Offline
    tropisch
    schrieb am zuletzt editiert von tropisch
    #1

    Hallo zusammen,
    mich treibt das Abbrechen eines setTimers in den Wahnsinn.
    Ich möchte folgendes:

    • Einen 5 minütigen Timer starten, wenn ein Bewegungsmelder false meldet
    • Diesen Timer abbrechen wenn der Bewegungsmelder true meldet oder ich einen Schalter drücke.

    Das Problem: Das Abbrechen des Timers funktioniert irgendwie nicht.
    Folgend mein Code:

    var block = false, time;
    var timeout = null;
      
    on ({id: BewSensor_Bad, val: true}, function(){
        (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer abgebrochen durch sensor mit if (1)")}})();
        // clearTimeout(timeout);
        // timeout = null;
        // clearTimeout(timeout);
        if (compareTime('5:00', '23:00', "between", null)) {
            setState(Shelly_Bad_Spiegel, true);
            console.log("Licht an (Sensor)");
        }
    });
    
    on ({id: BewSensor_Bad, val: false}, function(){
        if (block == false){
            console.log("Bad: Keine Bewegung, starte kurzen Timer");
            time = 300000;
            timeout = setTimeout(function () {
                setState(Shelly_Bad_Spiegel, false);
                // Stelle eins
                // (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer (kurz) beendet, Licht aus (2)")}})();
                // clearTimeout(timeout); 
                // timeout = null; 
            },time);
        }
        else{
            console.log("Bad: Keine Bewegung, starte langen Timer");
            time = 1800000;
            timeout = setTimeout(function () {
                setState(Shelly_Bad_Spiegel, false);
                // Stelle zwei
                // (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer (lang) beendet, Licht aus (3)")}})();   
                // clearTimeout(timeout);
                // timeout = null;
            },time);   
        }
        if(timeout){
            console.log ("Timer läuft: Dauer: " + time/60000 +" Minuten")
        }
    });  
    
    on ({id: SchalterKleinBadDoppel, val: true}, function(){
            setState(Shelly_Bad_Spiegel, false);
            console.log("Licht aus durch Schalter");
            block = false;
            (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer beendet (4)")}})();
            }
    );
    
    on ({id: SchalterKleinBadEinfach, val: true}, function(){
            setState(Shelly_Bad_Spiegel, true);
            console.log("Licht an durch Schalter");
            block = true;
            (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Haendisch an, Timer abbrechen (5)")}})();   
            console.log ("Block = " + block)
            }
    );
    

    Laut Console komm ich auch in die Funktion zum Abbrechen:

    (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer abgebrochen durch sensor mit if (1)")}})();
    

    Aber trotzdem geht das Licht zu früh aus.
    An diversen Stellen habe ich auch den Timer mit clearTimeout und timer = null innerhalb des setTimeouts gesetzt (siehe z.B. auskommentierte "Stelle eins" und "Stelle zwei".

    In meinem Konsolen-Log erscheinen Einträge seltsamerweise doppelt:

    javascript.0 2019-07-14 11:55:28.428 info script.js.Beleuchtung.Bad: Status: Licht ging aus
    javascript.0 2019-07-14 11:55:28.393 info script.js.Beleuchtung.Bad: Status: Licht ging aus
    javascript.0 2019-07-14 11:53:27.969 info script.js.Beleuchtung.Bad: Status: Bewegungsmelder meldet false
    javascript.0 2019-07-14 11:53:27.969 info script.js.Beleuchtung.Bad: Timer läuft: Dauer: 5 Minuten
    javascript.0 2019-07-14 11:53:27.968 info script.js.Beleuchtung.Bad: Bad: Keine Bewegung, starte kurzen Timer
    javascript.0 2019-07-14 11:51:28.244 info script.js.Beleuchtung.Bad: Status: Bewegungsmelder meldet false
    javascript.0 2019-07-14 11:51:28.244 info script.js.Beleuchtung.Bad: Timer läuft: Dauer: 5 Minuten
    javascript.0 2019-07-14 11:51:28.243 info script.js.Beleuchtung.Bad: Bad: Keine Bewegung, starte kurzen Timer
    javascript.0 2019-07-14 11:50:28.383 info script.js.Beleuchtung.Bad: Status: Bewegungsmelder meldet false
    javascript.0 2019-07-14 11:50:28.382 info script.js.Beleuchtung.Bad: Timer läuft: Dauer: 5 Minuten
    javascript.0 2019-07-14 11:50:28.382 info script.js.Beleuchtung.Bad: Bad: Keine Bewegung, starte kurzen Timer
    javascript.0 2019-07-14 11:48:28.647 info script.js.Beleuchtung.Bad: Licht an (Sensor)

    In diversen Einträgen im Forum lese ich unterschiedliches bezüglich des Abbrechen eines Timers:
    Mal mit timeout = null UND clearTimeout, mal nur clearTimeout.
    Blockly packt beides in eine function.
    Was mache ich falsch?
    An welchen Stellen muss ich den Timer clearen und nullen?

    paul53P 1 Antwort Letzte Antwort
    0
    • T tropisch

      Hallo zusammen,
      mich treibt das Abbrechen eines setTimers in den Wahnsinn.
      Ich möchte folgendes:

      • Einen 5 minütigen Timer starten, wenn ein Bewegungsmelder false meldet
      • Diesen Timer abbrechen wenn der Bewegungsmelder true meldet oder ich einen Schalter drücke.

      Das Problem: Das Abbrechen des Timers funktioniert irgendwie nicht.
      Folgend mein Code:

      var block = false, time;
      var timeout = null;
        
      on ({id: BewSensor_Bad, val: true}, function(){
          (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer abgebrochen durch sensor mit if (1)")}})();
          // clearTimeout(timeout);
          // timeout = null;
          // clearTimeout(timeout);
          if (compareTime('5:00', '23:00', "between", null)) {
              setState(Shelly_Bad_Spiegel, true);
              console.log("Licht an (Sensor)");
          }
      });
      
      on ({id: BewSensor_Bad, val: false}, function(){
          if (block == false){
              console.log("Bad: Keine Bewegung, starte kurzen Timer");
              time = 300000;
              timeout = setTimeout(function () {
                  setState(Shelly_Bad_Spiegel, false);
                  // Stelle eins
                  // (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer (kurz) beendet, Licht aus (2)")}})();
                  // clearTimeout(timeout); 
                  // timeout = null; 
              },time);
          }
          else{
              console.log("Bad: Keine Bewegung, starte langen Timer");
              time = 1800000;
              timeout = setTimeout(function () {
                  setState(Shelly_Bad_Spiegel, false);
                  // Stelle zwei
                  // (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer (lang) beendet, Licht aus (3)")}})();   
                  // clearTimeout(timeout);
                  // timeout = null;
              },time);   
          }
          if(timeout){
              console.log ("Timer läuft: Dauer: " + time/60000 +" Minuten")
          }
      });  
      
      on ({id: SchalterKleinBadDoppel, val: true}, function(){
              setState(Shelly_Bad_Spiegel, false);
              console.log("Licht aus durch Schalter");
              block = false;
              (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer beendet (4)")}})();
              }
      );
      
      on ({id: SchalterKleinBadEinfach, val: true}, function(){
              setState(Shelly_Bad_Spiegel, true);
              console.log("Licht an durch Schalter");
              block = true;
              (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Haendisch an, Timer abbrechen (5)")}})();   
              console.log ("Block = " + block)
              }
      );
      

      Laut Console komm ich auch in die Funktion zum Abbrechen:

      (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer abgebrochen durch sensor mit if (1)")}})();
      

      Aber trotzdem geht das Licht zu früh aus.
      An diversen Stellen habe ich auch den Timer mit clearTimeout und timer = null innerhalb des setTimeouts gesetzt (siehe z.B. auskommentierte "Stelle eins" und "Stelle zwei".

      In meinem Konsolen-Log erscheinen Einträge seltsamerweise doppelt:

      javascript.0 2019-07-14 11:55:28.428 info script.js.Beleuchtung.Bad: Status: Licht ging aus
      javascript.0 2019-07-14 11:55:28.393 info script.js.Beleuchtung.Bad: Status: Licht ging aus
      javascript.0 2019-07-14 11:53:27.969 info script.js.Beleuchtung.Bad: Status: Bewegungsmelder meldet false
      javascript.0 2019-07-14 11:53:27.969 info script.js.Beleuchtung.Bad: Timer läuft: Dauer: 5 Minuten
      javascript.0 2019-07-14 11:53:27.968 info script.js.Beleuchtung.Bad: Bad: Keine Bewegung, starte kurzen Timer
      javascript.0 2019-07-14 11:51:28.244 info script.js.Beleuchtung.Bad: Status: Bewegungsmelder meldet false
      javascript.0 2019-07-14 11:51:28.244 info script.js.Beleuchtung.Bad: Timer läuft: Dauer: 5 Minuten
      javascript.0 2019-07-14 11:51:28.243 info script.js.Beleuchtung.Bad: Bad: Keine Bewegung, starte kurzen Timer
      javascript.0 2019-07-14 11:50:28.383 info script.js.Beleuchtung.Bad: Status: Bewegungsmelder meldet false
      javascript.0 2019-07-14 11:50:28.382 info script.js.Beleuchtung.Bad: Timer läuft: Dauer: 5 Minuten
      javascript.0 2019-07-14 11:50:28.382 info script.js.Beleuchtung.Bad: Bad: Keine Bewegung, starte kurzen Timer
      javascript.0 2019-07-14 11:48:28.647 info script.js.Beleuchtung.Bad: Licht an (Sensor)

      In diversen Einträgen im Forum lese ich unterschiedliches bezüglich des Abbrechen eines Timers:
      Mal mit timeout = null UND clearTimeout, mal nur clearTimeout.
      Blockly packt beides in eine function.
      Was mache ich falsch?
      An welchen Stellen muss ich den Timer clearen und nullen?

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

      @tropisch sagte:

      Abbrechen eines Timers:
      Mal mit timeout = null UND clearTimeout, mal nur clearTimeout.

      Nur clearTimeout(timer) bricht den Timer ab. timer = null dient für die Abfrage if(timer), ob der Timer läuft.

      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

      T 1 Antwort Letzte Antwort
      0
      • paul53P paul53

        @tropisch sagte:

        Abbrechen eines Timers:
        Mal mit timeout = null UND clearTimeout, mal nur clearTimeout.

        Nur clearTimeout(timer) bricht den Timer ab. timer = null dient für die Abfrage if(timer), ob der Timer läuft.

        T Offline
        T Offline
        tropisch
        schrieb am zuletzt editiert von
        #3

        @paul53 Danke für den Hinweis!
        Hast du auch eine Idee was bei meinem Skript sonst falsch läuft?

        paul53P 1 Antwort Letzte Antwort
        0
        • T tropisch

          @paul53 Danke für den Hinweis!
          Hast du auch eine Idee was bei meinem Skript sonst falsch läuft?

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

          @tropisch sagte:

          Hast du auch eine Idee

          Kann es sein, dass der BWM zyklisch seinen Status sendet ? Dann sollte auf Wertänderung getriggert werden.
          Z.B. so

          var time = 600000;
          var timeout = null;
            
          on (BewSensor_Bad, function(dp){
              if(dp.state.val) {
                  if(timeout) {
                      clearTimeout(timeout); 
                      timeout = null;
                      log("Timer abgebrochen durch sensor mit if (1)")
                  }
                  if (compareTime('5:00', '23:00', "between")) {
                      setState(Shelly_Bad_Spiegel, true);
                      log("Licht an (Sensor)");
                  }
              } else {
                  log("Bad: Keine Bewegung");
                  timeout = setTimeout(function () {
                      setState(Shelly_Bad_Spiegel, false);
                  }, time);
              }
          });  
          
          on ({id: SchalterKleinBadDoppel, val: true}, function() {
              setState(Shelly_Bad_Spiegel, false);
              log("Licht aus durch Schalter");
              time = 300000;
              if (timeout) {
                  clearTimeout(timeout); 
                  timeout = null;
                  log("Timer beendet (4)")
              }
          });
           
          on ({id: SchalterKleinBadEinfach, val: true}, function(){
              setState(Shelly_Bad_Spiegel, true);
              log("Licht an durch Schalter");
              time = 1800000;
              if (timeout) {
                  clearTimeout(timeout); 
                  timeout = null;
                  log("Haendisch an, Timer abbrechen (5)");
              }   
          });
          

          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

          1 Antwort Letzte Antwort
          0
          • T Offline
            T Offline
            tropisch
            schrieb am zuletzt editiert von
            #5

            Vielen Dank für Deine Lösung. Sie scheint soweit zu funktionieren :)
            Scheinbar sendet der Melder (seit neustem) zyklisch.

            Ich bin aber ein wenig verwirrt:
            Ich dachte bisher die on (Id, val:true) geschichte wird nur bei einer Änderung getriggert.
            Verstehe ich das jetzt richtig, dass der trigger jetzt bei Änderung und Aktualisierung mit selben Wert getriggert wird?

            Außerdem: Die dp.state.val Sache entpsricht quasi dem Wert des Objekts, welches den Trigger ausgelöst hat (BewSensor_Bad). Zu dem Ganzen konnte ich aber in keiner Doku etwas finden. Unter welchem Schlagwort gibt es denn Doku dazu?

            paul53P 1 Antwort Letzte Antwort
            0
            • T tropisch

              Vielen Dank für Deine Lösung. Sie scheint soweit zu funktionieren :)
              Scheinbar sendet der Melder (seit neustem) zyklisch.

              Ich bin aber ein wenig verwirrt:
              Ich dachte bisher die on (Id, val:true) geschichte wird nur bei einer Änderung getriggert.
              Verstehe ich das jetzt richtig, dass der trigger jetzt bei Änderung und Aktualisierung mit selben Wert getriggert wird?

              Außerdem: Die dp.state.val Sache entpsricht quasi dem Wert des Objekts, welches den Trigger ausgelöst hat (BewSensor_Bad). Zu dem Ganzen konnte ich aber in keiner Doku etwas finden. Unter welchem Schlagwort gibt es denn Doku dazu?

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

              @tropisch sagte:

              Ich dachte bisher die on (Id, val:true) geschichte wird nur bei einer Änderung getriggert.

              Nein, wenn das Muster als Objekt {id: meineID, val: true} angegeben wird, erfolgt die Triggerung bei jeder Aktualisierung des Zeitstempels, wenn man nicht zusätzlich change: 'ne' angibt.

              @tropisch sagte in Probleme mit clearTimer:

              konnte ich aber in keiner Doku etwas finden

              Funktionsbeschreibung auf Github.

              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

              T 1 Antwort Letzte Antwort
              0
              • paul53P paul53

                @tropisch sagte:

                Ich dachte bisher die on (Id, val:true) geschichte wird nur bei einer Änderung getriggert.

                Nein, wenn das Muster als Objekt {id: meineID, val: true} angegeben wird, erfolgt die Triggerung bei jeder Aktualisierung des Zeitstempels, wenn man nicht zusätzlich change: 'ne' angibt.

                @tropisch sagte in Probleme mit clearTimer:

                konnte ich aber in keiner Doku etwas finden

                Funktionsbeschreibung auf Github.

                T Offline
                T Offline
                tropisch
                schrieb am zuletzt editiert von
                #7

                @paul53 Vielen Dank! Das hilft mir weiter. Again what learned :)

                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

                296

                Online

                32.6k

                Benutzer

                82.3k

                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