Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Gelöst] Probleme mit clearTimer

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

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

      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @tropisch last edited by

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

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

          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @tropisch last edited by paul53

            @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)");
                }   
            });
            
            1 Reply Last reply Reply Quote 0
            • T
              tropisch last edited by

              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?

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

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

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  775
                  Online

                  31.8k
                  Users

                  79.9k
                  Topics

                  1.3m
                  Posts

                  javascript
                  2
                  7
                  446
                  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