2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 12:49:34 +00:00

fhem.pl: UserReadings/integral by simonberry (Forum #26300)

git-svn-id: https://svn.fhem.de/fhem/trunk@6425 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2014-08-19 20:55:00 +00:00
parent 7a9abe2f87
commit cf18028551
3 changed files with 27 additions and 7 deletions

View File

@ -485,6 +485,11 @@ A line ending with \ will be concatenated with the next one, so long lines
seconds between the current and the previous evaluation. Granularity seconds between the current and the previous evaluation. Granularity
of time is one second. No value is calculated if the time past is of time is one second. No value is calculated if the time past is
below one second. Useful to calculate rates.</li> below one second. Useful to calculate rates.</li>
<li>integral: reverse function of differential. The result is incremented
by the product of the time difference between the last two readings
and the avarage of the last two readings. <br>
result += (time - timeold) * (oldval + value) / 2
</li>
<li>offset: if the current evaluated value is smaler than the previously <li>offset: if the current evaluated value is smaler than the previously
evaluated value the reading is incremented by the previous value. evaluated value the reading is incremented by the previous value.
the reading can then be used as an offset correct for a counter that the reading can then be used as an offset correct for a counter that

View File

@ -501,14 +501,20 @@ Zeilen erstreckende Befehle, indem man keine \ am Zeilenende eingeben muss.</p>
dem vorherigen Wert, geteilt durch die Sekunden zw. der aktuellen Zeit dem vorherigen Wert, geteilt durch die Sekunden zw. der aktuellen Zeit
und der letzten Auswertung, sekundengenau. Kein Wert wird berechnet, und der letzten Auswertung, sekundengenau. Kein Wert wird berechnet,
falls der Unterschied unter eine Sekunde liegt.</li> falls der Unterschied unter eine Sekunde liegt.</li>
<li>integral: das Gegenteil von differential. Das Ergebnis wird um das
Produkt aus der Zeit-Differenz und der Durschnittswert der letzten zwei
Readings erh&ouml;ht.<br>
result += (time - timeold) * (oldval + value) / 2
</li>
<li>offset: wenn der aktuellen Wert kleiner als der vorherige Wert ist <li>offset: wenn der aktuellen Wert kleiner als der vorherige Wert ist
wird der vorherige Wert zum Reading addiert. Das Reading kann dann wird der vorherige Wert zum Reading addiert. Das Reading kann dann als
als offset verwendet werden um einen Z&auml;hler der durch Sromverlust zur&uuml;ckgesetzt offset verwendet werden um einen Z&auml;hler der durch Sromverlust
wird zu korrigieren.</li> zur&uuml;ckgesetzt wird zu korrigieren.</li>
<li>monotonic: wenn die Differenz zw. dem aktuellen und dem vorherigen Wert <li>monotonic: wenn die Differenz zw. dem aktuellen und dem vorherigen
positiv ist wird diese Differenz zum Reading addiert. Damit l&auml;sst sich von Wert positiv ist wird diese Differenz zum Reading addiert. Damit
einem Z&auml;hler der bei Stromverlust zur&uuml;ckgesetzt wird ein monoton l&auml;sst sich von einem Z&auml;hler der bei Stromverlust
wachsender Z&auml;hler ableiten.</li> zur&uuml;ckgesetzt wird ein monoton wachsender Z&auml;hler
ableiten.</li>
</ul> </ul>
Beispiel: Beispiel:
<ul><code> <ul><code>

View File

@ -3483,6 +3483,15 @@ readingsEndUpdate($$)
if(defined($deltav) && defined($deltat) && ($deltat>= 1.0)) { if(defined($deltav) && defined($deltat) && ($deltat>= 1.0)) {
$result= $deltav/$deltat; $result= $deltav/$deltat;
} }
} elsif($modifier eq "integral") {
if(defined($oldt) && defined($oldvalue)) {
my $deltat= $hash->{".updateTime"} - $oldt if(defined($oldt));
my $avgval= ($value + $oldvalue) / 2;
$result = ReadingsVal($name,$userReading,$value);
if(defined($deltat) && $deltat>= 1.0) {
$result+= $avgval*$deltat;
}
}
} elsif($modifier eq "offset") { } elsif($modifier eq "offset") {
$oldvalue = $value if( !defined($oldvalue) ); $oldvalue = $value if( !defined($oldvalue) );
$result = ReadingsVal($name,$userReading,0); $result = ReadingsVal($name,$userReading,0);