FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: Thorsten Pferdekaemper am 22 Januar 2014, 00:24:52

Titel: Funktion für exponentielle Glättung
Beitrag von: Thorsten Pferdekaemper am 22 Januar 2014, 00:24:52
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