FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Superposchi am 03 Dezember 2020, 09:52:40

Titel: Timestamp als DOIF-Trigger
Beitrag von: Superposchi am 03 Dezember 2020, 09:52:40
Hallo,

gibt es eine Möglichkeit den Timestamp eines Readings als Trigger in einem DOIF zu benutzen?
Titel: Antw:Timestamp als DOIF-Trigger
Beitrag von: Beta-User am 03 Dezember 2020, 11:27:15
Theoretisch sollte es möglich sein, den betreffenden Timestamp ebenfalls als (weiteren) Reading-Wert (unter einem zusätzlichen Readinging-Namen) bei der Aktualisierung des eigentlichen Readings als Event zu erzeugen.
Im Moment fehlt mir aber die Phantasie um mir ein sinnvolles Anwendungsszenarium für sowas auszudenken.

Vielleicht erklärst du, was du eigentlich tun willst, und wir schauen dann, wie man es umsetzen könnte?
Titel: Antw:Timestamp als DOIF-Trigger
Beitrag von: Superposchi am 03 Dezember 2020, 17:36:26
Ich möchte auf ein Ereignis Eine akustische Benachrichtigung ausgeben, dass zu verschiedenen Zeiten auftritt. Somit eigentlich kein Probem, denn ich könnte direkt auf das Event reagieren.
Das Problem ist, dass die Ausgabe in einem anderen Raum stattfinden soll und daher um 10-15 Minuten Zeitversetzt.
Ich könnte mit dem Befehl sleep eine gewisse Verzögerung erwirken, dass ist mir klar, aber ich fände es sinnhafter wenn ich eine echte Zeitangabe hätte mit der ich dann rechnen könnte.
Titel: Antw:Timestamp als DOIF-Trigger
Beitrag von: Beta-User am 03 Dezember 2020, 17:45:01
Verstehe es immer noch nicht. Wenn du dann später wissen willst, wie lange der Zustand schon so ist, kannst du doch ReadingsAge() verwenden? Und bei Eintritt des ursprünglichen Auslösers kennst du ja die Zeit.
Na ja, muss nicht alles verstehen. Vielleicht wäre es einfacher zu verstehen, was du willst, wenn die geplante Berechnung wenigstens der Spur nach aufgezeigt wäre.
Titel: Antw:Timestamp als DOIF-Trigger
Beitrag von: Superposchi am 03 Dezember 2020, 18:04:32
Zitatwenn die geplante Berechnung wenigstens der Spur nach aufgezeigt wäre
Verstehe nicht was du meinst.

Ich rate mal, du willst eine genauere Erklärung des Ablaufs.
Wenn ich aufstehe möchte ich mir als Beispiel gerne das Wetter oder bevorstehende Termine ansagen lassen. Da ich aber nach dem Aufstehen erst mal ins Bad gehe und entsprechend einige Minuten für die Morgentoilette vergehen und ich dann noch weiter ins Wohnzimmer gehen muss, soll die akustische Ausgabe nicht sofort sondern eben nach einer im Moment noch nicht bekannten Verzögerung stattfinden.
Muss also erst mal ausprobieren wieviel Zeit zwischen aufstehen, Morgentoilette und Betreten des Wohnzimmers (wo die Ausgabe ja stattfinden soll) in der Regel vergeht.
Ich muss also nicht wissen wie lange ein Ereignis her ist oder wie lange ein Reading einen bestimmten Wert hat, sondern vom Eintreten eines Events aus eine gewisse Zeit verstreichen lassen und dann erst reagieren. Sagte ja, "Sleep" würde sich anbieten, doch da habe ich nachträglich keine Kontrolle darüber wann die Reaktion dann zeitverzögert ausgelöst wurde bzw. müsste immer händisch vom herausgesuchten Event manuel rechnen..
Darum wäre es mir lieber mit "echten Zeiten" basierend auf dem Timestamp rechnen zu können und somit quasi einen zeitversetzten Trigger zu generieren, der im bestenfall einen eigenen Timestamp hat.
Titel: Antw:Timestamp als DOIF-Trigger
Beitrag von: Beta-User am 03 Dezember 2020, 18:18:08
Dein Beispiel wird nicht klappen, manchmal geht Rasieren schnell, manchmal nicht... Ergo brauchst du einen anderen Trigger (Tür auf zum Wohnzimmer, dann 10 Sek. später, z.B.).
Oder du setzt halt hart irgendeine Zeit (ab wann? Licht an im Bad?), die "irgendwie" paßt, aber da mußt du auch nicht rechnen...

Nochmal: Schreib die "Rechnung" auf. Welche Zahl soll wie berücksichtigt bzw. wann geändert werden.

Und wenn du den Timestamp wirklich wissen willst: was ist mit ReadingsTimestamp()?
Titel: Antw:Timestamp als DOIF-Trigger
Beitrag von: xenos1984 am 03 Dezember 2020, 18:25:22
Die Beschreibung erinnert mich an diesen Beitrag:

http://forum.fhem.de/index.php/topic,116377.0.html

