Zeitmessung zwischen Item Zustand ON - OFF

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udi »

Hallo in die Runde,

ich habe, wie fast jeder, ein Problem mit der Zeit :P Im Grunde eine einfache Fragestellung. Ich habe einen Shelly x3. Dieser meldet mir den Zustand des angeschlossenen Gerätes in einen Switch mit ON/OFF. Nun muss ich wissen, wie lange genau der Zustand ON bestehen bleibt. Bei 12-14 Sekunden soll ein anderes Item angestoßen werden.

Ich grübel und suche schon eine ganze Weile nach einer Lösung. Bisher ohne Erfolgt. Klar, sonst würde ich hier nicht schreiben. Nach Counter etc habe ich gegooglet. Das sacheint es aber für OH gar nicht zu geben. Also geht es wohl eher nur mit einem bzw. zwei Countdowns oder eventuell mit Timestamps von den Ereignissen.

Bei mir läuft ein aktuelles OH3.4 und ich arbeite mit VS Code.

Für eure Hilfe und Gedanken wäre ich sehr dankbar.

Viele Grüße und euch ein schönes Wochenende,
udi

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

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udo1toni »

Du kannst dieses Problem auf verschiedene Weisen lösen. Zum Beispiel, gegeben ein Switch Item mySwitch:

Code: Alles auswählen

// Globale Variablen müssen zu Beginn der Datei definiert werden!
var Timer tMySwitch = null // Timer Variable

rule "mySwitch ON-Zeit"
when
    Item mySwitch changed
then
    tMySwitch?.cancel
    if(newState == ON)
        tMySwitch = createTimer(now.plusSeconds(12),[|
            my2ndSwitch.sendCommand(ON)
            tMySwitch = null 
        ])
end
Die Rule wird jedes Mal ausgelöst, wenn sich der Zustand des Items mySwitch ändert.
Als erstes wird, falls die Variable tMySwitch ungleich null ist, der Timer, auf den sich die Variable bezieht gestoppt. Das ? bewirkt, dass der Befehl nur gesendet wird, wenn die Variable tatsächlich einen gültigen Zeiger enthält.
Anschließend wird geprüft, ob der aktuelle Status ON ist. Ist das der Fall, so wird ein Timer angelegt und der Zeiger auf diesen Timer in der Variablen tMySwitch gespeichert.
Anschließend ist die Rule fertig.

Läuft der Timer (nach zwölf Sekunden) ab, so wird der hinterlegte Code ausgeführt, welcher den Befehl ON an das Item my2ndSwitch sendet. Anschließend wird die Variable noch auf null gesetzt (dieser Schritt ist nicht unbedingt erforderlich).

Diese Rule ist in der openHAB DSL programmiert. Sie muss zwingend über eine .rules Datei angelegt werden. Diese Dateien werden im Verzeichnis /etc/openhab/rules/ gespeichert und tragen die Endung .rules.

Die Rule kann in anderer Form auch über die UI angelegt werden, allerdings gibt es in der UI-Version keine globalen Variablen, was es etwas komplizierter macht, einen Timer einzusetzen. Eine einfache Alternative wäre dann eine Rule, welche den Zustand zum Update eines anderen Items verwendet, das dann wiederum über die Funktion expiration Timer verwendet wird, um eine zweite Rule zu starten (die dann das Item my2ndSwitch schalten würde). Ist etwas umständlich... Grundsätzlich: Du brauchst drei Items (mySwitch, my2ndSwitch und z.B. myExpireSwitch).
Die erste Rule triggert auf mySwitch changed und setzt myExpireSwitch per postUpdate(!) auf den gleichen Status wie mySwitch.
myExpireSwitch bekommt als Expiration Time zwölf Sekunden und als Befehl sendCommand OFF hinterlegt. Das Item wird also, so es auf den Status ON gebracht wird, nach zwölf Sekunden den Befehl OFF senden und den eigenen Status aufgrund von autoUpdate auf OFF ändern.

