NEWS
PIR und LED Licht: Wo ist mein Fehler
-
Hallo,
ich will eine Badbeleuchtung haben über einen Zigbee LED Streifen, der angeht, wenn Bewegung festgestellt wird.
habe dazu einen IKEA PIR Sensor im Einsatz.
(den Anwesenheitssensor will ich nicht, der geht ja auch durch Wände und hinter dem Bad liegt die Küche und der Flur, deswegen nur PIR).Ich will, das das Licht auch nur bei gewissem LUX Wert angeht.
Der eigene IKEA Sensor hat zwar auch LUX, der spinnt aber manchmal, deswegen habe ich noch eine andere Quelle in das Script aufgenommen.ich habe auch noch eine andere Lampe, die genutzt wird zum Duschen, deswegen der Abgleich mit Lampe 2.
Es klappt jetzt auch alles soweit ganz gut.
Aaaaber:
Irgendwie klappt das nicht. Also es klappt schon, das Erstauslösen funktioniert gut.
Aber wenn man zB Zähne putzt und länger als die Zeit braucht, dann geht es nicht mehr an.
Oder man hampelt rum, manchmal klappt es, manchmal nicht.Jetzt die Frage:
Liegt das an meinem Script?
Oder kommt das vom IKEA Sensor, das er ein gewisses Zeitintervall hat und deswegen nur alle zB 20 Sekunden checkt?
Und mein script überlapt sich dann dann ggf und deswegen keine erneute Aktivierung?on({ id: [].concat(['deconz.0.Sensors.12.presence']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if ((getState('deconz.0.Sensors.12.presence').val == true) && (getState('javascript.0.Anwesenheitserkennung.Bad').val == false) && (compareTime('06:00', '07:00', 'between') || compareTime('21:30', '22:45', 'between')) && ((getState('deconz.0.Sensors.13.lux').val <= 30) || (getState('deconz.0.Sensors.3.lux').val <= 30))) { setState('deconz.0.Lights.13.level' /* Ledvance Lichtstreifen Bad level */, 100); setState('deconz.0.Lights.13.on' /* Ledvance Lichtstreifen Bad on */, true); setStateDelayed('deconz.0.Lights.13.on' /* Ledvance Lichtstreifen Bad on */, false, 180000, false); } else if ((getState('deconz.0.Sensors.12.presence').val == true) && (getState('javascript.0.Anwesenheitserkennung.Bad').val == false) && (compareTime('06:00', '07:00', 'not between') || compareTime('21:30', '22:45', 'not between')) && ((getState('deconz.0.Sensors.13.lux').val <= 30) || (getState('deconz.0.Sensors.3.lux').val <= 30))) { setState('deconz.0.Lights.13.level' /* Ledvance Lichtstreifen Bad level */, 100); setState('deconz.0.Lights.13.on' /* Ledvance Lichtstreifen Bad on */, true); setStateDelayed('deconz.0.Lights.13.on' /* Ledvance Lichtstreifen Bad on */, false, 45000, false); } });
Das ganze als Blockly:
-
@jhuebner1 sagte: Liegt das an meinem Script?
Ja, das Licht wird nach der Verzögerungszeit von 3 min bzw. 45 s zwangsweise ausgeschaltet, da die Timer bei erneuter Bewegungserkennung nicht gestoppt werden.
Vorschlag:Was hat es mit dem DP "javascript.0.Anwesenheitserkennung.Bad" auf sich?
-
@paul53
Danke, schau ich mir an und versuche es nachzubauen.Das javascript.0.Anwesenheitserkennung.Bad ist genau mein "Duschszenario".
Ich weiß, hat mit Anwesenheit nix zu tun, aber so hab ich angefangen und lass das alles im gleichen verzeichnis liegen..... -
@jhuebner1 sagte: javascript.0.Anwesenheitserkennung.Bad ist genau mein "Duschszenario".
Ich habe es in der Version mit nur einem Timeout als "Duschlicht" bezeichnet:
-
@paul53
Irgendwas hat da bei mir nicht geklappt.
Mal ging es, mal ging es nicht....Ich hab das jetzt mal durch ChatGPD gejagd und das kam dabei rum:
var timeout, timeout2; function clearPreviousTimeouts() { if (timeout) { clearTimeout(timeout); timeout = null; } if (timeout2) { clearTimeout(timeout2); timeout2 = null; } } on({ id: [].concat(['deconz.0.Sensors.12.presence']), change: 'ne' }, (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; // Prüfen, ob der Sensor auf Anwesenheit schaltet und Lichtsteuerungsbedingungen erfüllt sind if (value && !getState('javascript.0.Anwesenheitserkennung.Bad').val && (getState('deconz.0.Sensors.13.lux').val <= 20 || getState('deconz.0.Sensors.3.lux').val <= 30)) { // Wenn innerhalb der Zeitbereiche if (compareTime('06:00', '07:00', 'between') || compareTime('21:30', '22:45', 'between')) { clearPreviousTimeouts(); setState('deconz.0.Lights.13.level', 100); // Setze Lichtlevel auf 100% setState('deconz.0.Lights.13.on', true); // Schalte das Licht ein // Timeout nach 3 Minuten timeout = setTimeout(() => { timeout = null; setState('deconz.0.Lights.13.on', false); // Schalte das Licht aus }, 180000); } else { clearPreviousTimeouts(); setState('deconz.0.Lights.13.level', 100); setState('deconz.0.Lights.13.on', true); // Timeout nach 1 Minute timeout2 = setTimeout(() => { timeout2 = null; setState('deconz.0.Lights.13.on', false); // Schalte das Licht aus }, 60000); } } });