Kurz gesagt: at kann auf einen in einer Perl-Funktion erzeugten Timestamp reagieren. Man kann also in der Perl-Funktion einen Timestamp berechnen und zu diesem Zeitpunkt eine Aktion ausführen.

So wie ich die Aufgabenstellung hier verstehe, soll statt eines at ein DOIF zum berechneten Zeitpunkt triggern, aber ansonsten ist die Fragestellung wohl ähnlich.

Wäre das nicht genau dieser Anwendungsfall?

http://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung

Oder einfach eine Verzögerung mit "wait":

http://fhem.de/commandref_DE.html#DOIF_wait
Titel: Antw:Timestamp als DOIF-Trigger
Beitrag von: Superposchi am 03 Dezember 2020, 21:54:22
Zitathttp://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung
Im Prinzip schon, nur das der Ausgangswert (in dem Beispiel halt Sunset) der Timestamp eines bestimmten Readings wäre und genau um den Timestampt auszulesen habe ich bisher nichts gefunden.
Mit den Perl-Funktionen kenne ich mich noch nicht gut genug aus, muss mich da mal am Wochenende in Ruhe einlesen, wobei ich bisher bewusst versucht habe die Perl-Form bei meinen DOIF''s zu vermeiden.

Das Wait würde sicher klappen, doch habe ich dann keinen Timestamp für die eigentliche Ausführung und das ist ja mein Ziel wenn es irgendwie möglich ist.

Den ersten Link muss ich mir noch ansehen.

Leider habe ich nichts um ein Event beim Betreten eines Raumes auszulösen, da fehlt es noch an der nötigen Hardware und Umsetzung, weshalb es augenblicklich auch so kompliziert ist. Bekomme das Sch**? XIAOMI-Gateway und den Bewegungsmelder nichts ans Laufen. sonst wäre eh alles viel einfacher.
Titel: Antw:Timestamp als DOIF-Trigger
Beitrag von: Damian am 03 Dezember 2020, 22:29:29
Ich weiß nicht warum du auf dem Timestamp beharrst. Mit dem zu rechnen ist besonders kompliziert.

Wenn ein Trigger kommt, dann gehst du einfach vom Zeitpunkt Null aus. Alles, was danach passiert, kannst du besonders einfach in Sekunden als Verzögerung berechnen, auch wenn es einen ganzen Tag dauern soll.

Auch ist mir nicht klar, welche Aktionen deine Berechnung der Verzögerung auslösen sollen und vor allem: Wann soll die Berechnung der Verzögerung stattfinden?
Titel: Antw:Timestamp als DOIF-Trigger
Beitrag von: Superposchi am 04 Dezember 2020, 10:59:11
Ich beharre nicht darauf, ich würde einfach gerne dokumentieren wann die Benachrichtigung durchgeführt wurde - und das geht doch nur über den Timestamp, oder?
Es spielt doch gar keine Rolle welches Event die Berechnung auslösen soll, lediglich dass sie beim eintreten des Events auf Basis des Timestamps eine berechnete Zeit ausspuckt:
Meine Vorstellung ist so:
Event wird ausgelöst; der Timestamp des ausgelösten Events wird um x Minuten addiert; der so berechnete Zeitwert wird beispielsweise in einem DOIF oder Notify als Trigger für die Benachrichtigung genutzt.
Die Benachrichtigung soll also nicht vom ursprünglichen Event ausgelöst werden, sondern von einem eigenständigen Event.


Alternativ ginge es  - und das wäre sicher besser - wenn das zweite Event raumbezogen ausgelöst wird. Doch dazu stellt sich die Offtopic-Frage wie andere User eine Raumüberwachung realisiert haben.
Titel: Antw:Timestamp als DOIF-Trigger
Beitrag von: Damian am 04 Dezember 2020, 13:04:19
Zitat von: Superposchi am 04 Dezember 2020, 10:59:11
Ich beharre nicht darauf, ich würde einfach gerne dokumentieren wann die Benachrichtigung durchgeführt wurde - und das geht doch nur über den Timestamp, oder?
Es spielt doch gar keine Rolle welches Event die Berechnung auslösen soll, lediglich dass sie beim eintreten des Events auf Basis des Timestamps eine berechnete Zeit ausspuckt:
Meine Vorstellung ist so:
Event wird ausgelöst; der Timestamp des ausgelösten Events wird um x Minuten addiert; der so berechnete Zeitwert wird beispielsweise in einem DOIF oder Notify als Trigger für die Benachrichtigung genutzt.
Die Benachrichtigung soll also nicht vom ursprünglichen Event ausgelöst werden, sondern von einem eigenständigen Event.


Alternativ ginge es  - und das wäre sicher besser - wenn das zweite Event raumbezogen ausgelöst wird. Doch dazu stellt sich die Offtopic-Frage wie andere User eine Raumüberwachung realisiert haben.

Timestamp des Auslösers geht ganz einfach:

DOIF {[dein Event]; set_Reading("event_Timestamp",time())}

im Reading event_Timestamp des DOIF-Devices steht der Timestamp (interne Darstellung in Sekunden) des Events