Seite 1 von 1

Schalter nach bestimmter Zeit und Voraussetzung schalten

Verfasst: 16. Aug 2020 10:51
von finn
Hallo,
ich brauche mal eure Hilfe, ich komme mit einer Rule nicht weiter.
Und zwar geht es darum, die Garage zu schließen, wenn Sie mehr als 10 minuten geöffnet ist.
Ob die Garage offen oder geschlossen ist, zeigt mir ein Shelly Door window Sensor an, das item ist schon eingerichtet und funktioniert.
An den Garagenmotor soll nun ein Shelly 1, der als Taster konfiguriert, diesen betätigen soll, wenn die Garage länger als 10 Minuten offen ist.
Wie kann ich diese Voraussetzungen in die Rule schreiben?
Die Rule sollte also folgendermaßen aussehen:

Wenn:
-Garage offen, dann -> 10 Minuten Timer starten
-wenn 10 minuten Timer abgelaufen ist, dann -> Shelly xxxxxx on

Vielen Dank schonmal im Voraus,
Mfg Finn

Re: Schalter nach bestimmter Zeit und Voraussetzung schalten

Verfasst: 16. Aug 2020 10:53
von Pepe1907
Nutz doch ganz einfach das expire binding dafür.

https://www.openhab.org/addons/bindings/expire1/

Gesendet von meinem SM-G981B mit Tapatalk


Re: Schalter nach bestimmter Zeit und Voraussetzung schalten

Verfasst: 16. Aug 2020 12:49
von udo1toni
Oder schreibe eine einfache Rule dafür. Das Expire Binding gibt es (noch) nur als OH1-Version, womit es in openHAB3 nicht mehr zur Verfügung stehen wird. Außerdem ist die Zeit mit Expire fix. Mit einem Timer kann man die Zeit auf Wunsch problemlos über ein Number Item beeinflussen.

Nötige Items:
Contact Item oder Switch Item für obere Endlage des Tors, gleiches für untere Endlage des Tors. Notfalls kann auf einne der beiden Kontakte verzichtet werden. Eigentlich braucht man noch zwei weitere Items, welche über die Laufrichtung und Aktivität des Motors Auskunft geben.
Switch Items, über die der Motor getriggert werden kann. Am besten hat man gezielte Fahrtrichtungsitems (also eines für auf, eines für zu, eines für stoppen), aber meist wird es nur einen Tastereingang geben, der wechselweise auf-stop-zu-stop steuert.

Ich gehe hier von einem Item für die Offen Erkennung aus (Contact, TorOffen OPEN = offen) und einem Item zum Ansteuern des Motors (Switch, TorStartStop, ON löst Impuls aus - automatische Rückstellung auf OFF im Shelly)

Die Rule:

Code: Alles auswählen

var Timer tTor = null // globale Variablen zu Beginn der Datei definieren

rule "Tor Automatik"
when
    Item TorOffen changed
then
    tTor?.cancel
    if(TorOffen.state == OPEN)
        tTor = createTimer(now.plusMinutes(10),[|
            TorStartStop.sendCommand(ON)
        ])
end
Ja, das reicht!

Sobald sich der Zustand des Kontaks ändert, wird die Rule getriggert. Zunächst wird ein eventuell laufender Timer gecancelt.
Falls der Torkontakt OPEN meldet, wird ein neuer Timer angelegt, der nach 10 Minuten abläuft. Läuft der Timer ab, so wird der Motor gestartet.

Es gibt verschiedene Unsicherheiten, die jedoch nicht ohne zusätzliche Hardware lösbar sind (sichere Erkennung der Laufrichtung und beider Endlagen). Beispielsweise könnte das Tor zwischen beiden Endlagen positioniert sein - z.B. zum Lüften. Aber in welche Richtung fährt das Tor beim Startbefehl?

Re: Schalter nach bestimmter Zeit und Voraussetzung schalten

Verfasst: 16. Aug 2020 14:41
von finn
Hi, vielen Dank für deine ausführliche Antwort und die Rule,
es handelt sich bei dem Antrieb um einen ziemlich alten Garagentorantrieb, der einfach per Taster betätigt wird und dann stoppt, wenn die Garage ganz auf bzw. zu ist. Betätigt man den Taster während die Garage auf oder zu geht, hält das Tor einfach an.
Der Sensor befindet sich in der Endlage, in der das Tor geschlossen ist.

