NEWS
[gelöst] Verzögert ausschalten "Timeout" dauert zu lange
-
@Mr. Burns:Der Bewegungsmelder soll das Licht einschalten. Wenn das Licht aber schon über den Taster eingeschaltet wurde, `
Nach dieser Aussage erwarte ich einen Bewegungsmelder (zum Testen die Taste einer FB) und einen Taster zu Schalten des Lichts. -
sollte der Lichtschalter (bzw. die Lichtschalter) in das Script?
Hab das Licht zum testen über die CCU direkt geschaltet (bzw. über die app).
-
@Mr. Burns:Hab das Licht zum testen über die CCU direkt geschaltet (bzw. über die app). `
Dann muss man den Aktor auswerten.
@Mr. Burns:sollte der Lichtschalter (bzw. die Lichtschalter) in das Script? `
Nicht unbedingt. Handelt es sich um eine (mehrere) Direktverknüpfung(en) ?Vielleicht geht es so:
var idSensor = "hm-rpc.0.FEQ00XXXXX.1.PRESS_SHORT"; var idAktor = "hm-rpc.1.JEQ04XXXXX.16.STATE"/*Licht Deckenbeleuchtung Wohnzimmer.STATE*/; var stateSensor = false; var stateAktor = getState(idAktor).val; var timer = null; // Aufruf der Funktion bei Bewegung on({id: idSensor, val: true, ack: true}, function() { if (!stateAktor || stateSensor) { // Licht ist aus oder wurde durch BWM eingeschaltet stateSensor = true; if(!stateAktor) setState(idAktor, true); // Schalte Licht sofort ein, wenn getriggert wurde if(timer) clearTimeout(timer); timer = setTimeout(function() { timer = null; setState(idAktor, false); // Schalte Licht verzögert aus }, 1 * 15 * 1000); // nach 5 * 60s * 1000ms, also 5 Minuten } }); on({id: idAktor, ack: true}, function(dp) { stateAktor = dp.state.val; if(!stateAktor) { // Licht aus stateSensor = false; if(timer) clearTimeout(timer); timer = null; } });
-
Es funktioniert genauso wie es mir vorgestellt habe!
Super! Vielen Dank.
Ich bin noch dabei die Logik zu verstehen…:-D
Gruß
-
@Mr. Burns:Es funktioniert genauso wie es mir vorgestellt habe! `
Das freut mich. Dann markiere bitte noch das Thema als gelöst (im ersten Beitrag). -
Klar. Für alle die sowas oder so ähnlich nachbauen:
Das Licht (in der Küche) soll Abend (wenn es dämmert) einschalten wenn jemand den Raum betritt. Wurde das Licht bereits manuell eingeschaltet, soll es nicht über die Zeitverzögerung wieder ausgeschaltet werden:
// Datenpunkt-ID var idSensor = "hm-rpc.0.FEQ00XXXXX.1.PRESS_SHORT"; var idAktor = "hm-rpc.1.JEQ04XXXXX.16.STATE"/*Licht Deckenbeleuchtung Wohnzimmer.STATE*/; var idLux = "hm-rega.0.8681"/*homeduino_a_lux*/; var stateSensor = false; var stateAktor = getState(idAktor).val; var stateLux = getState(idLux).val; var timer = null; // Aufruf der Funktion bei Bewegung on({id: idSensor, val: true, ack: true}, function() { // Trigger if ((stateLux <= 500) && (!stateAktor || stateSensor)) { // Licht aus oder Merker BWM stateSensor = true; // Merker BWM if(!stateAktor) setState(idAktor, true); // Schalte Licht sofort ein, wenn getriggert wurde if(timer) clearTimeout(timer); timer = setTimeout(function() { timer = null; setState(idAktor, false); // Schalte Licht verzögert aus }, 1 * 15 * 1000); // nach 5 * 60s * 1000ms, also 5 Minuten } }); on({id: idAktor, ack: true}, function(dp) { // Trigger stateAktor = dp.state.val; // Merker Aktor if(!stateAktor) { // Wenn Merker Aktor aus stateSensor = false; // Setze Merker BWM aus if(timer) clearTimeout(timer); // ??? timer = null; // ??? } });
-
if(timer) clearTimeout(timer); // Abbruch Timeout (Licht war per BWM ein und ist manuell aus) timer = null; // für if(timer)
-
@Mr. Burns:Das Licht (in der Küche) soll Abend (wenn es dämmert) einschalten `
Es fehlt noch die Aktualisierung der Skriptvariable stateLux (wird jetzt nur bei Skriptstart gesetzt).on(idLux, function(dp) { stateLux = dp.state.val; });
-
Du hast natürlich vollkommen recht. Zu meiner Verteidigung: Ich kann in Wirklichkeit gar nicht scripten…ich mach mehr in FUP Programmierung (S7/TIA)...Ich versteh auch nicht wie sich da "Normalos" zurecht finden. Den unteren Teil deines Scripts hab ich noch nicht richtig verstanden. Du setzt den Merker zurück wenn das Licht ausgeht
` > if(!stateAktor) { // Wenn Merker Aktor ausstateSensor = false; // Setze Merker BWM aus
, aber eigentlich geht er ja nur in das Script bei einer positiven Flanke
> on({id: idAktor, ack: true}, function(dp) { // Trigger `Ich will nur Prüfen ob es schon Dunkel genug ist wenn der Bewegungsmelder ausgelöst wird…
Könnte doch so funktionieren:
// Datenpunkt-ID var idSensor = "hm-rpc.0.FEQ00XXXXX.1.PRESS_SHORT"; var idAktor = "hm-rpc.1.JEQ04XXXXX.16.STATE"/*Licht Deckenbeleuchtung Wohnzimmer.STATE*/; var idLux = "hm-rega.0.8681"/*homeduino_a_lux*/; var stateSensor = false; var stateAktor = getState(idAktor).val; var stateLux = getState(idLux).val; var timer = null; // Aufruf der Funktion bei Bewegung on({id: idSensor, val: true, ack: true}, function() { // Trigger stateLux = getState(idLux).val; if ((stateLux <= 500) && (!stateAktor || stateSensor)) { // Licht aus oder Merker BWM // log (stateLux); stateSensor = true; // Merker BWM if(!stateAktor) setState(idAktor, true); // Schalte Licht sofort ein, wenn getriggert wurde if(timer) clearTimeout(timer); timer = setTimeout(function() { timer = null; setState(idAktor, false); // Schalte Licht verzögert aus }, 1 * 15 * 1000); // nach 5 * 60s * 1000ms, also 5 Minuten } }); on({id: idAktor, ack: true}, function(dp) { // Trigger stateAktor = dp.state.val; // Merker Aktor if(!stateAktor) { // Wenn Merker Aktor aus stateSensor = false; // Setze Merker BWM aus if(timer) clearTimeout(timer); // ??? timer = null; // ??? } });
Edit:
Hab gerade noch was rumprobiert. Bedeutet dies
> ack: true
gar nicht bei Aktualisierung Wert "True" also Positive Flanke? Er triggert die Funktion bei jedem Flankenwechsel. -
@Mr. Burns:Bedeutet dies
ack: true
gar nicht bei Aktualisierung Wert "True" also Positive Flanke? Er triggert die Funktion bei jedem Flankenwechsel. `
Er triggert sogar bei jeder Änderung des Zeitstempels, unter der Bedingung, dass eine Bestätigung (Rückmeldung des Aktors über die Ausführung) erfolgt ist. Sollte nur bei Wert "true" getriggert werden, muss man schreiben val: true. Will man ganz sicher gehen, dass nur bei einer postiven Flanke getriggert wird, dann val: true, oldVal: false oder val: true, change: 'ne'.