[Gelöst] Problem mit Gleitender Mittelwert movingAverage()

Begonnen von majorshark, 13 Juni 2017, 10:42:25

Vorheriges Thema - Nächstes Thema

majorshark

Hallo,

ich versuche für verschiedene Readings meiner Wetterstation mit der Funktion movingAverage() einen Mittelwert zu erzeugen. Leider gelingt mir dies nicht wirklich.

Die Wetterstation liefert aller ca. 30 Sekunden neue Werte in den verschiedenen Readings. Zum Beispiel auch Reading Windgeschwindigkeit_ms. Den Mittelwert versuche ich mit
attr ESPEasy_Wetterstation userReadings WindgeschwindigkeitAV {movingAverage("ESPEasy_Wetterstation","Windgeschwindigkeit_ms",1500)}
zu ermitteln.

Das Array der Funktion enthält mehrfach die gleichen Werte was die Berechnung des Mittelwertes völlig unsinnig macht.
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 2.4 Time = 2017-06-13 09:35:19
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 2.4 Time = 2017-06-13 09:35:19
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 2.4 Time = 2017-06-13 09:35:19
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 2.4 Time = 2017-06-13 09:35:19
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 2.4 Time = 2017-06-13 09:35:19
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 2.4 Time = 2017-06-13 09:35:19
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 2.4 Time = 2017-06-13 09:35:19
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 2.4 Time = 2017-06-13 09:35:19
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 2.4 Time = 2017-06-13 09:35:19
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 2.4 Time = 2017-06-13 09:35:19
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 2.4 Time = 2017-06-13 09:35:19
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 2.4 Time = 2017-06-13 09:35:19
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 1.8 Time = 2017-06-13 09:35:50
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 1.8 Time = 2017-06-13 09:35:50
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 1.8 Time = 2017-06-13 09:35:50
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 1.8 Time = 2017-06-13 09:35:50
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 1.8 Time = 2017-06-13 09:35:50
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 1.8 Time = 2017-06-13 09:35:50
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 1.8 Time = 2017-06-13 09:35:50
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 1.8 Time = 2017-06-13 09:35:50
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 1.8 Time = 2017-06-13 09:35:50
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 1.8 Time = 2017-06-13 09:35:50
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 1.8 Time = 2017-06-13 09:35:50
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 1.8 Time = 2017-06-13 09:35:50
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation Windgeschwindigkeit_ms movingAverage] Value = 1.8 Time = 2017-06-13 09:35:50
2017.06.13 09:35:56 3: [ESPEasy_Wetterstation moving average] calculated over 25 values is 2.088


Wieso wird die Funktion innerhalb kürzester Zeit so oft aufgerufen? Wo mach ich den Fehler?

Anbei noch die Definition des Device
defmod ESPEasy_Wetterstation ESPEasy 192.168.3.207 80 ESP_Bridge Wetterstation
attr ESPEasy_Wetterstation IODev ESP_Bridge
attr ESPEasy_Wetterstation event-min-interval Blitze_5min:3600,Regen_mmh:900,UV-Index:3600,Temperatur:900,Feuchtigkeit:900,LuftdruckBME:3600,Windgeschwindigkeit_ms:900
attr ESPEasy_Wetterstation event-on-change-reading Regen_mm,Windboehen_ms,Regen_mmh,Blitze_5min,Entfernung_km
attr ESPEasy_Wetterstation event-on-update-reading UV-Index,Temperatur,Feuchtigkeit,LuftdruckBME,Windgeschwindigkeit_ms
attr ESPEasy_Wetterstation group ESPEasy Device
attr ESPEasy_Wetterstation presenceCheck 1
attr ESPEasy_Wetterstation readingSwitchText 1
attr ESPEasy_Wetterstation room 3.7_Umwelt,9.7_ESPEasy
attr ESPEasy_Wetterstation setState 0
attr ESPEasy_Wetterstation userReadings WindgeschwindigkeitAV {movingAverage("ESPEasy_Wetterstation","Windgeschwindigkeit_ms",1500)}
attr ESPEasy_Wetterstation verbose 0
Grüße aus Dewitz

