Seite 1 von 1
Rule mit Timer vereinfachen
Verfasst: 25. Jun 2021 07:52
von Quautiputzli
Hallo miteinander
ich habe eine Rule geschrieben, die meine Rolläden auf eine bestimmte Höhe fahren. Diese kann ich nicht auf Prozent fahren, darum steuere ich das über die Zeit. Die Rule sieht so aus:
Code: Alles auswählen
var tShutterCouch
rule "Shutter_Couch_set"
when
GF_LivingDining_Shutter_2_set received command ON
then
GF_LivingDining_Shutter_2.sendCommand(DOWN)
tShutterCouch?.cancel
tShutterWest = createTimer(now.plusSeconds(20), [
GF_LivingDining_Shutter_2.sendCommand(UP)
tShutterCouch = null
tShutterCouch = createTimer(now.plusSeconds(8), [
GF_LivingDining_Shutter_2.sendCommand(STOP)
tShutterCouch?.cancel
])
])
end
Diese Rule funtioniert einwandfrei, aber ich weiß nun nicht ob ich das so richtig gemacht habe mit dem zurücksetzen des Timers. Ist das so oft nötig, oder lässt sich das noch vereinfachen?
Re: Rule mit Timer vereinfachen
Verfasst: 25. Jun 2021 17:11
von udo1toni
Was ich nicht so ganz verstehe, warum fährst Du 20 Sekunden runter und anschließend 8 Sekunden hoch?
Ansonsten (wenn das z.B. notwendig ist, um Lamellen in eine andere Richtung zu fahren) sind ein paar Zeilen überflüssig und die eine oder andere Zeile solltest Du überarbeiten, insbesondere die allererste Zeile (var tShutterCouch) ist nicht gut, denn gerade die Timer Variablen sollten explizit definiert werden:
Code: Alles auswählen
var Timer tShutterCouch = null
rule "Shutter_Couch_set"
when
GF_LivingDining_Shutter_2_set received command ON
then
GF_LivingDining_Shutter_2.sendCommand(DOWN)
tShutterCouch?.cancel
tShutterCouch = createTimer(now.plusSeconds(20), [
if((GF_LivingDining_Shutter_2.state as Number) == 100) {
GF_LivingDining_Shutter_2.sendCommand(UP)
tShutterCouch.reschedule(now.plusSeconds(8))
} else {
GF_LivingDining_Shutter_2.sendCommand(STOP)
GF_LivingDining_Shutter_2.postUpdate(50)
}
])
end
Die Rule sieht etwas anders aus. Sie unterscheidet innerhalb des Timer-Codes, ob der Laden gerade abwärts oder aufwärts fährt. Unabhängig ob Dein Aktor das meldet, setzt openHAB nämlich den Status des Items selbsttändig auf 100 oder 0 wenn ein Fahrbefehl nahc untern bzw. oben kommt.
Das kann man auswerten und entsprechend unterschiedlich reagieren. So wird der Timer-Code nur einmal angelegt. Der Timer wird zweimal gestartet, das passiert aus dem Timer heraus per reschedule. Wenn der Rollladen gestoppt wird, setzt die Rule außerdem den Status auf 50 (das bietet sich ja irgendwie an...)
Re: Rule mit Timer vereinfachen
Verfasst: 27. Jun 2021 10:12
von Quautiputzli
Sehr elegant, Danke.
Hab ich ausprobiert bei 4 Rollläden. Einer davon hatte nicht gleich funktioniert, da war der Wert immer wieder bei "UNDEF". Nach ein paar mal auf und ab fahren ging es aber dann. Ich werde es nun eine Zeit lang testen, ob es Probleme macht.
Ich fahre erst 20 Sekunden ab, und dann hoch, damit der Rollladen eben immer auf die gleiche Position fährt, unabhängig davon wo er vorher stand.
Re: Rule mit Timer vereinfachen
Verfasst: 27. Jun 2021 13:27
von udo1toni
Wenn Du mehrere Rollläden hast, die alle auf die gleiche Weise angesteuert werden sollen, lohnt es sich eventuell, Gruppen zu definieren.
Die Idee: alle Items gleicher Art kommen in separate Gruppen (ginge aber auch mit einer gemeinsamen Gruppe für alle).
Die Rule triggert nun nur noch auf ein "Member of Group". Anschließend berechnet die Rule die benötigten Items und sendet die entsprechenden Befehle.
Da man für jeden Rollladen einen separaten Timer benötigt, müssen die Timer als Array angelegt werden. Eventuell braucht es auch noch ein Array mit rollladenspezifischen Informationen (wenn die Fahrzeiten sich unterscheiden).
Vorteil: man hat nur eine Rule. Wenn man Rollläden nachrüstet, werden die Items in die Gruppen gepackt und funktionieren sofort. Es spielt dann keine Rolle, ob Du einen oder hundert Rollläden steuerst, es reicht eine Rule.
Nachteil: Die Rule ist natürlich etwas komplexer.
Re: Rule mit Timer vereinfachen
Verfasst: 28. Jun 2021 07:05
von Quautiputzli
Es handelt sich nur um 4 Rollos (eigentlich 3, der 4te war nur zum Test). Da passt das schon so.
Wenn ich noch weitere nachrüste, baue ich shellys ein.