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?
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))}
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
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.
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.
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
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?
Das Alter eines Readings kann man auch einfach mit
ReadingsAge(<deviceName>,<readingName>,<defaultValue>)
ermitteln.
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 ;)
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.
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
+*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.