VM auf Synology DS718+ mit FHEM 5.9 auf Debian 9.5/32-Bit (stretch)
Nächster Leipziger Stammtisch:

frank

ZitatWieso wird die Funktion innerhalb kürzester Zeit so oft aufgerufen? Wo mach ich den Fehler?
wahrscheinlich erzeugt das modul entsprechend viele events, die jeweils das userreading triggern.

definiere beim userreading einen trigger. siehe zb commandref.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

majorshark

Das hatte ich auch schon drin. Nur leider falsch.  :(
Es heist ja: <Reading>:einer der aktualisierten Readings dem regexp <trigger>

Muss dann also bei mir lauten: WindgeschwindigkeitAV:Windgeschwindigkeit_ms.*

Jetzt geht's. Danke für den Denkanstoß.

Grüße aus Dewitz

VM auf Synology DS718+ mit FHEM 5.9 auf Debian 9.5/32-Bit (stretch)
Nächster Leipziger Stammtisch:

KernSani

Schreibst du dann noch [Gelöst] vor das Subject des ersten Posts? Danke.
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

andies

#4
Zitat von: majorshark am 13 Juni 2017, 11:15:51
Jetzt geht's. Danke für den Denkanstoß.
Kannst Du mal die genaue Lösung hier posten? Ich habe das gleiche Problem und verstehe Deinen Hinweis leider nicht wirklich. Wo genau ist der trigger und wie wird er definiert? (Bei mir ist es Sonoff, das mehrfach dieselben Werte sendet.)

Im Logfile sieht es so aus:
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.2 Time = 2017-09-08 07:31:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.2 Time = 2017-09-08 07:31:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.5 Time = 2017-09-08 07:32:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.5 Time = 2017-09-08 07:32:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.5 Time = 2017-09-08 07:32:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 45.9 Time = 2017-09-08 07:33:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 45.9 Time = 2017-09-08 07:33:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 45.9 Time = 2017-09-08 07:33:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.3 Time = 2017-09-08 07:34:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.3 Time = 2017-09-08 07:34:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.3 Time = 2017-09-08 07:34:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.1 Time = 2017-09-08 07:35:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.1 Time = 2017-09-08 07:35:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.1 Time = 2017-09-08 07:35:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 45.6 Time = 2017-09-08 07:36:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 45.6 Time = 2017-09-08 07:36:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 45.6 Time = 2017-09-08 07:36:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.1 Time = 2017-09-08 07:37:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.3 Time = 2017-09-08 07:38:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.3 Time = 2017-09-08 07:39:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] Value = 46.1 Time = 2017-09-08 07:40:34
2017.09.08 07:40:34 1: [Sonoff_pow1 moving average] calculated over 21 values is 46.114

erzeugt durch diese Definition:
Power.av:Time.* {movingAverage("Sonoff_pow1","Power",300)}
bei diesem Gerät
Internals:
   IODev      Mosquitto
   NAME       Sonoff_pow1
   NR         123
   STATE      46.4 W
   TYPE       MQTT_DEVICE
   READINGS:
     2017-09-08 07:41:34   Current         0.11
     2017-09-08 07:41:34   ENERGY          {"Time":"2017-09-08T06:41:33", "Total":20.47319, "Yesterday":1.10970, "Today":0.30929, "Period":0.7, "Power":46.4, "Factor":1.00, "Voltage":229.4, "Current":0.110}
     2017-09-08 07:41:34   Factor          1
     2017-09-08 07:12:57   LWT             Online
     2017-09-08 07:41:34   Period          0.7
     2017-09-08 07:41:34   Power           46.4
     2017-09-08 07:41:34   Power.av        46.124
   message_ids:
   publishSets:
     :
       topic      cmnd/Sonoff_pow1/power
       values:
         on
         off
   sets:
     off
     on
   subscribe:
     tele/Sonoff_pow1/ENERGY
     tele/Sonoff_pow1/LWT
   subscribeExpr:
     ^tele\/Sonoff_pow1\/ENERGY$
     ^tele\/Sonoff_pow1\/LWT$
   subscribeReadings:
     tele/Sonoff_pow1/ENERGY:
       cmd
       name       ENERGY
     tele/Sonoff_pow1/LWT:
       cmd
       name       LWT
