Seite 1 von 1

Problem mit OH3 Timer-Rule

Verfasst: 25. Jan 2022 12:31
von cyrill.sneer
Hallo zusammen,

ich habe einen Timer, der immer dann mit 90 Miunten gestartet wird, wenn der Bewegungsmelder im Flur ausschaltet.
Ziel ist zwischen 22 und 7 Uhr zu erkennen, dass es 90 Minuten keine Bewegung im Flur gab und dann das Haus in den Standby schaltet.

Code: Alles auswählen

rule "Sleeptimer"
  when
		Item EG_FLUR_LED_Treppe_Schalten changed
	then	{ 
		if
		((now.toLocalTime.getHour > 22 ||
		now.toLocalTime.getHour < 7) &&
		timer_sleep === null)	{
			timer_sleep = createTimer(now.plusMinutes(90))
			[|PanasonicTV_Remote.sendCommand("POWER")
//			weitere Schritte
			timer_sleep = null]
   			 }
  else	{ timer_sleep.reschedule(now.plusMinutes(90))}
		}
end
Das funktioniert soweit einwandfrei. Allerdings schaltet die Rule auch morgens 90 Minuten nach dem letzten ausschalten der BWM in den Standby. Woran kann das liegen? Ich bin gerade ratlos...

Re: Problem mit OH3 Timer-Rule

Verfasst: 25. Jan 2022 16:39
von udo1toni
Das ist einem Denkfehler Deinerseits geschuldet :)

Du nutzt ein if - else.
Du prüfst, ob Zeitraum erfüllt und Timer nicht gestartet. Ist das der Fall, legst Du den Timer an (soweit korrekt)
Andernfalls planst Du den Timer erneut (also falls auch nur eine der Bedingungen oben nicht erfüllt ist).

Weiterhin triggert die Rule bei jeder Änderung. Im Zweifel wird das Licht nach weniger als 90 Minuten ausgehen, es wäre also sinnvoll, auf changed to OFF zu triggern, da dies ohnehin der letzte Trigger ist.

Code: Alles auswählen

rule "Sleeptimer"
when
    Item EG_FLUR_LED_Treppe_Schalten changed to OFF                 // Licht schaltet nach Bewegung wieder aus
then
    timer_sleep?.cancel                                             // Timer entfernen, falls geplant
    if(now.toLocalTime.getHour < 23 && now.toLocalTime.getHour > 6) // falls Uhrzeit zwischen 7:00:00 und 23:00:00
        return;                                                     // Regel abbrechen

    timer_sleep?.cancel                                             // Timer entfernen, falls geplant
    timer_sleep = createTimer(now.plusMinutes(90), [ |              // Timer anlegen (Lambda ist 2. Parameter der Definition) 
        PanasonicTV_Remote.sendCommand("POWER")
        //    weitere Schritte
    ])                                                              // Ende von createTimer
end
Der Code ist etwas anders formatiert und arbeitet im Detail etwas anders, sollte aber Deinem Wunsch entsprechen.

Die Rule wird nur beim Ausschalten des Lichts getriggert.

Zunächst wird ein eventuell laufender Timer entfernt. Das Fragezeichen zwischen timer_sleep und .cancel bewirkt, dass der Befehl .cancel nur ausgeführt wird, wenn der Timer auch existiert. Ist also das Gleiche wie if(timer_sleep !== null) timer_sleep.cancel.
Dieser Punkt ist nicht unwichtig, denn wir wollen nicht, dass ein eventuell kurz vor 7 Uhr gestarteter Timer noch auf Standby schaltet, falls danach wieder Bewegung erkannt wird.
Eventuell möchtest Du noch eine weitere Rule anlegen, die um 7 Uhr gezielt laufende Timer cancelt.

Sollte die Rule zwischen 7 Uhr und 23 Uhr getriggert werden, so wird sie an dieser Stelle abgebrochen.

Anschließend ist sichergestellt, dass es keinen laufenden Timer gibt, aber der Zeitraum passt.
Nun kann also der Timer angelegt werden.

Ich nutze gerne die Schreibweise, bei der deutlich wird, dass das Lambda (Teil zwischen [ | und ]) ein Teil des Funktionsaufrufs createTimer() ist. Deshalb schreibe ich es innerhalb der Klammern und trenne es als zweiten Parameter mit einem Komma ab.

Ich gehe davon aus, dass PanasonicTV_Remote.sendCommand("POWER") nicht hinreichend ist. Oder ist dies ein definierter Ausschaltbefehl?

Re: Problem mit OH3 Timer-Rule

Verfasst: 25. Jan 2022 19:03
von cyrill.sneer
Hallo Udo,

wow! Zunächst einmal herzlichen Dank für die schnelle und kompetente Antwort.
Ich habe es gerade eingebaut und es scheint zu funktionieren :-)

Der Exit (return) wenn die Uhrzeit nicht richtig ist, macht Sinn. Tatsächlich war das den Logikfehler...
Ansonsten kannte ich das mit dem Fragezeichen zur Prüfung ob ein Wert enthalten ist nicht. Klasse.

Ob ich bei Change oder beim Ausschalten triggere, ist egal, da der letzte Wechsel immer ein Off ist und die Zeitdauer deutlich unter der des Sleeptimers ist.

PS:
Nachdem das Pana-Binding unter OH3 nicht mehr verfügbar ist, habe ich eine Lösung per http-Aufruf im Weg gefunden un implementiert. Die Zeile PanasonicTV_Remote.sendCommand("POWER") schaltet die Glotze ab.

Re: Problem mit OH3 Timer-Rule

Verfasst: 25. Jan 2022 20:20
von udo1toni
cyrill.sneer hat geschrieben: 25. Jan 2022 19:03 Ob ich bei Change oder beim Ausschalten triggere, ist egal, da der letzte Wechsel immer ein Off ist und die Zeitdauer deutlich unter der des Sleeptimers ist.
Na ja, nein :) Der Punkt ist, dass es sinnlos ist, auf changed (ohne to OFF) zu triggern, weil jeder von OFF verschiedene Wert in weniger als 90 Minuten wieder überschrieben wird.
Mehr noch, stellen wir uns vor, du machst einen 2-Stunden-Dauerlauf in Deinem Flur und der Bewegungsmelder triggert die Lampe alle paar Sekunden auf ON. die Lampe bleibt also dauerhaft eingeschaltet, weil ständig Bewegung erkannt wird. Leider hast Du um 23:00:00 Uhr mit dem Dauerlauf angefangen, das Haus geht dann nach 90 Minuten in Standby, obwohl Du die ganze Zeit den Flur rauf und runter wetzt. ;)
Ich gebe zu, dass es eher ungewöhnlich wäre... aber den Sonderfall "mehr als 90 Minuten Hochbetrieb nach 23 Uhr" deckst Du zusätzlich ab, wenn Die Rule nur auf das OFF-Ereignis triggert. Eigentlich müsste man sogar from ON to OFF setzen, um auszuschließen, dass Du bei einem Systemstart nach 23 Uhr die Rule triggerst (Statuswechsel von UNDEFINED oder NULL zu OFF).

Re: Problem mit OH3 Timer-Rule

Verfasst: 29. Jan 2022 13:19
von cyrill.sneer
Danke für Deine ausführliche Antwort! Ich verneige mein Haupt und triggere auf OFF :)