FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: drdownload am 23 Januar 2016, 22:52:15

Titel: Alter eines Readings / Update-Zyklus als Wert (Erledigt)
Beitrag von: drdownload am 23 Januar 2016, 22:52:15
Ich versuche derzeit ein Userreading zu machen dass mir die Dauer zwischen der Aktualisierung der Readings anzeigt (hauptsächlich bei Funksensoren)

Aber irgendwie sind bis jetzt alle Versuche gescheitert mit einem Custom Reading der letzten Aktualisierung etc. Ich vermute an der Reihenfolge in der FHEM intern die Readings etc. aktualisiert werden.

Hat jemand vielleicht so etwas schon als Codeschnipsel rumliegen?
Titel: Antw:Alter eines Readings / Update-Zyklus als Wert
Beitrag von: crusader am 24 Januar 2016, 02:21:31
Also beim Update eines Readings ein User-Reading mit der Zeitdifferenz zum vorhergehenden Update ?

Das geht so:


attr userReadings delta_t:<reading> difference {str2time(ReadingsTimestamp("$name","<reading>",0))}
Titel: Antw:Alter eines Readings / Update-Zyklus als Wert
Beitrag von: drdownload am 24 Januar 2016, 09:56:33
Genau, super danke. Da hab ich wieder zu kompliziert gedacht.

Ich hab jetzt definiert delta_t:temperature difference {str2time(ReadingsTimestamp("$name","temperature",0))}

Bekomme aber trror evaluating tsh.sensoren.schlafzimmer userReading delta_t: Undefined subroutine &main::str2time called at (eval 291101) line 1.zurück

Nevermind, cpan ist ja case sensitiv beim instalieren von Modulen.

Edit: ok, Date nachinstallieren hat leider nichts geholfen
Titel: Antw:Alter eines Readings / Update-Zyklus als Wert
Beitrag von: crusader am 24 Januar 2016, 11:41:27
Zitat von: drdownload am 24 Januar 2016, 09:56:33

Ich hab jetzt definiert delta_t:temperature difference {str2time(ReadingsTimestamp("$name","temperature",0))}

Bekomme aber trror evaluating tsh.sensoren.schlafzimmer userReading delta_t: Undefined subroutine &main::str2time called at (eval 291101) line 1.zurück

Versuchs mal mit time_str2num($).
Das ist eine Routine aus 99_Utils.pm und sollte auf jeden Fall gehen.
Titel: Antw:Alter eines Readings / Update-Zyklus als Wert
Beitrag von: drdownload am 24 Januar 2016, 11:49:02
Thx! ich habe jetzt auch use Date::Parse in der 99_myUtils.pm hingefügt und jetzt geht es.

Es funktioniert allerdings nicht immer. Bei Sensoren die auch vom Statistics Modul upgedated werden kommt das userreading immer mit 0 daher. Da scheint die Reihenfolge der Reading-Updates wieder nicht zu passen.
Titel: Antw:Alter eines Readings / Update-Zyklus als Wert
Beitrag von: drdownload am 24 Januar 2016, 19:32:50
Ich schätze mal das liegt daran: http://forum.fhem.de/index.php?topic=38999.0 / http://forum.fhem.de/index.php/topic,39008.0.html
Titel: Antw:Alter eines Readings / Update-Zyklus als Wert
Beitrag von: drdownload am 24 April 2016, 10:26:43
Ich würde das Ding jetzt umbauen damit ihc nicht auf ein Update angewiesen bin, was ja gerade bei veralternden Readings irgendwie der Sinn wäre.

Ich würde alle 5 min. das Alter neu berechnen, ich stehe jetzt bloß vor dem Problem, dass ich gerne durch eine Liste der zu überwachenden Devices loopen würde. Nur wie? Ich dachte ich gebe den Devices ein userattr mit dem namen des zu überwachenden readings. Nur wie kann ich mir die in eine Liste schupfen um sie foreach abzuarbeiten?
Titel: Antw:Alter eines Readings / Update-Zyklus als Wert
Beitrag von: betateilchen am 24 April 2016, 11:37:17
Das Alter eines Readings kann man auch einfach mit

ReadingsAge(<deviceName>,<readingName>,<defaultValue>)

ermitteln.
Titel: Antw:Alter eines Readings / Update-Zyklus als Wert
Beitrag von: drdownload am 24 April 2016, 12:04:23
ui, die Änderung ist an mir vorübergegangen.

aber von meinem problem, dass ich automatisch durch die nötigen devices das laufen lassen will ist leider damit noch nicht gelöst.  ich könnte zwar ein at mit einem array starten wo ich jeweils device und reading paar reingebe um die abzuarbeiten, aber dazu benenne ich meine sachen zu oft um ;)

Titel: Antw:Alter eines Readings / Update-Zyklus als Wert
Beitrag von: marvin78 am 24 April 2016, 12:18:54
Zitat von: drdownload am 24 April 2016, 12:04:23
aber dazu benenne ich meine sachen zu oft um ;)

Warum macht man das? Der Name sollte in einer Produktivumgebung eine Konstante sein und nur in Ausnahmefällen geändert werden. Das ist natürlich am Ende jedem selbst überlassen, aber die Frage, welchen Grund es geben könnte, Devices ständig umzubenennen, stellt sich hier auf jeden Fall.

Andernfalls gibst du den Devices eben eindeutige userAttribute und verwendest devspec2array. Und: Auch in ReadingsAge kannst du die Variable $name verwenden.
Titel: Antw:Alter eines Readings / Update-Zyklus als Wert
Beitrag von: drdownload am 24 April 2016, 13:56:17
Der Grund für Umbennen ist oft, dass man schnell mal ein neues Device dazugibt und dann später draufkommt, dass man sich nicht an die Nomenklatura gehalten hat. Gerade wenn man mal ein paar Module ausprobiert.

Danke aber das devspec2array war der wichtige Hinweis, dass ich einfach falsch gefiltert habe auf mein user attr
Titel: Antw:Alter eines Readings / Update-Zyklus als Wert
Beitrag von: drdownload am 24 April 2016, 14:58:56

+*00:01:00 {
foreach my $dev (devspec2array("readingAgeReading=[A-Za-z].*")) {
my $reading = AttrVal("$dev","readingAgeReading","");
my $timeEnd = str2time(TimeNow());
my $timeStart =str2time(ReadingsTimestamp("$dev","$reading",0));
my $timeElapsed= $timeEnd - $timeStart;
fhem ("setreading $dev readingAge $timeElapsed");
}}


Einfach der Device das Attr readingAgeReading zuweisen und jede Minute wird der Wert aktualisiert.