Attributes:
   IODev      Mosquitto
   publishSet on off cmnd/Sonoff_pow1/power
   subscribeReading_ENERGY tele/Sonoff_pow1/ENERGY
   subscribeReading_LWT tele/Sonoff_pow1/LWT
   userReadings Power.av:Time.* {movingAverage("Sonoff_pow1","Power",300)}
   

Das Problem besteht darin, dass zu einem Zeitpunkt mehrfach gelesen wird - womit dann movingaverage doppelt zählt. Time als trigger genügt zum "aussieben" nicht.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

CoolTux

Zitat von: majorshark am 13 Juni 2017, 11:15:51
Muss dann also bei mir lauten: WindgeschwindigkeitAV:Windgeschwindigkeit_ms.*

Genauer kann man es glaube nicht sagen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

andies

Dann habe ich mich falsch ausgedrückt. Bei mir ändert sich die Variable time, aber es wird in Wirklichkeit keine neue Zeit hineingeschrieben. D.h. In einer Sekunde werden mehrfach die gleichen Werte notiert und demzufolge ist der gleitende Mittelwert unsinnig, weil in einer Sekunde drei, in der nächsten vielleicht fünf (jeweils identische) Werte berücksichtigt werden. Da nützt mir ein einfacher trigger anscheinend nichts.

(Ist vermutlich ursächlich ein Sonoff-Problem? Aber das kann ich auch nicht lösen.)


Gesendet von iPad mit Tapatalk Pro
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Also ich glaube, ich habe das Problem. Ich vermute, dass es etwas mit der genannten Funktion movingAverage zu tun hat. Da stimmt was nicht, was die untenstehende Grafik auch zeigt. Weiß jemand, wer das geschrieben hat? Ich finde einen Wikipedia-Eintrag ohne Link zum Forum und einen Forumsbeitrag, in dem es aber eher darum geht, wohin dieser Code gesteckt wird (wenn es denn derselbe ist, die Namen der Dateien sind unterschiedlich). Ich würde das gern im richtigen Thread diskutieren.

Hier ein Bild. Der gleitende Durchschnitt (grün) kann ja nicht beständig kleiner sein als die Werte selbst (rot).
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

majorshark

#8
So wie ich das sehe ist in Deinem userReading
Power.av:Time.* {movingAverage("Sonoff_pow1","Power",300)}
Das Time.* falsch. Dort sollte meiner Meinung nach Power.* stehen.

Hier mal mein komplettes Device
defmod ESPEasy_Wetterstation ESPEasy 192.168.3.207 80 ESP_Bridge Wetterstation
attr ESPEasy_Wetterstation IODev ESP_Bridge
attr ESPEasy_Wetterstation event-min-interval Feuchtigkeit:900,Temperatur:900,Windgeschwindigkeit_ms:300,WindboeenMX_kmh:300,Windrichtung:300,LuftdruckBME:3600,UV-Index:3600,Blitze_5min:3600,Entfernung_km:900
attr ESPEasy_Wetterstation event-on-change-reading WindgeschwindigkeitAV_kmh,WindrichtungAV,WindrichtungKompass,Regen_mmh,Entfernung_km
attr ESPEasy_Wetterstation event-on-update-reading LuftdruckBME,Feuchtigkeit,Blitze_5min,Blitze_Total,TemperaturBME,Temperatur,Windboeen_ms,Windgeschwindigkeit_ms,WindboeenMX_kmh,Windrichtung,UV-Index
attr ESPEasy_Wetterstation group ESPEasy Device
attr ESPEasy_Wetterstation presenceCheck 1
attr ESPEasy_Wetterstation readingSwitchText 1
attr ESPEasy_Wetterstation room 3.7_Umwelt,9.7_ESPEasy
attr ESPEasy_Wetterstation setState 0
attr ESPEasy_Wetterstation userReadings WindgeschwindigkeitAV_kmh:Windgeschwindigkeit_ms.* {sprintf("%.1f", ((movingAverageMax("ESPEasy_Wetterstation","Windgeschwindigkeit_ms",1800,"average")))*3.6)},\
WindrichtungAV:Windrichtung.* {sprintf("%.0f", movingAverageMax("ESPEasy_Wetterstation","Windrichtung",1800,"average"))},\
WindrichtungKompass:Windrichtung.* {\
if(ReadingsVal("ESPEasy_Wetterstation","WindgeschwindigkeitAV_kmh",0) > 0)\
{\
  Twilight_CompassPoint(ReadingsVal("ESPEasy_Wetterstation","WindrichtungAV",0));;\
}\
},\
WindboeenMX_kmh:Windboeen_ms.* {sprintf("%.1f",movingAverageMax("ESPEasy_Wetterstation","Windboeen_ms",300,"max")*3.6)}\

