Zeitmessung zwischen Item Zustand ON - OFF

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udo1toni »

Ich habe hier zwei Torantriebe mit jeweils zwei Torflügeln. Ich kann über zwei Eingänge jeweils beide Torflügel oder nur einen Torflügel öffnen ("Gehtor" Funktion). Einmal Drücken - Motor startet, Nochmal drücken, Motor stoppt, wieder drücken, Motor startet in Gegenrichtung usw.
In der Steuerelektronik habe ich (in Ermangelung anderer Möglichkeiten) jeweils Steuerrelais abgegriffen.
Die beiden Informationen über Laufrichtung und Motor an/aus, sowie die statischen Information über die maximale Laufzeit reichen aus, um den Öffnungswinkel der Torflügel zu berechnen.
Eventuell kannst Du bei Dir ja auch noch etwas nachrüsten, um eine hinreichende Information über den Öffnungswinkel zu erhalten.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

udi
Beiträge: 26
Registriert: 31. Okt 2020 10:45

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udi »

Sorry für die späte Rückmeldung! Zu viel Stress im Moment.

Hm, das wäre auch eine Möglichkeit. Dazu muss ich mal den Schaltplan der Platine genau studieren. Unabhängig davon habe ich die Tage noch etwas weiter in Gedanken gespielt. Es wäre ausreichend für mich, wenn ich nach 18 Sekunden prüfen kann, ob S2 auf ON ist. Ich bekomme es in meiner rule aber nicht auf die Reihe nach 18 Sekunden den Status abzufragen und daraufhin einen Commmand zu senden. Das ist meine rule:

rule "Tor"
when
Item Tor changed from OFF to ON
then
if(ZustandRiegelAuto.state == OFF) createTimer(now.plusSeconds(18), [|RiegelZUAUFPowerSwitch.sendCommand(ON)])
end

Nach createTimer müsste nochmal eine if Bedingung rein und anschließend nochmals ein Timer für den Versand des Befehls. Zusammengestückelt also so:

rule "Tor"
when
Item Tor changed from OFF to ON
then
if(ZustandRiegelAuto.state == OFF) createTimer(now.plusSeconds(18),
{if (TorOeffnungvonFusszuAuto.state == OFF) createTimer(now.plusSeconds(13), [|RiegelZUAUFPowerSwitch.sendCommand(ON)]}
end

Das funktioniiert so natürlich nicht, aber hilft hoffentlich zumindest bei der Vorstellung.

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

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udo1toni »

Tatsächlich könntest Du das so machen, aber es ist halt nicht schön. Abgesehen davon hast Du auch einen Denkfehler im Code.
Nehmen wir an, das Tor wird gestartet und sofort wieder angehalten. Der Timer läuft.
Nun wird das Tor wieder gestartet,kurz bevor der Timer abläuft. Ergebnis: Der Timer erkennt das Item als OFF und geht davon aus, dass das Tor die ganze Zeit in Bewegung war, was aber nicht der Fall ist.

Also noch mal, auch weil die Itemnamen halt nicht ganz klar sind...
Welche Funktion haben die Items?
Tor
ZustandRiegelAuto
TorOeffnungvonFusszuAuto
RiegelZUAUFPowerSwitch

Wann sind die Items ON, wann OFF?
Wie läuft die exakte Steuerung?

Ich gehe davon aus, dass Du (so wie auch bei mir) zwei Tasteranschlüsse hast, mit dem einen wird das Tor In der Folge AUF-STOP-ZU-STOP-AUF... bedient, um in die "Gehtorposition" zu fahren, mit dem anderen geschieht das gleiche, nur dass das Tor dann beim auffahren vollständig öffnet.
Und da Du über die Signalleuchte nur eine Rückmeldung darüber bekommst, dass das Tor fährt, aber nicht, in welche Richtung es fährt, musst Du dir merken, welches die letzte Fahrtrichtung ist.
Wenn Du nun zwischendurch von Geh-Position direkt auf vollständig öffnen wechselst, kommt Deine Zählung durcheinander?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

udi
Beiträge: 26
Registriert: 31. Okt 2020 10:45

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udi »

Ehrlich? Zumindest VS Code hat die rule so nicht angenommen. Vielleicht mit den Klammern noch irgendwas falsch?

Mein Tor hat glücklicherweise einen Unterschied. Ich kann einstellen, was es macht, wenn es im Lauf ist und erneute ausgelöst wird. Ich habe es so eingestellt, dass es nicht erst Stop sondern direkt in den Umkehrlauf geht. D.h. es gibt nur Aufgehen oder Zugehen.

Tor = der externe Kanal der Torsteuerung, hier hängt ein Shelly 1 dran. Über diesen betätige ich das Tor über OH
TorOennungvonFusszuAuto = Item, welches den Command von der hier im tread ursprünglichen diskutierten Regel erhält. Also wenn das Tor 12-14 Sekunden läuft, heißt das, dass es von halb offen zu offen geht
RiegelZUAUFPowerswitch = ich habe eine zusätzliche Verriegelung mittels Linearantrieb, bestückt mit 2 Shelly 1. Einen für ausfahren und einen für einfahren. RiegelZUAUF bedeutet, dass der Riegel nach dem Schließen des Tores eingefahren wird (die Schließzuge verriegelt im Tor). Das darf eben nur auslösen, wenn das Tor regulär zu geht. Bisher ist es so, dass wenn das Tor halb offen steht und dann auf ganz offen fährt, dieser Switch immer davon ausgeht, nach auf kommt zu und den Riegel ausfährt. Das ist der Punkt, wo sich die ganze Steuerung verschluckt. Ist Switch ist aber auch nicht wirklich relevant. Sagen wir der Einfachheit halber, dass ist ein Item, welche anzeigt, dass das Tor zufährt :)

Tor Item wird betätigt = ON (expire 1s)
Zustand des Riegels wird geprüft (OFF heißt er ist eingefahren = zurück = Tor kann aufgehen/ist offen)
TorOeffnungFusszuAuto = ist auf OFF (außer wenn 12-14 Sekunden Laufzeit des Tores, hier also nicht zutreffend)
RiegelAUFZUPOWERSWITCH = bekommt ON , damit der Riegel nach dem Schließen des Torws ausfährt

Ja, genau so ist es. Das Tor gibt an den vorhandenen Klemmen nicht aus, welche in welche Richtiung das Tor fährt. Nur über die Wanrleuchte kann ich unterschiedliche Vorlaufzeiten einstellen. Und das ist genau mein Ansatz. Für Aufgehen habe ich ein paar Sekunde mehr eingestellt. Dadruch kann ich die 12-14 Sekunden identifizieren.

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

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udo1toni »

udi hat geschrieben: 1. Okt 2022 23:03 Ehrlich? Zumindest VS Code hat die rule so nicht angenommen. Vielleicht mit den Klammern noch irgendwas falsch?
ja, Du hast ein paar Typos drin. Wäre besser, wenn Du Code auch als Code markieren würdest.
Und es ist immer hilfreich, wenn Code auch einigermaßen sinnvoll formatiert ist, dann fallen solche Typos eher auf.

Grundsätzlich: createTimer(dateTime,code) ist eine Funktion mit zwei Parametern. Der Code wird dabei als Lambda angegeben.
Ein Lambda wird mit eckigen Klammern [] eingeschlossen. So: createTimer(dateTime,[hier kommt der Code hin])
Da man gewöhnlich einem Lambda eine Laufvariable zuweisen kann, gehört noch ein senkrechter Strich vor den
Code: createTimer(dateTime,[| jetzt aber wirklich])
Deine zweite Rule sähe also korrekt so aus:

Code: Alles auswählen

rule "Tor"
when
    Item Tor changed from OFF to ON
then
    if(ZustandRiegelAuto.state == OFF)
        createTimer(now.plusSeconds(18), [|                // erster Timer, Start Lambda
            if(TorOeffnungvonFusszuAuto.state == OFF)
                createTimer(now.plusSeconds(13), [|        // zweiter Timer, Start Lambda
                    RiegelZUAUFPowerSwitch.sendCommand(ON)

                  ] // Ende Lambda des zweiten createTimer
                )   // öffnende Klammer vom zweiten Timer wird geschlossen

          ]         // Ende Lambda des ersten createTimer
        )           // öffnende Klammer vom ersten Timer wird geschlossen
end
Zeilenumbrüche und Leerflächen sowie Kommentare können auch entfallen.

Code: Alles auswählen

rule "Tor" when Item Tor changed from OFF to ON then if(ZustandRiegelAuto.state == OFF) createTimer(now.plusSeconds(18),[|if(TorOeffnungvonFusszuAuto.state == OFF) createTimer(now.plusSeconds(13),[|RiegelZUAUFPowerSwitch.sendCommand(ON)])])end
ist aber irgendwie nicht so gut lesbar...

Es fehlt mir immer noch ein Stück Information. Wenn Du nur einen Steuereingang hast, wie steuerst Du das Tor gezielt in Geh-Öffnung, komplett offen, komplett geschlossen? Ich habe ja zwei Eingänge, mit dem einen wird nur ein Flügel geöffnet, mit dem anderen beide Flügel. (geht auch nicht anders, weil der eine Flügel auf dem anderen Flügel aufliegt)

So eine zusätzliche Verriegelung des Tors habe ich auch (allerdings ist das direkt an der Torsteuerng angebunden, die weiß immer genau, in welcher Position sich das Tor befindet; außerdem ist das ein einfacher Elektromagnet, der Riegel funktioniert so wie der normale Riegel an einer gewöhnlichen Tür, also nicht der Sperrriegel, sondern die Falle. Fährt der Riegel gegen den Sperrblock, so wird der Riegel einfach mechanisch nach oben geschoben, falls er (im Fehlerfall) nicht eingezogen sein sollte. Ist das Tor geschlossen, so fällt der Riegel in das passende Loch und stabilisiert das Tor in der Mitte.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

udi
Beiträge: 26
Registriert: 31. Okt 2020 10:45

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udi »

udo1toni hat geschrieben: 2. Okt 2022 16:13
udi hat geschrieben: 1. Okt 2022 23:03 Ehrlich? Zumindest VS Code hat die rule so nicht angenommen. Vielleicht mit den Klammern noch irgendwas falsch?
ja, Du hast ein paar Typos drin. Wäre besser, wenn Du Code auch als Code markieren würdest.

Code: Alles auswählen

du hast recht. Mache ich das nächste mal :) 
Und es ist immer hilfreich, wenn Code auch einigermaßen sinnvoll formatiert ist, dann fallen solche Typos eher auf.

Grundsätzlich: createTimer(dateTime,code) ist eine Funktion mit zwei Parametern. Der Code wird dabei als Lambda angegeben.
Ein Lambda wird mit eckigen Klammern [] eingeschlossen. So: createTimer(dateTime,[hier kommt der Code hin])
Da man gewöhnlich einem Lambda eine Laufvariable zuweisen kann, gehört noch ein senkrechter Strich vor den
Code: createTimer(dateTime,[| jetzt aber wirklich])
Deine zweite Rule sähe also korrekt so aus:

Code: Alles auswählen

rule "Tor"
when
    Item Tor changed from OFF to ON
then
    if(ZustandRiegelAuto.state == OFF)
        createTimer(now.plusSeconds(18), [|                // erster Timer, Start Lambda
            if(TorOeffnungvonFusszuAuto.state == OFF)
                createTimer(now.plusSeconds(13), [|        // zweiter Timer, Start Lambda
                    RiegelZUAUFPowerSwitch.sendCommand(ON)

                  ] // Ende Lambda des zweiten createTimer
                )   // öffnende Klammer vom zweiten Timer wird geschlossen

          ]         // Ende Lambda des ersten createTimer
        )           // öffnende Klammer vom ersten Timer wird geschlossen
end
Zeilenumbrüche und Leerflächen sowie Kommentare können auch entfallen.

Code: Alles auswählen

rule "Tor" when Item Tor changed from OFF to ON then if(ZustandRiegelAuto.state == OFF) createTimer(now.plusSeconds(18),[|if(TorOeffnungvonFusszuAuto.state == OFF) createTimer(now.plusSeconds(13),[|RiegelZUAUFPowerSwitch.sendCommand(ON)])])end
ist aber irgendwie nicht so gut lesbar...

Auf jeden Fall. Mit Zeilenumbrüchen ist das vor allem für Einsteiger um Einiges einfach zu lesen und zu verstehen. Ich habe das auch so übernommen!
Deine Regel funktioniert natürlich!!! :P

Es fehlt mir immer noch ein Stück Information. Wenn Du nur einen Steuereingang hast, wie steuerst Du das Tor gezielt in Geh-Öffnung, komplett offen, komplett geschlossen? Ich habe ja zwei Eingänge, mit dem einen wird nur ein Flügel geöffnet, mit dem anderen beide Flügel. (geht auch nicht anders, weil der eine Flügel auf dem anderen Flügel aufliegt)

Du bist äußerst aufmerksam. Aber das ist nichts Neues... Die genannten Items sind nur ein Auszug aus der gesamten Umgebung der Torsteuerung. Ich habe alles nochmal dupliziert für den Kanal "Fussgänger" (=halboffen). Um die Fehlerquelle zu erzeugen muss ich in dieser Reihenfolge auslösen:
Knopf B (halboffen) -> Knopf A (komplett offen).

So eine zusätzliche Verriegelung des Tors habe ich auch (allerdings ist das direkt an der Torsteuerng angebunden, die weiß immer genau, in welcher Position sich das Tor befindet; außerdem ist das ein einfacher Elektromagnet, der Riegel funktioniert so wie der normale Riegel an einer gewöhnlichen Tür, also nicht der Sperrriegel, sondern die Falle. Fährt der Riegel gegen den Sperrblock, so wird der Riegel einfach mechanisch nach oben geschoben, falls er (im Fehlerfall) nicht eingezogen sein sollte. Ist das Tor geschlossen, so fällt der Riegel in das passende Loch und stabilisiert das Tor in der Mitte.
Die Möglichkeit habe ich auch. Ich habe allerdings mein Tor komplett selber gebaut. Das ist ein einflügliches Tor mit knapp 4 Metern Spannweite. Das gibt es nicht als Standard zu kaufen und Sonderanfertigung ist unbezahlbar. Da habe ich es mir kurzerhand selber designd und gebaut. Da ich keine extra Leitung von der Torsteuerung (auf der einen Seite der Einfahrt) zum Wandanschlag ziehen wollte, habe ich das etwas anders gelöst. Das Tor ist zusätzlich auch noch komplett geschlossen, hat also eine große Angriffsfläche für Wind. Daher habe ich einen massiven Stahlriegel mit Führung an
der Gebäudewand verankert. Das hält bombenfest. :)

Damit ich nicht immer dich belästigen muss, hättest du vielleicht einen Tipp, wo ich mich in die Programmierung von DSL rules tiefer einlesen kann? Also in die zugrundeliegende Sprache?

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

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udo1toni »

Die DSL ist in XTend realisiert, welches in Java programmiert wurde. Entsprechend ähnelt der Code stark normalem Java, aber es gibt Abweichungen.
Es gibt meines Wissens keine detaillierte Anleitung für die openHAB DSL, nur die offizielle Doku
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

udi
Beiträge: 26
Registriert: 31. Okt 2020 10:45

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udi »

Die Doku kenne ich schon. Für mein Empfinden gut für Basics. Aber für spezielle, weiterführende Anforderungen wären tiefgreifendere Beschreibungen hilfreich. Dann lesen wir uns hier bestimmt das eine oder andere Mal wieder :)

