Mit 2 Timestamps im Reading rechnen

Begonnen von Smart_Homer, 03 Januar 2024, 22:56:59

Vorheriges Thema - Nächstes Thema

Smart_Homer

Hallo,

ich würde gern in verschiedene Devices per userreading einen Start und Ende Timestamp als Wert ins Reading schreiben, aber danach aus Ende-Start die Dauer rechnen.

Start2024-01-03 00:15:002024-01-03 22:41:37
Dauer???2024-01-03 22:41:37
Ende2024-01-03 03:15:002024-01-03 22:41:37

Ich schreibe also jeweils mit ReadingsTimestamp die Werte in die Userreadings Start und Ende und möchten danach die 3 Stunden als Dauer ausgewiesen haben.

Kann man die Readings wieder in Timestamps umwandeln und dann wieder mit time_str2num rechnen?

Danke im voraus.

Gruß.



frober

#1
Das sollte helfen:

https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit

Warum benutzt du nicht den Timestamp vom Reading selbst?
Als beim Start ein Reading x setzen und beim Stop. Jeweils die Timestamp als Sekunden auslesen und rechnen. Danach umwandeln....siehe Comref zu Perl.
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

betateilchen

Andersrum gefragt: wie kommen die Werte für Start und Stop in die readings?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Smart_Homer

#3
Danke für die Antworten.

Also die 2 Readings kommen als userreading ins Device. Leider aktualisiert das ELSE/: auch den Start-Timestamp, deswegen kann ich den nicht nehmen.
Die "LETZTER_Status" Abfrage ist drin, weil "2.SECTION" auch aktualisert wird, obwohl sich der Wert nicht geändert hat.

LETZTER_Start:2.SECTION.* { ReadingsVal("IP.Schalt_Mess_Steckdose_2","2.SECTION",0) == 2 && ReadingsVal("IP.Schalt_Mess_Steckdose_2","LETZTER_Status",0) == 2
? ReadingsTimestamp("IP.Schalt_Mess_Steckdose_2","2.SECTION",0)
: ReadingsVal("IP.Schalt_Mess_Steckdose_2","LETZTER_Start",0)},

LETZTES_Ende:2.SECTION.*  { ReadingsVal("IP.Schalt_Mess_Steckdose_2","2.SECTION",0) == 0 && ReadingsVal("IP.Schalt_Mess_Steckdose_2","LETZTER_Status",0) == -2
? ReadingsTimestamp("IP.Schalt_Mess_Steckdose_2","2.SECTION",0)
: ReadingsVal("IP.Schalt_Mess_Steckdose_2","LETZTES_Ende",0)},

 
Grüße.

betateilchen

#4
Wenn doch ohnehin beide userReadings auf das gleiche Event triggern (und damit gleichzeitig gesetzt werden), würde ich nur einen perl Block bauen und darin alle drei readings erzeugen.

Das muss man dann auch nicht zwingend per userReading machen, sondern man kann das auch in einem simplen notify machen, das auf IP.Schalt_Mess_Steckdose_2:2.SECTION triggert.

Es geht natürlich auch mittels eines fake userReadings, denn ein userReading ist nix anderes als eine Sonderform eines notify innerhalb eines bestehenden devices.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Um mal auf die Ausgangsfrage zurückzukommen:

Zitat von: Smart_Homer am 03 Januar 2024, 22:56:59Kann man die Readings wieder in Timestamps umwandeln und dann wieder mit time_str2num rechnen?

Kann man.

{ fhem( "setreading IP.Schalt_Mess_Steckdose_2 Dauer ". (time_str2num(ReadingsVal("IP.Schalt_Mess_Steckdose_2","Ende","0")) - time_str2num(ReadingsVal("IP.Schalt_Mess_Steckdose_2","Start","0"))) ) }
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!