NEWS
Zeitspanne, Trigger und if Abfrage
-
Hallo zusammen,
ich spiele nun schon eine ganze Weile mit dem iobroker und habe auch einige Skripte implementiert.
Nun haben sich mit der Zeit einige Fragen bei mir aufgetan auf die ich keine Antwort finde:
1. Wie bzw. nach welchen Regeln verarbeitet Iobroker ein Skript, wenn z.B. ein Trigger (.on) innerhalb einer if-Abfrage bzw, einem anderen Trigger steht, also z.B.
.on(Anwesenheitstatus ändert sich) if(anwesenehit=wahr){ .on(Tür öffnet sich) Schalte das Licht im Flur ein
2. Wie kann ich eine Zeitspanne festlegen, sodass wenn ich nach hause komme und meine Anwesenheit wahr ist und sich dann innerhalb von 10 Minuten der Status des Türsensors ändert das Licht im Flur angeht und sich nach 3 Minuten wieder ausschaltet? Natürlich darf das Licht nur angehen, wenn die isAstroDay Funktion false ist. Folgendes ist mein Ansatz, welcher aber nicht funktioniert, da wie es aussieht direkt in die Trigger gesprungen wird, ohne dass vorherige Bedingungen abgefragt werden:
on({id: "cloud.0.services.ifttt"/*IFTTT value*/, change: "ne"}, function (obj) { if(getState("cloud.0.services.ifttt").val == 'person1_abwesend' && getState("cloud.1.services.ifttt").val == 'person2_abwesend'){ setState("hm-rega.0.950"/*Anwesenheit_HM*/, false); setState("hm-rpc.0.XXX.1.STATE"/*HM-LC-Sw1PBU-FM XXX:1.STATE*/, false); setState("hm-rpc.0.XXX.1.LEVEL"/*HM-LC-Dim1TPBU-FM XXX:1.LEVEL*/, 0); } else{ setState("hm-rega.0.950"/*Anwesend*/, true); on({id: "hm-rpc.0.XXX.1.STATE"/*HM-Sec-SCo XXX:1.STATE*/, change: "ne"}, function (obj) { if(isAstroDay()===false){ setState("hm-rpc.0.XXX.1.STATE"/*HM-LC-Sw1PBU-FM XXX:1.STATE*/, true); timeout = setTimeout(function () { setState("hm-rpc.0.XXX.1.STATE"/*HM-LC-Sw1PBU-FM XXX:1.STATE*/, false); }, 180000); } }); } });
Vielen Dank für eure Hilfe
-
Erzeuge bitte keine Trigger innerhalb von Funktionen, es sei denn, die Funktion ist explizit zum Erzeugen variabler Trigger programmiert.
Wie ich sehe, benötigst Du 3 Trigger (Person1, Person2, Tür). Die Kommunikation sollte über globale Skriptvariablen erfolgen.
var person1 = getState("cloud.0.services.ifttt").val; var person2 = getState("cloud.1.services.ifttt").val;
Diese Variablen werden im jeweiligen Trigger aktualisiert und können in einer Funktion ausgewertet werden.
@massa:sich dann innerhalb von 10 Minuten der Status des Türsensors ändert das Licht im Flur angeht `
Dazu solltest Du eine weitere globale Variable (jemand_kommt) erstellen, die durch die Personen-Trigger 10 Minuten lang auf true gesetzt wird und durch die Callback-Funktion des Tür-Triggers ausgewertet wird.var jemand_kommt = false; var timer1 = null; var timer2 = null; var timerTuer = null;
-
Ahhhh jetzt habe ich verstanden wie man es machen muss. Vielen Dank für deine Hilfe!