Danke nochmal für deine Hilfe und deine Zeit!!!

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

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udo1toni »

Immer gerne!
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

udi
Beiträge: 26
Registriert: 31. Okt 2020 10:45

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udi »

Hallo liebe Leute,

ich knüpfe hier gerne mal an. Das Thema bezieht sich nach wie vor auf die Torsteuerung. Ich möchte das Tor bei starkem Wind gerne automatisch schließen lassen. Die rule lege ich textbasiert an über VSC. Die Regel wird jede Minute durch einen Timer ausgelöst. Wenn die Windgeschwindkeit (wird über Openwaethermap geliefert) 19kmh/ überschreitet, wird der Toranstrieb ausgelöst. Leider funktioniert die Regel so nicht. Ich konnte es auf die
Geschwindigkeitseinheit eingrenzen (denke ich). OWM liefert die km/h als Number:Speed mit entsprechender Einheit. Dazu hatte ich recheriert und versucht das mit "|km/h" einzufangen. Aber ohne Erfolg.

Code: Alles auswählen

rule "Sturmschutz"                                                                          
when
    Time cron "0 0/1 * * * ? *"
then
    if(OneCallAPIweatherandforecast_Current_Windspeed.state >= 20|km/h)
        Torantrieb.sendCommand(ON)
end
Hat hier jemand Erfahrungen oder einen Tipp?

Vielen Dank!!!

Antworten