So funktioniert es jetzt perfekt, vielen Dank

Re: Schalter nach bestimmter Zeit und Voraussetzung schalten

Verfasst: 19. Aug 2020 18:20
von finn
Hi,
ich bräuchte nochmal eure Hilfe.
Habe das ganze jetzt so gestaltet, dass Alexa einen Hinweis gibt, wenn die Garage zu lange geöffnet ist.
Unbenannt.PNG
Das funktioniert auch wunderbar und super zuverlässig.
Allerdings gibt es ein kleines Problem, mit dem ich nicht weiterkomme.
Und zwar soll der Hinweis ja nur kommen wenn die Garage nachdem der Timer abgelaufen ist, immer noch offen ist.
Im Moment ist es so, dass Alexa den Hinweis auch gibt, wenn die Garage nur kurz offen war, aber inzwischen schon wieder zu ist.
In Zeile 10 habe ich deswegen nochmal die Bedingung (OPEN) hinzugefügt, allerdings hat dies nicht funktioniert.
Vielen Dank schonmal

Re: Schalter nach bestimmter Zeit und Voraussetzung schalten

Verfasst: 19. Aug 2020 18:29
von peter-pan
...kann es sein, dass da noch ein paar geschweifte Klammern fehlen ? Nach der If-Bedingung { und vor ]) }

Re: Schalter nach bestimmter Zeit und Voraussetzung schalten

Verfasst: 19. Aug 2020 18:45
von finn
Also egal wie ich es versuche mit Klammern, Visual Studio Code zeigt mir immer Fehler an.
Also entweder es passt mit den Klammern oder ich stelle mich wirklich zu blöd an.
müsste mir Visual Studio Code nicht eigentlich anzeigen, wenn im aktuellen Code Klammern fehlen?

Re: Schalter nach bestimmter Zeit und Voraussetzung schalten

Verfasst: 19. Aug 2020 19:59
von udo1toni
Warum hast Du meine Rule nicht einfach übernommen und den Schaltbefehl durch die Alexa-Anweisungen ersetzt?
Deine Rule triggert genau, wenn das Tor öffnet.
Dann prüfst Du, ob der Kontakt offen ist (das ist der Trigger, warum also prüfen?)
Im Timer musst Du wieder prüfen, ob der Kontakt geöffnet ist, das tust Du auch, aber das if wirkt nur auf die nächste Anweisung, da Du den nachfolgenden Block nicht in {} gesetzt hast. Damit wird also die Lautstärkenanpassung nicht vorgenommen, alles andere wird aber ausgeführt.

Es ist aber viel einfacher, wenn Du Dir meine Rule noch mal anschaust:
Die Rule triggert immer, wenn sich der Kontaktzustand ändert, nicht nur, wenn das Tor öffnet.
Weiterhin wird immer der Timer beendet, falls er noch laufen sollte. Insbesondere, wenn das Tor schließt, ist das von Bedeutung, beim Öffnen stellt es aber auch sicher, dass nicht ein marodierender Timer im Hintergrund hängen bleibt.
Nur wenn das Tor öffnet (if... == OPEN) wird ein Timer erstellt, der nach Ablauf eine Aktion ausführt.

Die Rule erledigt also zwei Dinge, zum einen erstellt sie bei Bedarf den Timer, zum zweiten entfernt sie diesen aber auch wieder, noch bevor er abläuft. Dein Code sollte also besser so aussehen:

Code: Alles auswählen

var Timer tTor = null // globale Variablen zu Beginn der Datei definieren

rule "Tor Automatik"
when
    Item Garagensensor_Garagensensor_openclosed changed // Zustand des Tors hat sich geändert (auf offen oder zu)
then
    tTor?.cancel // immer laufenden Timer abbrechen
    if(Garagensensor_Garagensensor_openclosed.state == OPEN) // Falls Tor offen
        tTor = createTimer(now.plusMinutes(1),[| // erzeuge Timer
            AlexaWohnzimmer_LautstRke.sendCommand(100)
            AlexaWohnzimmer_Sprich.sendCommand("Mach die Garage zu")
            AlexaWohnzimmer_LautstRke.sendCommand(50)
        ])
end

Re: Schalter nach bestimmter Zeit und Voraussetzung schalten

Verfasst: 20. Aug 2020 09:33
von finn
Vielen Dank für die Antwort.
Jetzt habe ich auch verstanden was mein Fehler war.
Jetzt funktioniert es :D