Die zweite Rule triggert auf myExpireSwitch received command OFF und schaltet my2ndSwitch per sendCommand auf ON. Wenn also das Expire Item abläuft, wird die Rule ausgelöst. Wird hingegen der Status des Expire Items vor Ablauf der zwölf Sekunden auf OFF geändert (weil mySwitch auf OFF gewechselt hat), so wird der Befehl nicht ausgelöst, die zweite Rule wird nicht gestartet.
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 Udo,

war ja klar, dass du der Erste bist, der antwortet. Das natürlich ausschließlich im positiven Sinne! :D

Ich habe mir deinen Ansatz mal vorgenommen und war auch schon dabei ihn umzusetzen. Nun fiel mir aber auf, dass es wohl ein Problem dabei gibt. Korrigiere mich gerne, wenn ich mich irren sollte.

Was genau meinst du mit Zeiger? Ich weiß den Begriff in diesem Zusammenhang nicht einzuordnen.

...falls die Variable tMySwitch ungleich null ist... -> die Variable wird doch zu Beginn auf Null gesetzt. Warum dann diese Prüfung? Und wenn sie Null ist, wird die Regel gestoppt. Da bin ich leider völlig abgehängt. Heiß doch, dass die Regel nie ausgeführt wird.

Außerdem läuft der Timer stur ab. Richtig? Ich muss aber wissen, ob nach 12 Sekunden (eher 12-14 Sekunden, siehe mein erster Post) am Eingang des Shelly x3 das Gerät noch aktiv ist. Es gibt ein Szenarian in denen der Eingang kürzer als 12 Sekunden auf ON steht und Szenarien, in den der Eingang länger als 14 Sekunden auf ON steht. Ich muss die 12-14 Sekunden rausfiltern können.

Viele Grüße und einen schönen Sonntag!

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

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udo1toni »

Das ist ein gern genommener Punkt für Verwirrung.

Zeiger: Wenn man einen Timer anlegt, so wird ein Job im openHAB Scheduler eingetragen. Um auf diesen Job zugreifen zu können (insbesondere, um diesen Job abzubrechen, bevor er ausgeführt wurde), braucht es eine Möglichkeit, gezielt darauf zuzugreifen. Das geschieht mit einem Zeiger. Die genaue Definition des Zeigers kann unterschiedlich sein, für einen Timer ist das Format des Zeigers vom Typ Timer und kann in einer globalen Variable gespeichert werden. Der Zeiger wird beim Aufruf von createTimer() als Rückgabewert übergeben, weshalb er dann in der Variablen landet.

null: ACHTUNG! null ist etwas anderes als NULL und noch etwas anderes als Null. Die Variable wird auf null gesetzt, nicht Null! Groß-Kleinschreibung ist zeichenweise zu beachten, im kompletten openHAB System (es gibt ein paar Stellen, wo es egal ist, tut aber nicht weh, sich einfach sklavisch daran zu halten, dann gibt es keine Probleme).

null ist per Definition kein Wert (das ist aber nicht möglich...). Stattdessen wird der Zeiger der Variablen, die null enthält, auf eine bestimmte Adresse im Speicher gesetzt. (da ist wieder der Zeiger... Variablen und auch Konstanten sind also ebenfalls Zeiger) Die Prüfung auf null prüft also, ob der Zeiger auf diese Adresse zeigt, nicht, ob der an der Adresse befindliche Wert dem von null entspricht.
NULL ist ein Status eines Items (das hat also erst mal nichts mit Variablen zu tun). Jedes Item hat beim Systemstart den Status NULL, bis der Status durch ein Update geändert wird. Dieses Update kann durch ein restoreOnStartup ausgelöst werden, oder auch durch ein Binding, welches den Status aktiv vom verbundenen Gerät holt. Oder man sendet einen Befehl, wodurch openHAB automatisch den wahrscheinlichsten neuen Status setzt.

