Timestamp eines Sensorwertes anzeigen?

Begonnen von SensorMane, 15 Oktober 2017, 14:33:37

Vorheriges Thema - Nächstes Thema

SensorMane

Hallo Leute,

ich habe eine Readingsgroup in der mir die übertragenen Sensorwerte angezeigt werden. Ich würde nun gern daneben noch die Zeit anzeigen, wann die letzte Aktualisierung dieses Wertes war. Ich habe jetzt rum gesucht und probiert, find einfach nix dazu. Im Wiki hab ich auch nicht wirklich was gefunden. Meine Readingsgroup ist so definiert:

define rgTerasse readingsGroup MYSENSOR_102:<%humidity@black>,<Luftfeuchtigkeit>,humidity\
MYSENSOR_102:<%weather_barometric_pressure@black>,<Luftdruck>,pressure2\
MYSENSOR_102:<%temp_temperature@black>,<Temperatur>,temperature1\
MYSENSOR_102:<%rc_UP@black>,<Höhe>,value13\
MYSENSOR_102:<%measure_battery_100@black>,<Batterie>,value24


Das ganze wird wie folgt formatiert:
attr rgTerasse valueFormat {temperature1 => '%.1f &degC', humidity=>'%.1f %%', pressure2 => '%.1f hPa', value13 => '%.1f Meter', value24 => sprintf("%.3f V",$V
ALUE/1000)}


Nun hätte ich halt gerne neben den Werten die Anzeige der letzten Aktualisierung. Wenn ich es richtig verstanden habe, muss das bereits in die Definition der ReadingsGroup rein. Aber Angaben wie time,TIME,timestamp usw. haben nicht zum Erfolg geführt.

Vielleicht kann mir jemand einen Schubs in die richtige Richtung geben?

Danke!

Gruß - Markus

eisman

Hi,

das geht mit {ReadingsTimestamp($name,'reading','')}, wenn ich jetzt nicht falsch liege,

mfg
1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian, Homematic,ZigBee         / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian,MQTT                               / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

DerFrickler

da liegst du richtig, nachzulesen in der Commandref unter Perl specials

SensorMane

Hallo,

vielen Dank für die Hinweise  :)

Ich hab mal nachgelesen und das define folgendermaßen abgeändert:
MYSENSOR_102:<%humidity@black>,<Luftfeuchte>,humidity,<{int(ReadingsAge($DEVICE,"humidity","")/60)}>,<min>
MYSENSOR_102:<%weather_barometric_pressure@black>,<Luftdruck>,pressure2,<{int(ReadingsAge($DEVICE,"pressure2","")/60)}>,<min>
MYSENSOR_102:<%temp_temperature@black>,<Temperatur>,temperature1,<{int(ReadingsAge($DEVICE,"temperature1","")/60)}>,<min>
MYSENSOR_102:<%rc_UP@black>,<Höhe>,value13,<{int(ReadingsAge($DEVICE,"value13","")/60)}>,<min>
MYSENSOR_102:<%measure_battery_100@black>,<Batterie>,value24,<{int(ReadingsAge($DEVICE,"value24","")/60)}>,<min>


So wird mir die Zeit in Minuten (grob) seit dem letzten Übertragen angezeigt. Das mit dem Timestamp hat auch funktioniert, wurde mir aber zu unübersichtlich.

PROBLEM: Jetzt erfolgt aber keine automatische Aktualisierung der ReadingsGroup mehr  :-\

Lässt sich das vielleicht nicht kombinieren?


SensorMane

So, neue Erkenntnisse: Die Werte der Sensoren werden auch nach wie vor aktualisiert. Nur der ermittelte Zeitpunkt via ReadingsAge wird nicht aktualisiert! Hängt vermutlich mit der Formatierung über das Attribut valueFormat zusammen. Da diese Zeit aber kein Reading ist, weiß ich nicht wie ich die Formatierung in das Attribut reinpacken soll!

Kann mir hierzu vielleicht jemand auf die Sprünge helfen?  :-X

Gruß

CoolTux

userReadings beim eigentlichen Sensor Device
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

SensorMane

Danke für den Tipp!  :)

Ich hab das jetzt mal umgesetzt und es funktioniert auch. Aber schön find ich das nicht, da gibt es bestimmt noch Verbesserungspotential.

Die Änderungen im Device:
lastAction1:.* {ReadingsTimestamp("$name","humidity","")},
lastAction2:.* {ReadingsTimestamp("$name","temperature1","")},
lastAction3:.* {ReadingsTimestamp("$name","pressure2","")},
lastAction4:.* {ReadingsTimestamp("$name","value13","")},
lastAction5:.* {ReadingsTimestamp("$name","value24","")}


Hier habe ich versucht mit Parametern zu arbeiten, z.B. "lastAction.$reading" um userReadings nach dem Muster "lastAction.humidity", "lastAction.temperature1" usw. zu bekommen. Das mag er aber nicht. Würde den userReadings Block aber umgemein vereinfachen.
Eine Schleife ginge ja auch noch, etwa so:
for ($i=1;$i<6;$i++){lastAction."$i":.* {ReadingsTimestamp("$name","$reading","")}}
Funktioniert aber auch nicht. Laut Log wird da einfach nichts gemacht, ich vermute mal da stimmt die Syntax nicht?

Ähnlich sieht es dann in der Readingsgroup aus:
{temperature1 => '%.1f &degC', humidity=>'%.1f %%', pressure2 => '%.1f hPa', value13 => '%.1f Meter', value24 => sprintf("%.3f V",$VALUE/1000),
lastAction1=>'{(split(" ",$VALUE))[1]}',
lastAction2=>'{(split(" ",$VALUE))[1]}',
lastAction3=>'{(split(" ",$VALUE))[1]}',
lastAction4=>'{(split(" ",$VALUE))[1]}',
lastAction5=>'{(split(" ",$VALUE))[1]}'}


Auch das ist nicht wirklich schön, aber funktioniert.

Kann man das noch vereinfachen bzw. automatisieren?

SensorMane

Noch was seh ich gerade im Logfile:

PERL WARNING: Argument "2017-10-21 11:45:43" isn't numeric in division (/) at (eval 56931) line 1

Das kommt ständig bei jeder Aktualisierung! Hängt sicher mit dem split aus dem valueFormat zusammen. Aber wieso sollte das nicht numerisch sein bzw. warum stört er sich überhaupt daran? Ich rechne ja nicht mit den Werten, er soll ja nur trennen anhand des Leerzeichens. Das macht er ja auch anstandlos!

Ich verstehs nicht  :-\

SensorMane

Ich korrigiere mich: Der Ausdruck ist natürlich nicht rein numerisch, daher die Meldung. Wie kann ich die Meldung dennoch unterdrücken? Müllt mir das Log total zu? Das Setzen von verbose hilft nix, auch global stacktrace 0 auch nicht.

Jemand ne Idee?