Rule mit Timer vereinfachen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

Rule mit Timer vereinfachen

Beitrag 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?
Servus

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Rule mit Timer vereinfachen

Beitrag 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...)
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: Rule mit Timer vereinfachen

Beitrag 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.
Servus

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Rule mit Timer vereinfachen

Beitrag 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.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: Rule mit Timer vereinfachen

Beitrag 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.
Servus

Antworten