NEWS
[Gelöst] setTimeout() um Toggeln von DP zu ignorieren
-
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! -
@wurstdlx
Zeilen 6 und 11 enthalten keinen Vergleich, sondern eine Zuweisung. -
@paul53 Oh, ja ich habe so meine Schwierigkeiten mit dem if-statement in js.
Es müsste:if (variable=="string"){}
sein, oder?
-
-
@paul53 Danke, klappt jetzt!
-
@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); });