From 459c01966c72796c9792da88487b93ffcf08f57d Mon Sep 17 00:00:00 2001
From: rudolfkoenig
Date: Wed, 3 Jul 2013 19:09:06 +0000
Subject: [PATCH] userReadings offset/monotonic modifier by justme1968
git-svn-id: svn://svn.code.sf.net/p/fhem/code/trunk@3380 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
fhem/CHANGED | 1 +
fhem/docs/commandref_frame.html | 8 ++++++++
fhem/docs/commandref_frame_DE.html | 11 +++++++++--
fhem/fhem.pl | 10 +++++++++-
4 files changed, 27 insertions(+), 3 deletions(-)
diff --git a/fhem/CHANGED b/fhem/CHANGED
index 53f0edaa9..47c2d3ba8 100644
--- a/fhem/CHANGED
+++ b/fhem/CHANGED
@@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII
- SVN
+ - feature: offset and monotonic added to userReadings modifier (justme1968)
- feature: HUEDevice: support SVG icons for LWB001 living whites bulb
- feature: HUEDevice: support more than one bridge
- feature: updateInBackground global attribute
diff --git a/fhem/docs/commandref_frame.html b/fhem/docs/commandref_frame.html
index 0637d8c1a..55f0cf32f 100644
--- a/fhem/docs/commandref_frame.html
+++ b/fhem/docs/commandref_frame.html
@@ -440,6 +440,14 @@ A line ending with \ will be concatenated with the next one, so long lines
seconds between the current and the previous evaluation. Granularity
of time is one second. No value is calculated if the time past is
below one second. Useful to calculate rates.
+ offset: if the current evaluated value is smaler than the previously
+ evaluated value the reading is incremented by the previous value.
+ the reading can then be used as an offset correct for a counter that
+ is reset for example due to a power loss.
+ monotonic: if the difference between the current and the previously
+ evaluated value is positive the reading is incremented by this difference.
+ this allows to derive a monotonic growing counter from an original counter
+ even if the original will be rest by a power loss
Example:
attr myPowerMeter userReadings power
diff --git a/fhem/docs/commandref_frame_DE.html b/fhem/docs/commandref_frame_DE.html
index c1b07bbaa..92b72214f 100644
--- a/fhem/docs/commandref_frame_DE.html
+++ b/fhem/docs/commandref_frame_DE.html
@@ -447,8 +447,15 @@ Zeilen erstreckende Befehle, indem man keine \ am Zeilenende eingeben muss.
differential: das Reading wird auf die Differenz zw. dem aktuellen und
dem vorherigen Wert, geteilt durch die Sekunden zw. der aktuellen Zeit
und der letzten Auswertung, sekundengenau. Kein Wert wird berechnet,
- falls der Unterschied unter eine Sekunde liegt.
-
+ falls der Unterschied unter eine Sekunde liegt.
+ offset: wenn der aktuellen Wert kleiner als der vorherige Wert ist
+ wird der vorherige Wert zum Reading addiert. Das Reading kann dann
+ als offset verwendet werden um einen Zähler der durch Sromverlust zurückgesetzt
+ wird zu korrigieren.
+ monotonic: wenn die Differenz zw. dem aktuellen und dem vorherigen Wert
+ positiv ist wird diese Differenz zum Reading addiert. Damit lässt sich von
+ einem Zähler der bei Stromverlust zurückgesetzt wird ein monoton
+ wachsender Zähler ableiten.
Beispiel:
diff --git a/fhem/fhem.pl b/fhem/fhem.pl
index 877ed68c5..b2044ac02 100755
--- a/fhem/fhem.pl
+++ b/fhem/fhem.pl
@@ -1885,7 +1885,7 @@ CommandAttr($$)
my $perlCode= $6;
#Log 1, sprintf("userReading %s has perlCode %s with modifier %s%s",
# $userReading,$perlCode,$modifier,$trigger?" and trigger $trigger":"");
- if(grep { /$modifier/ } qw(none difference differential)) {
+ if(grep { /$modifier/ } qw(none difference differential offset monotonic)) {
$trigger =~ s/^:// if($trigger);
$userReadings{$userReading}{trigger}= $trigger;
$userReadings{$userReading}{modifier}= $modifier;
@@ -3163,6 +3163,14 @@ readingsEndUpdate($$)
if(defined($deltav) && defined($deltat) && ($deltat>= 1.0)) {
$result= $deltav/$deltat;
}
+ } elsif($modifier eq "offset") {
+ $oldvalue= 0 if( !defined($oldvalue) );
+ $result = ReadingsVal($name,$userReading,0);
+ $result += $oldvalue if( $value < $oldvalue );
+ } elsif($modifier eq "monotonic") {
+ $oldvalue= 0 if( !defined($oldvalue) );
+ $result = ReadingsVal($name,$userReading,0);
+ $result += $value - $oldvalue if( $value > $oldvalue );
}
readingsBulkUpdate($hash,$userReading,$result,1) if(defined($result));
# store value