So viel zu den Begriffen...

Die Variable tMySwitch wird BEIM LADEN der Datei auf null gesetzt. Einmal. Wenn das System startet.
Alternativ auch jedes Mal, wenn Du die Datei bearbeitest und speicherst. openHAB erkennt, dass die Datei gespeichert wurde und lädt sie erneut, woraufhin der Zeiger mit null überschrieben wird. Das ist aber nicht vermeidbar. Die Variable wird ohnehin neu initialisiert, eben, weil die Datei neu geladen wurde.

Innerhalb der Rule passiert in der ersten Code-Zeile (tMySwitch?.cancel) der wichtigste Punkt: Ein eventuell laufender Timer wird abgebrochen. Dies soll unabhängig vom aktuellen Status immer passieren. Nun könnte es aber sein, dass die Variable tMySwitch keinen gültigen Zeiger enthält, sondern eben den Wert null. Da es keinen Eintrag im Scheduler unter dieser Adresse gibt, käme es zu einer nullPointerException, was mit dem ? abgefangen wird. Der Timer läuft also nicht stur ab, er läuft nur ab, sofern die Rule nicht zwischendrin aufgerufen wird.

Die Rule wird bei jeder Statusänderung des Items gestartet, und jedes Mal wird der Timer gestoppt. Zur Erinnerung: Änderung bedeutet Übergang von <ein Zustand> auf <ein anderer Zustand> also z.B. ON->OFF oder OFF->ON oder NULL->ON oder NULL->OFF (und es gäbe mindestens noch UNDEV als möglichen Status). Es gibt keine Änderung, wenn es nur ein Update gibt, also z.B. OFF->OFF oder ON->ON.

Nur wenn der aktuelle (also der neue) Status ON ist, wird der Timer erneut angelegt, mit einer Ausführungszeit zwölf Sekunden von "jetzt" an (now.plusSeconds(12)). Wird vor diesem Zeitpunkt wieder umgeschaltet, wird der Timer abgebrochen.

Wenn Du drei Fälle unterscheiden willst (kürzer als 12 Sekunden, länger als 14 Sekunden, zwischen 12 und 14 Sekunden) müsste die Rule leicht abgewandelt werden. Der Timer muss dann erneut ausgeführt werden und das System muss sich merken, ob es sich um den ersten oder den zweiten Durchlauf handelt. Ich hatte die 12-14 Sekunden so verstanden, dass Du eine Zeit hast, die etwa 12 bis 14 Sekunden lang wäre, nicht, dass es sich um zwei Grenzwerte handelt.
Die Rule erkennt also in der aktuellen Ausbaustufe, dass das Item exakt 12 Sekunden eingeschaltet IST. Ob es darüberhinaus noch weiter eingechaltet bleibt, wird nicht ausgewertet (aber wie gesagt, lässt sich leicht nachrüsten).
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 »

Praise the Lord Udo :mrgreen: Ich danke dir für deine Zeit!

Deine rule habe ich auf mein System angepasst und mit meine items befüllt. Das funktioniert auch. Wenngleich ich nicht so recht verstehe wie. Ich muss mir deine Nachricht mit Sicherheit noch 2-14 Mal durchlesen und Punkt für Punkt gedanklich nachvollziehen. Dafür ist es heute vielleicht etwas spät.

Wenn der Shelly x3 nun 12 Sekunden oder auch länger (!) ein Signal anliegen hat, wird ein Kommando ON an einen anderen Switch gesendet. So weit so gut. Wenn ich dich richtig verstehe, muss ich nun noch eine Art Schleife einbauen, um auch 13 Sekunden und 14 Sekunden abzuprüfen. Geht das einfach indem ich noch 2x then ... if ... einfüge nur mit 13 und 14 Sekunden? Getestet -> geht nicht. Nun habe ich daraus 3 einzelne Regeln angelegt. Da hatte ich auf einmal einen Gedankenblitz. Ich muss doch nur bei 12 Sekunden das ON senden. Der Switch bleibt dann ohnehin auf ON und wird erst nach 15 Sekunden über Expire zurückgesetzt (siehe nächster Abschnitt). Right?