attr ESPEasy_Wetterstation verbose 3

setstate ESPEasy_Wetterstation opened
setstate ESPEasy_Wetterstation 2017-09-09 09:03:06 Batterie 0
setstate ESPEasy_Wetterstation 2017-09-09 09:03:05 Blitze_5min 0
setstate ESPEasy_Wetterstation 2017-09-09 09:03:05 Blitze_Total 1190
setstate ESPEasy_Wetterstation 2017-09-09 09:03:05 Entfernung_km -1
setstate ESPEasy_Wetterstation 2017-09-09 09:03:01 Feuchtigkeit 65
setstate ESPEasy_Wetterstation 2017-09-09 08:59:10 FeuchtigkeitBME 40.1
setstate ESPEasy_Wetterstation 2017-09-09 08:54:11 Load 20
setstate ESPEasy_Wetterstation 2017-09-09 08:59:10 LuftdruckBME 1000
setstate ESPEasy_Wetterstation 2017-09-09 08:54:03 RSSI -67
setstate ESPEasy_Wetterstation 2017-09-09 09:03:03 RegenTotal_mm 260.8
setstate ESPEasy_Wetterstation 2017-09-09 09:03:03 Regen_mmh 0.0
setstate ESPEasy_Wetterstation 2017-09-09 08:54:14 Taupunkt 8.2
setstate ESPEasy_Wetterstation 2017-09-09 09:03:01 Temperatur 15.0
setstate ESPEasy_Wetterstation 2017-09-09 08:59:10 TemperaturBME 28.1
setstate ESPEasy_Wetterstation 2017-09-09 09:03:04 UV-Index 0.1
setstate ESPEasy_Wetterstation 2017-09-09 08:53:31 Uptime 39887
setstate ESPEasy_Wetterstation 2017-09-09 08:54:08 Voltage 2.8
setstate ESPEasy_Wetterstation 2017-09-09 09:03:02 WindboeenMX_kmh 8.6
setstate ESPEasy_Wetterstation 2017-09-09 09:03:02 Windboeen_ms 2.4
setstate ESPEasy_Wetterstation 2017-09-09 09:01:29 WindgeschwindigkeitAV_kmh 3.2
setstate ESPEasy_Wetterstation 2017-09-09 09:03:02 Windgeschwindigkeit_ms 0.2
setstate ESPEasy_Wetterstation 2017-09-09 09:03:02 Windrichtung 202.5
setstate ESPEasy_Wetterstation 2017-09-09 09:01:29 WindrichtungAV 236
setstate ESPEasy_Wetterstation 2017-09-09 09:01:29 WindrichtungKompass SW
setstate ESPEasy_Wetterstation 2017-09-09 09:00:47 presence present
setstate ESPEasy_Wetterstation 2017-08-31 18:22:10 state opened



Ich habe die Funktion movingAverage nur umbenannt und diese um einen Parameter (average/max) erweitert. Die gleiche Funktion ist auch ideal um aus den im Array enthaltenen Daten nicht nur den Gleitenden Mittelwert zu berechnen sondern auch den Maximalwert in einem Zeitabschnitt.

