Seite 1 von 1

Regel Timer im Timer

Verfasst: 4. Mai 2021 07:39
von retai
Hallo zusammen,

ich habe eine Frage bezüglich Timer.
Ich will folgende Regel bauen. Wenn in der Dusche das Licht für 1min lang angeschalten ist, dann soll die Lüftung in Stufe 3 gestartet werden, nach 15 Minuten soll die Lüftung in Stufe 1 gestartet werden. (Lüftungsstufen sind Tastschalter, deswegen schicke ich jeweils einen ON Befehl zum Starten der Lüftungsstufe). Diese Regel soll nur zwischen 07:00-19:00 ausgeführt werden.
Die Abfrage, damit die Regel nur von 07:00-19-00 ausgeführt wird, habe ich über ein Proxyitem mit einer CRON Rule regeln können.
Allerding funktioniert bei mir das Schalter der Lüftung in Stufe 1 nach 15min nicht.
Kann mir hier jemand die Rule korrigieren, damit auch das Ausschalten funktioniert? Darf man keinen Timer in einem Timer erzeugen?
Evtl. kann man die Regel auch ohne zusätliches Proxy Item für die 07:00-19:00 lösen?

Code: Alles auswählen

var Timer tOnTime = null
rule "Lueftung Dusche 15min"
when
    Item dusche changed

then
    tOnTime?.cancel
    if(newState == ON && lueftungsautomatik.state == ON)
        tOnTime = createTimer(now.plusMinutes(1),[|
        lueftung3.sendCommand(ON)
		tOnTime = createTimer(now.plusMinutes(15),[|
		lueftung1.sendCommand(ON)
      		])
	 ])
end
Danke
retai

Re: Regel Timer im Timer

Verfasst: 4. Mai 2021 21:35
von udo1toni
Doch, das geht schon. Allerdings wird das nur passieren, wenn das Item dusche bis dahin seinen Zustand nicht geändert hat, denn die Rule triggert jedes Mal, wenn dusche seinen Zustand ändert, und gleich das Erste, was Du in der Rule tust, ist, den Timer zu canceln. Aber nur, wenn dusche ON ist, wird der Timer dann neu angelegt. Da Du die Timervariable wiederverwendest, geht das also in die Hose, wenn dusche weniger als 16 Minuten ON ist.

Soll der Lüfter tatsächlich stur 15 Minuten nach Start abschalten? ist es nicht eher so, dass er 15 Minuten nach Abschalten von dusche auf Stufe 1 zurück schalten sollte?

Eine andere Sache: Bekommst Du eine Rückmeldung, welche Lüfterstufe gerade läuft? Das wäre eine sehr hilfreiche Größe. Die Steuerung des Lüfters über mehrere Items ist auch nicht so toll, der Lüfter kann ja nicht zeitgleich auf Stufe 1 und Stufe 3 laufen. Es wäre also sinnvoll, ein Number Item zu haben, welches von 0 - 3 geht (oder auch von 1-3, falls es keine Null-Stellung gibt)

Nehmen wir an, Du hast vier Switch Items lueftung0 bis lueftung3. Nehmen wir weiter an, Du hast ein Group Item gLueftung, die genau die vier Items enthält. Weiterhin ein Number Item lueftung. Dann reichen zwei Rules:

Code: Alles auswählen

var Timer tOnTime = null

rule "Lueftung Dusche 15min"
when
    Item dusche changed
then
    if(lueftungsautomatik.state == ON) {
        tOnTime?.cancel
        if(dusche.state == ON) {
            if(lueftung.state != 3)
                tOnTime = createTimer(now.plusMinutes(1), [|
                    lueftung.sendCommand(3)
                ])
        } else {
            if(lueftung.state != 1)
                tOnTime = createTimer(now.plusMinutes(15), [|
                    lueftung.sendCommand(1)
                ])
        }
    }
end

rule "Luefter Stufe"
when
    Item lueftung received command
then
    gLueftung.members.filter[ i | i.name.contains(reveicedCommand) ].head.sendCommand(ON)
end
Die zweite Rule kümmert sich darum, den Befehl an das Number Item in einen von vier Befehlen umzusetzen. Der Witz ist, dass das sendCommand(ON) nur dann zum Zug kommt, wenn das empfangene Kommando passend ist, wird eine ungültige Zahl verwendet, so ist die Liste leer und es wird kein Kommando gesendet.

Die erste Rule erzeugt einen Timer, unter der Voraussetzung, dass dieser gebraucht wird (die aktive Lüfterstufe passt nicht zum Soll).
Der Code funktioniert natürlich nur dann sauber, wenn der Lüfter nicht auch noch anderweitig gesteuert wird.

Es gibt natürlich noch ein weiteres Aber, das ist die Eingrenzung auf die Zeit. Das Problem dabei sind die Grenzfälle beim Abschalten des Lüfters, denn wenn jemand um 18:58 dusche einschaltet und nach 19:00 Uhr ausschaltet, wird wiederum der Ausschalttimer nicht gestartet.

Re: Regel Timer im Timer

Verfasst: 5. Mai 2021 13:35
von retai
Hallo Udo,

danke für den Hinweis und die fertige neue Regel, vlt. schickst du mir mal deine Paypal Daten damit ich dir einen Kaffee ausgeben kann.

Habe nun deine Regel verwendet und für mich adaptiert. Bei mir hat die Lüftung nur ON/OFF Zustände und es wir immer nur eine Lüftungsstufe eingeschalten (funktioniert wie ein Trigger). Und wenn man zweimal die gleiche Lüftungsstufe aktiviert, schalte die Lüftung komplett aus, daher ist die Abfrage != ON in meinem Fall noch besser, da sich die Lüftung nicht versehentlich ausschalten kann. Auch das nachlaufen nach ausschalten für 15min gefällt mir deutlich besser als die fixen 15Minuten.
Durch den Status des Items konnte ich mir die Gruppe/Number Item und die zweite Rule sparen.

Zur Vollständigkeit nochmal die fertige Rule:

Code: Alles auswählen

var Timer tOnTime = null
rule "Lueftung Dusche 15min"
when
    Item dusche changed
then
    if(lueftungsautomatik.state == ON) {
        tOnTime?.cancel
        if(dusche.state == ON) {
            if(lueftung3.state != ON)
                tOnTime = createTimer(now.plusMinutes(1), [|
                    lueftung3.sendCommand(ON)
			Wohnbereich_Sprich.sendCommand('Es wird geduscht, Lueftung Stufe 3 fuer 15 Minuten')
                ])
        } else {
            if(lueftung1.state != ON)
                tOnTime = createTimer(now.plusMinutes(15), [|
                    lueftung1.sendCommand(ON)
                ])
        }
    }
end

Re: Regel Timer im Timer

Verfasst: 5. Mai 2021 16:18
von udo1toni
Ja, das war auch schon in meiner Schublade ;) es ist halt immer die Frage, wie die Hardware hinten dran tickt. Springen denn die Kanäle selbst auf OFF, wenn eine andere Stufe gewählt wird? Das war halt nicht ganz klar.