Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Gelöst] setTimeout() um Toggeln von DP zu ignorieren

    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] setTimeout() um Toggeln von DP zu ignorieren

    This topic has been deleted. Only users with topic management privileges can see it.
    • W
      WurstDLX last edited by WurstDLX

      Hallo,

      ich bin eigentlich der Meinung, dass ich settimeout verstanden habe. Aber scheinbar doch nicht.
      Hintergrund ist folgender: Ich habe eine NUKI Bridge auf einem ESP86. Die Bridge startet (warum auch immer) alle 2h neu, vermutlich ist das Wifi zu instabil. Bei jedem "offline" oder "online" sende ich mir eine Nachricht. Nun möchte ich aber die kurzen Restarts nicht ständig signalisiert bekommen. Da ein Neustart ca. 1min dauert hatte ich folgende Überlegung:
      Wechselt der Status der Connection zur Bridge auf "offline", warte 1min und sende erst dann ein "Ja die Bridge ist offline", wenn sie immer noch nach Ablauf des Timers offline ist.

      Die settimeout Funktion setzt ja erst asynchron nach Ablauf des Timers ein, daher wusste ich nicht, welchen Wert denn eigentlich in obj.state.val verbleibt und muss vmtl neu Auslesen. Es kann ja nämlich sein, dass der Wert in der Zwischenzeit sich ändert bzw die Funktion aufgrund dessen wieder aufgerufen wird.

      on({id:idNUKIConnectionState, change:"ne"},function(obj){
          // check if old value was not connected for more than 1 minute
          var wait_ms=60*1000;              // wait ms to check for state
          if (!timeoutVar){                 //check if timer is set
              clearTimeout(timeoutVar);     //reset timer
              if (obj.state.val="offline"){
                  //sendTo('telegram.0','Timerstart.');
                  timeoutVar=setTimeout(function(){
                      // wait for possible restart
                      var newState=getState(idNUKIConnectionState).val;
                      if (newState="online"){
                          //sendTo('telegram.0','NUKI Bridge ist wieder '+ newState +' nach Ablauf des Timers.');
                          }
                      else{
                          sendTo('telegram.0','NUKI Bridge ist immer noch '+ newState +' nach Ablauf des Timers.');
                          }
                      timeoutVar=null;
                  },wait_ms);
              }
              else{
                   // online w/o timer
                   sendTo('telegram.0','NUKI Bridge ist '+ obj.state.val +'.');
               }
          }
          else {
              //sendTo('telegram.0','NUKI Bridge wurde während des Timers '+ obj.state.val +'.');
          }
      });
      

      Also die Abfrage während des Timers funktionierte, aber als ich die Bridge ausgemacht habe und nie wieder an, kam keine Meldung. Kurz gesagt, ich würde gerne ein Toggeln für 1-2min ignorieren.

      Wie wäre das denn richtig?
      Danke euch im Voraus!

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

        @wurstdlx
        Zeilen 6 und 11 enthalten keinen Vergleich, sondern eine Zuweisung.

        W 1 Reply Last reply Reply Quote 2
        • W
          WurstDLX @paul53 last edited by

          @paul53 Oh, ja ich habe so meine Schwierigkeiten mit dem if-statement in js.
          Es müsste:

          if (variable=="string"){}
          

          sein, oder?

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

            @wurstdlx sagte:

            if (variable=="string"){}
            

            sein, oder?

            Ja.

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

              @paul53 Danke, klappt jetzt!

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

                @wurstdlx sagte: klappt jetzt!

                Weniger komplizierte Version:

                const debug = true;
                const idNUKIConnectionState = '';
                const wait_ms = 60*1000;              // wait ms to check for state
                var timeoutVar = null;
                var offline = false;
                
                on(idNUKIConnectionState, function(obj){
                    // check if old value was not connected for more than 1 minute
                    clearTimeout(timeoutVar);     //reset timer
                    if (obj.state.val == "offline") {
                        timeoutVar=setTimeout(function(){
                            sendTo('telegram.0','NUKI Bridge ist offline nach Ablauf des Timers.');
                            offline = true;
                        }, wait_ms);
                    } else if(offline) {
                        sendTo('telegram.0','NUKI Bridge ist wieder online.');
                        offline = false;
                    }
                    if(debug) log('NUKI Bridge ist ' + obj.state.val); 
                });
                
                1 Reply Last reply Reply Quote 0
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                885
                Online

                31.8k
                Users

                80.0k
                Topics

                1.3m
                Posts

                2
                6
                267
                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