Windsensor: gleitender Durchschnitt und Perl Frage

Begonnen von herrmannj, 20 April 2013, 22:19:36

Vorheriges Thema - Nächstes Thema

herrmannj

Hallo zusammen,

da mein Windsensor WGR800 alle 14 Sekunden ein Paket sendet (damit die logs unsinnig auf bläht und die plots völlig überfrachtet) habe ich nach einer Möglichkeit gesucht das zu verbessern. Dazu habe ich ein userReading angelegt das einen gleitenden Durchschnitt erstellt und dessen Ergebnis zurück gibt.


WA1 {
  our ($c);
  $c = (($c *59) + (ReadingsVal("WGR800", "wind_avspeed", $c)))/60;
  return sprintf("%.0f",$c); }


Anschließend habe ich mit einem event-on-change-reading WA1 die notifys auf Änderungen begrenzt.

Bei dem Code handelt es sich vorerst um eine Minimalvariante ohne Windrichtung, die Gewichtung 59/1 ( = 60 Readings a 14sec -> 820sec) hat sich im Augenblick als guter Kompromiss zwischen Glättung und Änderung erwiesen. Bei Sensoren die in anderen Intervallen senden sollte der erste Wert angepasst werden.

Ein gleitender Durchschnitt von 14min bedeutet übrigens nicht das nur aller 14min neue Readings ausgeworfen werden, es geht im Kern darum die ständigen Schwankungen der Windstärke in der Ausgabe zu glätten. Dazu wird fortlaufend ein Durchschnitt der letzten 60 Readings gebildet und eine Änderung dieses Durchschnitts wird sofort reported. In dieser Konfiguration (WGR800 und 820sec) erhalte ich bei starken Windschwankungen etwa 1 Reading alle 2 Minuten. Bei (im Mittel) gleichmäßigerem Wind erhalte ich, so wie beabsichtigt, deutlich größere Intervalle (>10 .. 30min und mehr).

Aufgrund mangelnder Perl Erfahrung bin ich mir bei der Deklaration von $c sehr unsicher. My() geht erwartungsgemäß nicht - bei our() riskiere ich vermutlich unter ungünstigen Umständen Kollisionen mit Variablen in anderen Modulen ? Hier wäre ich für Hinweise oder Vorschläge dankbar.

Danke und Grüße
Jörg

stromer-12

Zitat von: herrmannj schrieb am Sa, 20 April 2013 22:19
WA1 {
  our ($c);
  $c = (($c *59) + (ReadingsVal("WGR800", "wind_avspeed", $c)))/60;
  return sprintf("%.0f",$c); }


Aufgrund mangelnder Perl Erfahrung bin ich mir bei der Deklaration von $c sehr unsicher. My() geht erwartungsgemäß nicht - bei our() riskiere ich vermutlich unter ungünstigen Umständen Kollisionen mit Variablen in anderen Modulen ? Hier wäre ich für Hinweise oder Vorschläge dankbar.

sollte auch so gehen:
WA1 {my $c=ReadingsVal($name,"WA1",0);;sprintf("%.0f", (($c*59) + ReadingsVal($name,"wind_avspeed",$c))/60)}
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL