Hallo,
ich habe ein Device dessen Wert ich mir mit einem userreading "zusammenrechne".
Das Ergebnis daraus möchte ich nun im stateCmd als Status übernehmen.
Leider zeigt es mir immer den vorgergehenden Wert an, nicht den aktuellen des Readings.
Daraus schließe ich, dass stateCmd vor Userreadings ausgewertet wird, was ich für falsch halten würde....
sG
Joe
Servus!
StateCmd steht an letztmöglicher Stelle im Modul - alles andere entzieht sich meiner Kontrolle:
#execute state-command if defined
#must be placed after first reading, because it may have a reference
my $cmdAttr = AttrVal($name, "stateCmd", undef);
if (defined ($cmdAttr) and !($cmdAttr eq ""))
{
$state = eval $cmdAttr;
Log3 ($name, 5, "set name: $name - state replaced via command, result: state:$state");
}
readingsBulkUpdate($hash, "state", $state);
readingsEndUpdate($hash, 1);
Das ist doch schon die Erklärung. UserReadings werden erst in readingsEndUpdate() aktualisiert.
Nun gibt es da halt immer einen Zielkonflikt:
Will man im UserReading den aktuellen Wert von state auswerten, wünscht man sich, dass zuerst stateCmd ausgeführt wird und dann das UserReading.
Will man im stateCmd auf das UserReading zugreifen, ist es gerade umgekehrt.
Die Logik der UserReadings ist, dass vor ihrer Berechnung alle echten Readings, also auch state ihren Wert erhalten haben.
@JoeAllb: Es ist zwar nicht sonderlich elegant, aber in diesem Fall würde ich folgendes empfehlen:
Definiere dein privates Reading nicht als UserReading, sondern aktualisiere es über den Code im stateCmd...
Viele Grüße
Andreas
Danke Andreas.
Ich dachte, das wäre einer der Unterschiede zwischen stateCmd und stateFormat .....
Danke Andreas für den Workaround: In meinem Fall ist dieser sogar noch einfache, da es sich um einen reinen Zähler handelt: +1 dazurechnen ;-)
Auch nicht elegant, funktioniert aber auch!
sG
Joe