NEWS
(gelöst) setStateDelayed und clearStateSelayed
-
Hallo Zusammen
kann mir jemand sagen warum das Clearstatedelayed nicht funktioniert.
Beim öffnen eine Fensters wird mit einem setstatedelayed eine Lampe aktiviert und beim vorzeitigen schließen soll das clearstatedelayed die Lampe nicht mehr aktivieren.
Die If Anweisungen funktionieren, aber egal wie die clearstatedelayed mache, mit variablen in hoch Komma oder ohne.
Die Lampe leuchte trotzdem auf.var idSayIt = 'alexa2.0.Echo-Devices.G090L909652112PK.Commands.announcement'/*announcement*/; // Hier die entsprechende SayIt Text ID var idSensor = 'hm-rpc.0.HEQ0358454.1.STATE'/*Bad Fensterkontakt Sender.STATE*/; var idActor = 'hm-rpc.0.NEQ0773372.1.STATE'/*Haustuer Klingel:1.STATE*/; on({id:'hm-rpc.0.HEQ0358454.1.STATE'/*Bad Fensterkontakt Sender.STATE*/, change:'ne'}, function(obj) { log('Ausgelöst'); if (getState('hm-rpc.0.HEQ0358454.1.STATE'/*Bad Fensterkontakt Sender.STATE*/).val === true) { log('If Ausgelöst'); setStateDelayed('hm-rpc.0.NEQ0773372.1.STATE'/*Haustuer Klingel:1.STATE*/, true, 30000); //setState (idSayIt, "Das Fenster im Bad wurde geöffnet. Die aktuelle Luftfeuchtigkeit beträgt" + getState("hm-rpc.0.LEQ0078217.1.HUMIDITY").val + "Prozent"); } if (getState('hm-rpc.0.HEQ0358454.1.STATE'/*Bad Fensterkontakt Sender.STATE*/).val === false) { //setState (idSayIt, "Das Fenster im Bad wurde geschlossen"); log('fenster geschlossen vor delayed'); clearStateDelayed('hm-rpc.0.NEQ0773372.1.STATE'/*Haustuer Klingel:1.STATE*/); log('fenster geschlossen nach delayed'); setState('hm-rpc.0.NEQ0773372.1.STATE'/*Haustuer Klingel:1.STATE*/, false); } });
-
var timeout = null; var idSayIt = 'alexa2.0.Echo-Devices.G090L909652112PK.Commands.announcement'/*announcement*/; // Hier die entsprechende SayIt Text ID var idSensor = 'hm-rpc.0.HEQ0358454.1.STATE'/*Bad Fensterkontakt Sender.STATE*/; var idActor = 'hm-rpc.0.NEQ0773372.1.STATE'/*Haustuer Klingel:1.STATE*/; on({id:'hm-rpc.0.HEQ0358454.1.STATE'/*Bad Fensterkontakt Sender.STATE*/, change:'ne'}, function(obj) { log('Ausgelöst'); if (obj.state.val) { log('If Ausgelöst'); timeout = setStateDelayed('hm-rpc.0.NEQ0773372.1.STATE'/*Haustuer Klingel:1.STATE*/, true, 30000); //setState (idSayIt, "Das Fenster im Bad wurde geöffnet. Die aktuelle Luftfeuchtigkeit beträgt" + getState("hm-rpc.0.LEQ0078217.1.HUMIDITY").val + "Prozent"); } else { //setState (idSayIt, "Das Fenster im Bad wurde geschlossen"); log('fenster geschlossen vor delayed'); if timeout clearStateDelayed('hm-rpc.0.NEQ0773372.1.STATE', timeout/*Haustuer Klingel:1.STATE*/); log('fenster geschlossen nach delayed'); setState('hm-rpc.0.NEQ0773372.1.STATE'/*Haustuer Klingel:1.STATE*/, false); } });
versuche es mal so. obj.state.val beinhaltet das was du mit getState() abfragst und auch den aktuellen Wert.
-
var timeout = null; var idSayIt = 'alexa2.0.Echo-Devices.G090L909652112PK.Commands.announcement'/*announcement*/; // Hier die entsprechende SayIt Text ID var idSensor = 'hm-rpc.0.HEQ0358454.1.STATE'/*Bad Fensterkontakt Sender.STATE*/; var idActor = 'hm-rpc.0.NEQ0773372.1.STATE'/*Haustuer Klingel:1.STATE*/; on({id:'hm-rpc.0.HEQ0358454.1.STATE'/*Bad Fensterkontakt Sender.STATE*/, change:'ne'}, function(obj) { log('Ausgelöst'); if (obj.state.val) { log('If Ausgelöst'); timeout = setStateDelayed('hm-rpc.0.NEQ0773372.1.STATE'/*Haustuer Klingel:1.STATE*/, true, 30000); //setState (idSayIt, "Das Fenster im Bad wurde geöffnet. Die aktuelle Luftfeuchtigkeit beträgt" + getState("hm-rpc.0.LEQ0078217.1.HUMIDITY").val + "Prozent"); } else { //setState (idSayIt, "Das Fenster im Bad wurde geschlossen"); log('fenster geschlossen vor delayed'); if (timeout) clearStateDelayed('hm-rpc.0.NEQ0773372.1.STATE', timeout/*Haustuer Klingel:1.STATE*/); log('fenster geschlossen nach delayed'); setState('hm-rpc.0.NEQ0773372.1.STATE'/*Haustuer Klingel:1.STATE*/, false); } });
Hi, also das Skript funktioniert, aber clearstatedelayed wird nicht erledigt, die Leuchte geht nach 30sec an, auch wenn das Fenster nach 10 sec geschlossen wird.
Musste timeout nach dem if im else in Klammern setzten sonst kamen Compiler Fehler, oder läuft das bei dir ohne klammern? -
@londo99 sagte: läuft das bei dir ohne klammern?
Die Bedingung für if muss immer in Klammern gesetzt werden.
Ich verwende ...StateDelayed() nicht, sondern nur setTimeout() und clearTimeout(), da ich so die volle Kontrolle über die Timer habe und auch noch Ressourcen schone.
-
@londo99
War ein Tippfehler, bei mir ist es ähnlich wie bei Paul. Ich nutze setTimeout().Versuche es mal so;
var timeout = null; var idSayIt = 'alexa2.0.Echo-Devices.G090L909652112PK.Commands.announcement' /*announcement*/ ; // Hier die entsprechende SayIt Text ID var idSensor = 'hm-rpc.0.HEQ0358454.1.STATE' /*Bad Fensterkontakt Sender.STATE*/ ; var idActor = 'hm-rpc.0.NEQ0773372.1.STATE' /*Haustuer Klingel:1.STATE*/ ; on({ id: idSensor /*Bad Fensterkontakt Sender.STATE*/ , change: 'ne' }, function(obj) { log('Ausgelöst'); if (timeout) { clearTimeout(timeout); timeout = null; }; if (obj.state.val) { log('If Ausgelöst'); timeout = setTimeout(function() { setState(idActor /*Haustuer Klingel:1.STATE*/ , true); }, 30 * 1000); //setState (idSayIt, "Das Fenster im Bad wurde geöffnet. Die aktuelle Luftfeuchtigkeit beträgt" + getState("hm-rpc.0.LEQ0078217.1.HUMIDITY").val + "Prozent"); } else { //setState (idSayIt, "Das Fenster im Bad wurde geschlossen"); log('fenster geschlossen vor delayed'); log('fenster geschlossen nach delayed'); if (getState(idActor).val) setState(idActor /*Haustuer Klingel:1.STATE*/ , false); } });
-
Ok funktioniert, vielen Dank ihr zwei, habe jetzt einige Skripte zu ändern, sonst geht der WAF den Berg runter