Funktion für exponentielle Glättung

Begonnen von Thorsten Pferdekaemper, 22 Januar 2014, 00:24:52

Vorheriges Thema - Nächstes Thema

Thorsten Pferdekaemper

Hi,
ich wollte eine "geglättete" Version von bestimmten Readings sehen. Vielleicht geht das auch einfacher, aber vielleicht findet's doch jemand nützlich. Das Folgende steht in der 99_myUtils.pm:

#
# smoothen: exponential "smoothing"
#     parameters: device name, source field name, target field name, factor
#
sub
myUtils_smoothen($$$$)
{
   my ($devname, $rawname, $smoothname, $factor) = @_;
   # get current value
   my $curr = ReadingsVal($name,$rawname, 0);
   # care for fields with "%"
   $curr =~ s/%| //g;
   # get current "smooth" value
   my $old = ReadingsVal($devname,$smoothname,$curr);
   
   return (($factor -1) * $old + $curr) / $factor;   
}

Das ganze kann man in einem userReading so verwenden:
attr og_ku_HeizungOp userReadings smoothActuator { myUtils_smoothen($name,"ValvePosition","smoothActuator",75);
...d.h. es erzeugt ein neues Reading, welches durch exponentielle Glättung des ursprünglichen ermittelt wird. Schöner wäre vielleicht ein gleitender Durchschnitt, aber das ist komplizierter.
Die Parameter dürften klar sein, nur vielleicht $factor: Der Wert bedeutet, dass der aktuelle Wert mit einem Faktor von 1/$factor in die Berechnung eingeht.
Gruß,
   Thorsten
FUIP