FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Smart_Homer am 03 Januar 2024, 22:56:59

Titel: Mit 2 Timestamps im Reading rechnen
Beitrag von: Smart_Homer am 03 Januar 2024, 22:56:59
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ß.


Titel: Aw: Mit 2 Timestamps im Reading rechnen
Beitrag von: frober am 04 Januar 2024, 05:48:58
Das sollte helfen:

https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit (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.
Titel: Aw: Mit 2 Timestamps im Reading rechnen
Beitrag von: betateilchen am 04 Januar 2024, 09:39:59
Andersrum gefragt: wie kommen die Werte für Start und Stop in die readings?
Titel: Aw: Mit 2 Timestamps im Reading rechnen
Beitrag von: Smart_Homer am 05 Januar 2024, 19:36:31
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.
Titel: Aw: Mit 2 Timestamps im Reading rechnen
Beitrag von: betateilchen am 05 Januar 2024, 19:51:05
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.
Titel: Aw: Mit 2 Timestamps im Reading rechnen
Beitrag von: betateilchen am 05 Januar 2024, 20:13:35
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"))) ) }