OldValue() / OldTimestamp() gibt mir aktuelle Werte anstatt alten

Begonnen von eldar, 03 Februar 2015, 18:22:53

Vorheriges Thema - Nächstes Thema

eldar

Hallo zusammen,
ich möchte Energie anhand von Leistung berechnen. Die Integralfunktion (danke simonberry  :) ) ist leider nicht genau das was ich brauche. Ich will E1 = (t1-t0) * P + E0 berechnen (E = Energie, t = Zeit, P = Leistung)... Ich dachte dazu wäre OldValue() und OldTimestamp() geeignet, aber wenn ich die in userReadings ausprobiere, geben die mir immer nur die aktuellen Werte der Leistung bzw. die aktuelle Zeit.

define EnO_sensor_FFBE8D01 EnOcean FFBE8D01
attr EnO_sensor_FFBE8D01 subType autoMeterReading.01
attr EnO_sensor_FFBE8D01 userReadings energy integral {ReadingsVal("EnO_sensor_FFBE8D01","power",-1)/3600}, power0 {OldValue("EnO_sensor_FFBE8D01")}, time {TimeNow()}, time0 {OldTimestamp("EnO_sensor_FFBE8D01")}


Was mache ich falsch?
Eldar

rudolfkoenig

OldValue wird nach(!) der Abarbeitung eines beliebigen Events von diesem Geraet auf dem STATE-Wert gesetzt.
Zur gleichen Zeit wird OldTimestamp auf die aktuelle Uhrzeit gesetzt.

eldar

Ok, heißt dass das es quasi unmöglich ist beides, also OldValue und OldTimestamp zu kriegen? Mit dem Code hier, der von einem notify ausgeführt wird, kriege ich das richtige OldValue, aber die aktuelle Zeit von OldTimestamp. Wenn ich die beiden Zeilen mit OldValue und OldTimestamp umdrehe, dreht sich auch die Richtigkeit um, also OldTimestamp gibt mir die alte Zeit, aber OldValue den aktuellen Wert.
sub calcEnergy ($)
{
my ($CM) = @_;
fhem("setreading $CM power0 " . OldValue($CM));
fhem("setreading $CM time0 " . OldTimestamp($CM));
fhem("setreading $CM energy0 " . ReadingsVal($CM,"energy",0));
my $tdelta = (time_str2num(ReadingsTimestamp($CM,"power",0)) - time_str2num(ReadingsVal($CM,"time0",0)))/3600;
my $Energy = $tdelta * ReadingsVal($CM,"power0",0);
$Energy = $Energy + ReadingsVal($CM,"energy0",0);
fhem ("setreading $CM energy " . $Energy);
fhem ("setreading $CM tdelta " . $tdelta);
}


Ps: Die Schreibweise ist nicht gerad sehr elegant, da mir fhem-commands leichter fallen als perl-commands.  :)

rudolfkoenig

Man kann ja OldValue und OldTimestamp in Variablen merken, bevor man mit setreading anfaengt.

eldar

Danke  :)  Ich hatte OldTimestamp, durch ReadingsTimestamp von "energy0" ersetzt, bevor es ueberschrieben wurde, was auch funktioniert hat. Aber ja, Variablen merken ist definitiv besser und uebersichtlicher!