Und zu guter letzt müsste den Switch, welcher den Command ON bekommt, nach 15 Sekunden wieder auf OFF gestellt werden. Das würde ich einfach über Expire in dem Item festlegen. Also expire="15s,command=OFF". Liege ich da wenigstens mal richtig? :lol: Kleiner Einwurf: gerade getestet. Funktioniert nicht. Aber warum? :?: 2. Einwurf: Scheibfehler, hatte ein Klammer zu viel. Aber 15 Sekunden ist falsch. Eignetlich wäre ein dynamischer Wert notwendig. Exppire läuft natürlich erst nach 12, oder 13 oder 14 Sekunden los. Das heißt in Summe dann 27-29 Sekunden. Das ist zu lange. Denn dann könnte in den weiteren Regeln zu Fehlschlüssen führen. Ich verwende erstmal 3 Sekunden. Und schaue, ob alles damit läuft.

Viele Grüße!
Udi

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

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udo1toni »

Also, der Einfachheit halber, beschreibe bitte genau, was wann passieren soll.
S1: der Shelly, welcher überwacht wird
S2: der andere Schaltkanal
Fall 1: S1 kürzer 12 Sekunden aktiv
Fall 2: S1 länger 12 Sekunden aktiv
Fall 2: S1 länger 14 Sekunden aktiv

Code: Alles auswählen

Fall        |     1    |     2    |     3
Zeitachse   |  S1   S2 |  S1   S2 |  S1   S2 
 0 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 1 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 2 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 3 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 4 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 5 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 6 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 7 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 8 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 9 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
10 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
11 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
12 Sekunden | OFF  OFF |  ON   ON |  ON   ON 
13 Sekunden | OFF  OFF |  ON   ON |  ON   ON 
14 Sekunden | OFF  OFF | OFF   ?? |  ON   ON 
15 Sekunden | OFF  OFF | OFF   ?? |  ON   ?? 
16 Sekunden | OFF  OFF | OFF   ?? |  ON   ?? 
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 »

Ja, sehr gute Idee.
udo1toni hat geschrieben: 27. Sep 2022 06:40 Also, der Einfachheit halber, beschreibe bitte genau, was wann passieren soll.
S1: der Shelly, welcher überwacht wird
S2: der andere Schaltkanal
Fall 1: S1 kürzer 12 Sekunden aktiv
Fall 2: S1 länger 12 Sekunden aktiv
Fall 2: S1 länger 14 Sekunden aktiv

Code: Alles auswählen

Fall               |     1     |     2      |     3
Zeitachse     |  S1   S2 |  S1   S2 |  S1   S2 
 0 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 1 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 2 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 3 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 4 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 5 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 6 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 7 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 8 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
 9 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
10 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
11 Sekunden |  ON  OFF |  ON  OFF |  ON  OFF 
12 Sekunden |  ON  ON |  ON   ON |  ON   ON 
13 Sekunden | OFF  ON |  ON   ON |  ON   ON 
14 Sekunden | OFF  ON | OFF   ON |  ON   ON 
15 Sekunden | OFF  ON | OFF   ON |  OFF  ON  
16 Sekunden | OFF  OFF | OFF   OFF |  OFF   OFF 
Achtung, bei 12 Sekunden ist S1 noch auf ON! Das habe ich geändert. Und ab 15 Sekunden geht S1 im Fall 3 wieder auf OFF.

Der S2 sollte in allen 3 Fällen bis zur 15. Sekunde ON sein. Und dann ab 16 Sekunden auf OFF gehen. Falls das zu kompoliziert ist, wäre ein Expire mit 2-3 Sekunden für mich denkbar. Daran müssten wir uns nicht die Zähen zerbeißen :D

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

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udi »