Nachtrag:
Die Funktion hat Prof. Dr. Peter Henning geschrieben.
Grüße aus Dewitz

VM auf Synology DS718+ mit FHEM 5.9 auf Debian 9.5/32-Bit (stretch)
Nächster Leipziger Stammtisch:

dirk.k

Hallo Frank,
könntest du deine Anpassung für den Parameter "average/max" verraten?
Ich benötige gerade den max-Wert der letzten 3 Stunden ...

Danke

majorshark

#10
Mach ich. Habe gerade kein Zugriff auf meine Installation. Morgen poste ich die geänderte Funktion.
Grüße


Edit:
Anbei die erweiterte Funktion


###############################################################################
#
#  Moving average oder moving max
#
#  Aufruf: movingAverage(devicename,readingname,zeitspanne in s,<average/max>)
#
###############################################################################

sub movingAverageMax($$$$) {
   my ($name,$reading,$avtime,$funktion) = @_;
   my $hash = $defs{$name};
   my @new = my ($val,$time) = ($hash->{READINGS}{$reading}{VAL},$hash->{READINGS}{$reading}{TIME});
   my ($cyear, $cmonth, $cday, $chour, $cmin, $csec) = $time =~ /(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+)/;
   my $ctime = $csec+60*$cmin+3600*$chour;
   my $num;
   my $arr;
   #-- initialize if requested
   if( ($avtime eq "-1") )
   {
     $hash->{READINGS}{$reading}{"history"}=undef;
   }
   #-- test for existence
   if( !$hash->{READINGS}{$reading}{"history"})
   {
      #Log 1,"ARRAY CREATED";
      push(@{$hash->{READINGS}{$reading}{"history"}},\@new);
      $num = 1;
      $arr=\@{$hash->{READINGS}{$reading}{"history"}};
   }
   else
   {
      $num = int(@{$hash->{READINGS}{$reading}{"history"}});
      $arr=\@{$hash->{READINGS}{$reading}{"history"}};
      my $starttime = $arr->[0][1];
      my ($syear, $smonth, $sday, $shour, $smin, $ssec) = $starttime =~ /(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+)/;
      my $stime = $ssec+60*$smin+3600*$shour;
      #-- correct for daybreak
      $stime-=86400
        if( $stime > $ctime);
      if( ($num < 25)&&( ($ctime-$stime)<$avtime) )
  {
    #Log 1,"ARRAY has $num elements, adding another one";
        push(@{$hash->{READINGS}{$reading}{"history"}},\@new);
      }
  else
  {
        shift(@{$hash->{READINGS}{$reading}{"history"}});
        push(@{$hash->{READINGS}{$reading}{"history"}},\@new);
      }
    }
    #-- output and average
    if($funktion eq "average")
{
my $average = 0;
    for(my $i=0;$i<$num;$i++)
{
      $average+=$arr->[$i][0];
      Log 4,"[$name $reading movingAverage] Value = ".$arr->[$i][0]." Time = ".$arr->[$i][1];
    }
    $average=sprintf( "%5.3f", $average/$num);
    #--average
    Log 4,"[$name $reading movingAverage] calculated over $num values is $average"; 
    return $average;
}
elsif($funktion eq "max")
{
my $max = 0;
    for(my $i=0;$i<$num;$i++)
{
      $max=$arr->[$i][0] if($max<$arr->[$i][0]);
      Log 4,"[$name $reading movingMax] Value = ".$arr->[$i][0]." Time = ".$arr->[$i][1];
    }
    $max=sprintf( "%5.3f", $max);
    #--max
    Log 4,"[$name $reading movingMax] max value over $num values is $max"; 
    return $max;
}
}


Wird dann zum Beispiel so benutzt
WindboeenMX_kmh:Windboeen_ms.* {sprintf("%.1f",movingAverageMax("ESPEasy_Wetterstation","Windboeen_ms",300,"max")*3.6)}
Grüße aus Dewitz

VM auf Synology DS718+ mit FHEM 5.9 auf Debian 9.5/32-Bit (stretch)
Nächster Leipziger Stammtisch: