Seite 1 von 1

Rule Garage, Timer, Abbruch des Timers

Verfasst: 13. Jul 2022 19:22
von Ruedixy
Hallo, bastle schon seit Tagen an einer wahrscheinlich einfachen Rule, aber ich muss zugeben mit dem Programmieren ist das so eine Sache bei mir...

Das Garagentor wird mit dem Harmony-Binding gesteuert und der Status des Garagentores erfolgt über ein Fibaro-DoorSensor.
Funktioniert. Ich habe mit einer einfachen Regel angefangen, wenn das Garagentor offen ist soll es nach 5 Minuten automatisch schließen, funktionierte auch. Betätige ich aber den original Garagentorsender innerhalb der 5 Minuten und das Tor schließt sich, geht es nach der gestarteten Zeit wieder auf (das Tor bekommt für OPEN und CLOSE nur einen Befehl: L028).
Mein Versuch:

Code: Alles auswählen

var Timer tGarageRUDI = null 

rule "Garage RÜDI 5 min"
when
    Item SENSORGarageRUDI received update OPEN
then
    if(SENSORGarageRUDI.state == OPEN) 
       tGarageRUDI?.cancel
    createTimer(now.plusMinutes(5), [|              
		Garage_RUDI.sendCommand("L028")  
        ])
else {
    if (SENSORGarageRUDI.state == CLOSED ){
                  tGarageRUDI?.cancel
                  tGarageRUDI = null
      }
    }
end
1. Ich bekomme die Fehlermeldung "mismatched input 'else' expecting 'end' ", bestimmt irgendwelche Klammern falsch.
2. Würde die Regel funktionieren (sofern Punkt 1 behoben), d.h. der Timer würde durch das manuelle Schließen des Tores gestoppt?

Habe versucht div. Codes aus diesem und engl. Forum anzupassen, schaffe es leider nicht. Kann mir jemand helfen?

Re: Rule Garage, Timer, Abbruch des Timers

Verfasst: 13. Jul 2022 19:58
von udo1toni
Du bist nah dran :)

Der entscheidende Punkt ist aber, wenn Du einen Timer steuern möchtest, brauchst Du einen gültigen Handle auf diesen Timer, bzw. einen Zeiger.
Diesen Zeiger liefert der Aufruf der Funktion createTimer(), und diesen Zeiger musst Du dann in einer passenden Variablen speichern. Du hast die Variable zwar definiert (und auch ganz richtig global, das ist in diesem Fall essenziell), aber Du weist der Variablen niemals den Zeiger zu...

Und dann triggert die Rule natürlich nur, wenn OPEN gemeldet wird. Du reagierst aber in der Rule auch auf den Fall, dass CLOSED gemeldet wird, entsprechend muss der Trigger angepasst werden. Aufgehübscht und verschlankt:

Code: Alles auswählen

var Timer tGarageRUDI = null 

rule "Garage RÜDI 5 min"
when
    Item SENSORGarageRUDI changed                         // Zustand hat sich geändert
then
    tGarageRUDI?.cancel                                   // Timer auf jeden Fall abbrechen
    if(SENSORGarageRUDI.state == OPEN)                    // Falls Zustand offen
        tGarageRUDI = createTimer(now.plusMinutes(5), [|  // Timer erzeugen und zeiger in Variable retten
            Garage_RUDI.sendCommand("L028")               // Bei Ablauf Steuerbefehl senden
        ])
end
Der Timer muss so oder so abgebrochen werden, um sicherzustellen, dass es keine marodierenden Timer gibt, also auch, wenn man den Timer neu anlegen will.
Nur, falls das Tor geöffnet wurde, muss der Timer angelegt und gestartet werden.
Und der wichtigste Punkt: Der Rückgabewert der Funktion createTimer() muss in die globale Variable tGarageRUDI gespeichert werden, damit der Timer überhaupt kontrolliert werden kann.

Mehr braucht es nicht. :)

Re: Rule Garage, Timer, Abbruch des Timers

Verfasst: 13. Jul 2022 21:01
von Ruedixy
Mehr braucht es nicht... :lol: udo1toni, Du bist ganz großes KINO! Vielen DANK! Es sieht so simpel aus und ist es auch letztlich, aber ich habe mir die Zähne ausgebissen. Genial, ohne Dich hätten Anfänger wie ich mit openHAB keine Chance, für Deinen Einsatz ein großes Lob und Dank!