Seite 1 von 1

Verzögerung Licht aus

Verfasst: 17. Mär 2022 07:30
von SaschaQ
Hallo zusammen,

ich habe im Gäste WC einen Bewegungsmelder, der das Licht an und ausschaltet.

Erkennt der Bewegungsmelder eine Bewegung, bleibt er für 90 Sekunden auf AN und schaltet dann auf AUS.

Somit geht das Licht nach 90 Sekunden wieder aus.

Ich möchte dies gerne verzögern, sodass das Licht 7 Minuten an bleibt.

Ich habe dazu diese Rule gebaut:

Code: Alles auswählen

rule "Licht Gäste WC Bewegungsmelder aus"
when
	Item eg_gaestewc_bm_bewegung changed to OFF
	
	then
	createTimer(now.plusMinutes(7), [|
	
		eg_gaestewc.sendCommand(OFF)
		eg_gaestewc_wb.sendCommand(OFF)
  ])
end

Leider funktioniert es nicht mit der Rule, das ,licht geht nach 90 Sekunden aus , anstatt nach 7 Minuten.

Re: Verzögerung Licht aus

Verfasst: 17. Mär 2022 17:18
von udo1toni
Wie schaltest Du das Licht denn ein?
Vermutlich ist der Bewegungsmelder direkt mit dem Licht gekoppelt, das geht dann natürlich nicht. Du brauchst eine Rule, die das Licht auch einschaltet:

Code: Alles auswählen

rule "Licht Gäste WC Bewegungsmelder"
when
    Item eg_gaestewc_bm_bewegung changed
then
    if(newState != OFF) {
        eg_gaestewc.sendCommand(ON)
        eg_gaestewc_wb.sendCommand(ON)
    } else 
        createTimer(now.plusMinutes(7), [|
            eg_gaestewc.sendCommand(OFF)
            eg_gaestewc_wb.sendCommand(OFF)
        ])
    }
end
Das Licht leuchtet dann insgesamt 8 Minuten 30 Sekunden, falls während der 90 Sekunden Bewegung wahrgenommen wird auch länger, allerdings: Falls der Melder einmal das OFF gesetzt hat, ist das Licht unwiderbringlich nach 7 Minuten aus und geht erst wieder an, wenn der Melder 90 Sekunden keine Bewegung erkannt hat und dann erneut Bewegung wahrnimmt.
Die bessere Variante ist deshalb, den eventuell laufenden Ausschalttimer auch zu stoppen:

Code: Alles auswählen

var Timer tWCGast = null // globale Timer müssen zu Beginn der Datei definiert werden

rule "Licht Gäste WC Bewegungsmelder"
when
    Item eg_gaestewc_bm_bewegung changed
then
    tWCGast?.cancel                       // falls ein Timer läuft, abbrechen
    if(newState != OFF) {
        eg_gaestewc.sendCommand(ON)
        eg_gaestewc_wb.sendCommand(ON)
    } else 
        tWCGast = createTimer(now.plusMinutes(7), [| // Timer starten und Zeiger in Variable schreiben
            eg_gaestewc.sendCommand(OFF)
            eg_gaestewc_wb.sendCommand(OFF)
        ])
    }
end

Re: Verzögerung Licht aus

Verfasst: 17. Mär 2022 17:35
von SaschaQ
Für das Einschalten sieht die Rule exakt gleich aus nur fürs einschalten eben.

Re: Verzögerung Licht aus

Verfasst: 17. Mär 2022 22:13
von udo1toni
Wie Du in meinem Beispiel siehst, braucht es eigentlich keine zwei Rules... der wichtigste Punkt ist, den Timer steuern zu können, um ihn abzubrechen, sobald eine Bewegung erkannt wurde. Das geht nur über eine globale Variable (wie im Code vorgeführt). Du kannst den Code auch auf zwei Rules aufteilen (eine zum Ein- die andere zum Ausschalten), der Timer muss aber in beiden Fällen zurückgesetzt werden, sonst kann es dazu kommen, dass der Timer mehrfach angelegt wird.
Immer dran denken: die Variable hält nur einen Zeiger auf den Eintrag im Scheduler, der Scheduler kann beliebig viele Einträge speichern und führt diese alle zu den gesetzten Zeiten aus (vorausgesetzt, er hat einen freien Thread zur Verfügung). Es nützt also nichts, mehrfach

Code: Alles auswählen

myTimer = createTimer()
zu schreiben, es wird lediglich der Variablen myTimer immer wieder ein neuer Zeiger zugewiesen. Die Timer bleiben erhalten, können aber nicht mehr gesteuert werden (weil ja der Zeiger überschrieben wurde).

Re: Verzögerung Licht aus

Verfasst: 18. Mär 2022 06:09
von SaschaQ
Wieder was dazugelernt, besten Dank