Für mich sieht das ganz danach aus, dass ich mit meinem Blitz richtig liege Mit 12 Sekunden geht das ON an S2 und kann nach 3 Sekunden mit Expire einfach wieder auf OFF gehen. Und fertig ist die Laube.

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

Re: Zeitmessung zwischen Item Zustand ON - OFF

Beitrag von udo1toni »

Nein, die drei Fälle sind: S1 kürzer als zwölf Sekunden ON, S1 länger als zwölf Sekunden ON, aber kürzer als vierzehn Sekunden ON und S1 länger als vierzehn Sekunden ON,, so ist die Tabelle aufgebaut (Erklärung der drei Fälle steht auch drüber...)
Aber Deine Beschreibung reduziert das ganze auf zwei Fälle, es sich schlicht egal, wann S1 von ON auf OFF wechselt, (also abgesehen davon, wenn S1 weniger als zwölf Sekunden ON ist, dann passiert eben gar nichts).

Es gibt also keinen Unterschied, ob S1 nun zwölf oder fünfzehn oder fünfzig Sekunden ON ist, Du möchtest, dass S2 zwölf Sekunden nach S1 ON geht, sofern S1 zu dem Zeitpunkt immer noch ON ist. Danach soll S2 vier Sekunden ON sein, egal, was S1 macht.
Die Rule kann exakt so bleiben, wie sie bereits ist, nur musst Du noch S2 mit der Eigenschaft expire command OFF,4s versehen, damit das Item nach vier Sekunden ausgeht - Es sei denn natürlich, S2 soll auch unabhängig von S1 in anderer Form genutzt werden, dann müsste man das Problem anders lösen.
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 »

Dann hab ich hier wohl einen Fehler gemacht. S1 ist in allen 3 Fällen spätestens nach 14 Sekunden wieder OFF. Wenn S1 länger ON bleiben würde, funktioniert meine Anschlussverwendung nicht. In der Tabelle hatte ich es eigentlich auch so geschrieben. S1 ist nach 14 Sekunden immer OFF. Und S2 spätestens immer nach 16 Sekunden OFF. Gerade beim Schreiben wird mir bewußt, dass die Regel dann leider doch noch nicht ausreicht. Typischer Fall von zu früh gefreut :(

Etwas weiter ausgeholt: ich habe eine Torsteuerung für meine Einfahrt. Die Steuerelektronik funktioniert mit den mitgelieferten Handsendern, ist aber auch an OH angeschlossen. Die Steuerung liefert 2 Signale: 1 Kanal Öffnen/Schließen komplett. 1 Kanal Öffnen/Schließen halb. Halb ist für Fußgänger gedacht. Ich habe 2 Shelly 1 angeschlossen. Das läuft auch problemlos. Es gibt nur eine richtig bescheidene Situation. Wenn zu erst auf halb öffnen gedrückt wird und dann auf öffnen/schließen komplett, geht das Tor nicht wieder zu sondern weiter auf. Und da bleiben alle Regeln hängen.
Da ich auch weiterhin die Handsender parallel nutzen will/muss, habe ich lange nach einem Weg gesucht. Der war nun mein aktueller Weg: ein Shellyx3 nimmt das Signal der Warnleuchte (ist aktiv so lange Tor läuft) auf. Anhand der zeitlichen Unterschiede (halb Öffnen ca. 5 Sekunden, komplett Öffnen ca. 26 Sekunden, von halb zu komplett Öffnen 12-14 Sekunden). Und genau da stehe ich nun gerade.

Mit dem On auf S2, falls S1 12-14 Sekunden aktiv, will ich allen anderen rules ein Kriterium schaffen, um richtig zu aggieren und eben nicht über das Auf->Auf->Zu statt immer Auf->Zu zu stolpern.

Antworten