FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: bajogger am 28 September 2022, 17:33:39

Titel: Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: bajogger am 28 September 2022, 17:33:39
Ich suche jetzt seit Stunden und werde immer verwirrter

An einer Beispielaufgabe möchte ich es gerne lernen. Habe eine Anleitung umgesetzt welche den Benzinpreis einer Tankstelle bei Clever-Tanken.de ausliest und diesen Wert in ein Reading schreibt. Ich habe also ein Reading mit dem Namen Diesel. Diesem wird ein Wert (z.B 1,98€) zugewiesen.
Im Reading wird natürlich auch ein Zeitstempel dargestellt
Diesel   1.92    2022-09-28 17:00:35

Wie kann man diesen Zeitstempel wieder in ein Reading schreiben. Ich nenne es mal "Aktualisierung"

Nach meinem Verständnis muss ich ein UserReading definieren.

userattr reading01Name reading01Regex

Dann dem reading01Name den Namen Aktualisierung geben
Dann dem reading01Regex den Wert des Zeitstempels zuweisen. Wie mache Ich das? Welche Syntax?

Oder liege ich komplett falsch?

Vermutlich für viele Anfängerwissen. aber ich bin gerade überfordert und komme null weiter
Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: betateilchen am 28 September 2022, 17:39:13
Zitat von: bajogger am 28 September 2022, 17:33:39
Wie kann man diesen Zeitstempel wieder in ein Reading schreiben. Ich nenne es mal "Aktualisierung"

Wozu um alles in der Welt willst Du das tun?

Den Zeitstempel des readings kannst Du mit ReadingsTimestamp() analog zu ReadingsVal() bzw. ReadingsNum() ermitteln.
Das "Alter" des Zeitstempels kannst Du mit ReadingsAge() feststellen.
Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: bajogger am 28 September 2022, 17:46:01
ich möchte im DeviceOverview auch den Zeitstempel darstellen.
Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: bajogger am 28 September 2022, 17:49:11
ZitatDen Zeitstempel des readings kannst Du mit ReadingsTimestamp() analog zu ReadingsVal() bzw. ReadingsNum() ermitteln.

Weis leider nicht wie genau. Wie genau ermittelt man ReadingTimestamp meines Readings Diesel?

Finde leider nur für mich kryptische Erklärungen
Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: betateilchen am 28 September 2022, 18:02:38
Zitat von: bajogger am 28 September 2022, 17:49:11
Wie genau ermittelt man ReadingTimestamp meines Readings Diesel?

Die Syntax ist identisch wie bei ReadingsVal() ReadingsNum() und ReadingsAge()
Wie wäre es, mal einen Blick in die zentrale FHEM Doku (commandref) zu werfen?

https://commandref.fhem.de/commandref_DE.html#perl
Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: eisman am 28 September 2022, 18:12:10
Hi,

in 99_myUtils

  sub sub_TimeStampDatum($) { my ($T1) = @_; $T1 =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/; return "$3.$2."; }
  sub sub_TimeStampZeit($)  { my ($T1) = @_; $T1 =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/; return "$4";     }


und im Device userReadings


Datum  { sub_TimeStampDatum(ReadingsTimestamp('do.ESP47',"cmd","00.00."))},
Zeit   { sub_TimeStampZeit(ReadingsTimestamp('do.ESP47',"cmd","00:00"))}


gruss
Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: bajogger am 28 September 2022, 18:30:46
Natürlich lese ich. Aber im commandref steht

ZitatreadingTimeStamps attr <name> readingTimeStamps [0|1]
Sendet wenn angeschaltet (1) den Reading Zeitstempel vom FHEM an die InfluxDB, andernfalls(0) wird der Zeitstempel von der InfluxDB bestimmt. Diese Funktion ist nützlich für Geräte die Werte nachmelden mit dem Originalzeitstempel. Default: 0 (InfluxDB bestimmt den Zeitstempel, es wird keiner mitgesendet)

Sorry verstehe nur Bahnhof.

Auch der Beitrag von eisman macht mich nicht wirklich klüger.

Sorry hier sind vermutlich alle deutlich weiter als Ich. Ich definiere Devices und setzte darin attr. Ich habe schon at und notify's definiert. Ich bräuchte konkreten Beispiel Code

Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: betateilchen am 28 September 2022, 18:40:26
Zitat von: bajogger am 28 September 2022, 18:30:46
Natürlich lese ich. Aber im commandref steht

Du liest einfach an der völlig falschen Stelle in der commandref. Du bist in der Moduldokumentation zu InfluxDB, nicht bei den Grundlagen von FHEM.

Geh doch mal zu der Stelle, die ich in meinem vorherigen Beitrag verlinkt habe.
Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: eisman am 28 September 2022, 19:43:56
Hi,

Raw definition:

defmod LEDR dummy
attr LEDR devStateIcon off:15px-grey on:15px-red
attr LEDR group LED
attr LEDR readingList state
attr LEDR room Keller
attr LEDR setList state:on,off on off
attr LEDR useSetExtensions 1
attr LEDR userReadings Datum { my ($T1) = ReadingsTimestamp("LEDR","state","00.00.");; \
$T1 =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;; \
return "$3.$2.$1";; },\
Zeit { my ($T1) = ReadingsTimestamp("LEDR","state","00:00");; \
$T1 =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;; \
return "$4:$5";; }


$1 = Jahr    = 2022
$2 = Monat = 09
$3 = Tag     = 28

return "$3.$2.$1" = 28.09.2022
return "$3.$2."     = 28.09.

$4 = Time   = 00:00
$5 = sek     = 00

return "$4:$5" = 10:00:00
return "$4"      = 10:00


gruss
Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: bajogger am 28 September 2022, 21:12:23
Ich glaube ich gebe entnervt für Heute auf

Zusammenfassung, Mein Device heist "OUT.SpritpreisDies" das reading heist Diesel. Von diesem Reading möchte ich den Timestamp auslesen

attr OUT.SpritpreisDies userReadings Datum { my ($T1) = ReadingsTimestamp("OUT.SpritpreisDies","state","00.00.");; \
$T1 =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;; \
return "$3.$2.$1";; },\


tut nichts

attr OUT.SpritpreisDies userReadings Datum { my ($T1) = ReadingsTimestamp("OUT.SpritpreisDies","Diesel","00.00.");; \
$T1 =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;; \
return "$3.$2.$1";; },\[


auch nicht

Der Inhalt in der Referenz
ReadingsTimestamp(<devicename>, <reading>,<defaultvalue>)

Was tue ich damit? Ein Userattr mit diesem Code anlegen, oder?



Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: betateilchen am 28 September 2022, 21:24:38
Zitat von: bajogger am 28 September 2022, 21:12:23
Ich glaube ich gebe entnervt für Heute auf

Zusammenfassung, Mein Device heist "OUT.SpritpreisDies" das reading heist Diesel. Von diesem Reading möchte ich den Timestamp auslesen

Gib mal in der FHEM Befehlszeile ein:

{ReadingsTimestamp("OUT.SpritpreisDies","Diesel","n/a")}

Das funktioniert bei mir einwandfrei und liefert "2022-09-28 21:23:44" als Ergebnis.
Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: bajogger am 28 September 2022, 21:28:17
Ergebnis

2022-09-28 21:25:35

Das tut schon mal
Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: betateilchen am 28 September 2022, 21:32:07
attr OUT.SpritpreisDies userReadings Datum { substr(ReadingsTimestamp("OUT.SpritpreisDies","Diesel","00.00.00"),11,8);; }

funktioniert bei mir einwandfrei.

Noch besser ist es aber, einen passenden Trigger mit anzugeben:


defmod OUT.SpritpreisDies dummy
attr OUT.SpritpreisDies readingList Diesel
attr OUT.SpritpreisDies setList Diesel
attr OUT.SpritpreisDies userReadings Datum:Diesel.* { substr(ReadingsTimestamp("OUT.SpritpreisDies","Diesel","00.00.00"),11,8);; }
Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: betateilchen am 28 September 2022, 22:00:52
Grundsätzlich halte ich das ganze Vorhaben aber weiterhin für völlig sinnfrei.
Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: bajogger am 28 September 2022, 22:18:34
Vielen Dank

attr OUT.SpritpreisDies userReadings Datum { substr(ReadingsTimestamp("OUT.SpritpreisDies","Diesel","00.00.00"),11,8);; }

Gibt allerdings nur die Uhrzeit  aus

attr OUT.SpritpreisDies userReadings Datum {ReadingsTimestamp("OUT.SpritpreisDies","Diesel","n/a")}

gibt Datum und Uhrzeit aus

Auch wenn du denkst sinnfrei. Habe gerade viel gelernt.  Danke für deine Hilfe aber auch an jeden Beteiligten

Noch eine Frage. Kann ich in einem Device 2x userReadings vergeben? z.B. userReadings Datum und userReadings Uhrzeit


Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: betateilchen am 28 September 2022, 22:37:39
Lies die Beschreibung zu userReadings.
Titel: Antw:Schritt für Schritt Zeitstempel in Reading schreiben und anzeigen
Beitrag von: TomLee am 28 September 2022, 22:41:37
ZitatGibt allerdings nur die Uhrzeit  aus

https://perlmaven.com/substr (https://perlmaven.com/substr)