Hauptmenü

Probleme mit movingAverage

Begonnen von FEHMPiDi, 07 Juli 2018, 20:59:16

Vorheriges Thema - Nächstes Thema

FEHMPiDi

Hallo,

ich habe ein Problem mit der moving Average Funktion. Wenn ich das aus dem Wiki richtig verstanden habe sollte das Userreading bei mir so aussehen:

attr Temp_Garden_wh userReadings mittelwert_bl {movingAverage("Temp_Garden_wh","temperature",300)}

Es sollte also alle 5min ein Mittelwert zurückgegeben werden. Das Reading temperature wird bei mir alle 60s aktualisiert.

Hier das listing von meinem Device:

Internals:
   ALARM      1
   ASYNC      0
   CHANGED   
   DEF        28.4F6785040000 60
   ERRCOUNT   0
   INTERVAL   60
   IODev      RaPi_Garden_myOWServer
   NAME       Temp_Garden_wh
   NOTIFYDEV  global
   NR         86
   NTFY_ORDER 50-Temp_Garden_wh
   OW_FAMILY  28
   OW_ID      4F6785040000
   PRESENT    1
   ROM_ID     28.4F6785040000.C9
   STATE      T: 21.00 °C ↑
   TYPE       OWTHERM
   owg_cf     10
   owg_temp   21
   owg_th     5
   owg_tl     0
   OLDREADINGS:
   READINGS:
     2018-07-07 20:48:28   mittelwert_bl   7.650
     2018-07-07 20:48:28   state           T: 21.00 °C ↑
     2018-07-07 20:48:28   temperature     21
   helper:
     history:
       ARRAY(0x236eab8)
       ARRAY(0x236c4c8)
       ARRAY(0x2383e80)
       ARRAY(0x23fee60)
       ARRAY(0x24000b0)
       ARRAY(0x2431748)
       ARRAY(0x19d1e10)
       ARRAY(0x2384528)
       ARRAY(0x24350d8)
       ARRAY(0x236cb40)
       ARRAY(0x1d71298)
       ARRAY(0x22758b0)
       ARRAY(0x22758c8)
       ARRAY(0x162be48)
       ARRAY(0x22f0700)
       ARRAY(0x188ba48)
       ARRAY(0x236c5d0)
       ARRAY(0x1e8ba28)
       ARRAY(0x236ea70)
       ARRAY(0x236de50)
       ARRAY(0x2383e68)
       ARRAY(0x236c3d8)
       ARRAY(0x236ddd8)
       ARRAY(0x23846f8)
       ARRAY(0x2383cb8)
   tempf:
     factor     1
     offset     0
Attributes:
   IODev      RaPi_Garden_myOWServer
   event-on-change-reading temperature
   group      Temperatur
   icon       temp_temperature
   interval   60
   model      DS18B20
   resolution 10
   room       Garten
   tempConv   onread
   tempHigh   5
   tempLow    0
   userReadings mittelwert_bl {movingAverage("Temp_Garden_wh","temperature",300)}
   verbose    5


Das Userreading wird aber immer aktualisiert wenn das reading temperature aktualisiert wird, und nicht alle 5min. Der Wert der dann zurückkommt, ist auch alles andere als ein sinnvoller Mittelwert. Es fing mit 0 an, und steigt kontinuierlich. Jetzt, nach ca. 10min, ist er bei 11,7. Die Temperatur beträgt aber 20°.

Kann jemand meinen Fehler entdecken und mir helfen. Ich komme nämlich nicht weiter.

Danke schon mal
FHEM5.7@RaspPi.3|NanoCUL868-HM|NanoCUL868-Max|SDuino|DS18B20|1xHM-Sen-MDIR-WM55|   
2xHM-LC-Sw1PBU-FM|HM-LC-SW4-DR|I2C_MCP23017|2xMAX-ShutterContact|11xHM-LC-Bl1PBU-FM|CTW600|VCONTROL|1xHM-Sen-MDIR-O|2xMilight

MadMax-FHEM

Ich hab jetzt die Funktion aus dem Wiki nicht genau durch...
...aber: das userReadings wird aktualisiert, wenn sich eben der Wert im Gerät ändert und nicht alle 5min.
Das war nur im Wiki-Beispiel, weil sich eben da der "pressure" Wert alle 5min ändert und somit das userReadings neu ermittelt wird...

Sollte bei dir dann alle 60sec erfolgen...

Evtl. muss da was in der Funktion angepasst werden oder beim Parameter des Aufrufs...
Wie geschrieben: hab jetzt die Funktion nicht im Detail angeschaut...

Hilfreich auch immer ein list des Gerätes posten...

Kurz, da nur Handy grad...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

FEHMPiDi

Hallo,

Das list vom Gerät habe ich doch in meinem Beitrag, oder welches Listing brauchst du?

Ich habe das Wiki so verstanden das man mit dem letzten Wert beim userreading den Zeitintervall übergibt für den der Mittelwert gebildet werden soll. Bei mir sind das 5min (300s).
Ich bin jetzt davon ausgegangen das ich dann auch alle 300s  einen neuen Mittelwert bekomme. Vielleicht habe ich aber auch die ganze Funktion noch nicht richtig verstanden.
Kann mich da bitte jemand mal aufklären.

Danke
FHEM5.7@RaspPi.3|NanoCUL868-HM|NanoCUL868-Max|SDuino|DS18B20|1xHM-Sen-MDIR-WM55|   
2xHM-LC-Sw1PBU-FM|HM-LC-SW4-DR|I2C_MCP23017|2xMAX-ShutterContact|11xHM-LC-Bl1PBU-FM|CTW600|VCONTROL|1xHM-Sen-MDIR-O|2xMilight

Otto123

Hi,
Ich verstehe es so wie Joachim.

Aber Du bekommst nicht, wie Du annimmst alle 5 min einen neuen Wert, sondern Deine Werte werden über 5 min gemittelt.

Die Funktion bildet dabei ein Array und schiebt dort jeden neuen Wert (bei Dir jede minute) hinein und berechnet den Mittelwert über alle Elemente im Array.

Jetzt könnte es in Abhängigkeit vom Start zu eigenartigen Werten kommen. Aber spätestens nach 5 Werten ist in Deinem Fall das Array einmal durchlaufen. Zumindest verstehe ich das so.

Ich habe das analog dem Wiki und deinem Beispiel bei mir gerade getestet: Funktioniert einwandfrei!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Prof. Dr. Peter Henning

Als Ersteller der subroutine darf ich sagen: MadMax und Otto haben es verstanden. Und natürlich steigt der gleitende Mittelwert von Null an, bis Messwerte über 5 Minuten gesammelt worden sind...


LG

pah

Otto123

Ich war erstaunt, ich habe das manuell mit einem Dummy getestet und manuell Werte gesetzt
20 -> Mittelwert 20
21 -> Mittelwert 20
22 -> Mittelwert 20.5

Also bei mir fing es sogar beim ersten Wert an. Ich hätte auch vermutet es geht irgendwie bei null los, aber es ging beim Startwert los :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Prof. Dr. Peter Henning

Der Dummy hat aber von Anfang an einen Wert - was bei Readings in der Regel nicht der Fall ist, das Anfangsreading ist i.d.R. Null. Die extrem primitive Funktion "movingAverage" summiert nur die Messwerte, die innerhalb des vorgegebenen Zeitintervalls liegen und teil diese Summe durch die Anzahl der Messwerte. Wenn also - wie im oben beschriebenen Anwendungsfall - der erste Eintrag in dem history-hash Null ist, wächst der gleitende Mittelwert über dieses Zeitintervall an.

Also: Kein Widerspruch.

Könnte man natürlich alles innerhalb einer weniger primitiven Funktion abfangen - aber für meine Zwecke (=Glättung der Windgeschwindigkeit) reicht diese seit Jahren wunderbar aus.

LG

pah

FEHMPiDi

Hallo,

danke für Eure Antworten. Ich denke jetzt habe ich es auch verstanden. Ich bin eben davon ausgegangen das ich alle 5min einen neuen Mittelwert der letzten 5min. bekomme.

Wie könnte man es denn machen das man alle 5min. einen Mittelwert bildet. Kann man das über Oldreadings mit einem DOIF hinbekommen?

Danke
FHEM5.7@RaspPi.3|NanoCUL868-HM|NanoCUL868-Max|SDuino|DS18B20|1xHM-Sen-MDIR-WM55|   
2xHM-LC-Sw1PBU-FM|HM-LC-SW4-DR|I2C_MCP23017|2xMAX-ShutterContact|11xHM-LC-Bl1PBU-FM|CTW600|VCONTROL|1xHM-Sen-MDIR-O|2xMilight

Prof. Dr. Peter Henning

ZitatIch bin eben davon ausgegangen das ich alle 5min einen neuen Mittelwert der letzten 5min. bekomme.
Das ist nicht die Definition eines gleitenden Mittelwertes. Der heißt nämlich deshalb gleitend, weil er ein Zeitfenster (z.B. 5 Minuten) über die Messwerte gleiten lässt. Auch wenn diese z.B. alle 10 Sekunden eintrudeln.

ZitatIch denke jetzt habe ich es auch verstanden
Glaube ich eher nicht. Denn
Zitatalle 5min einen neuen Mittelwert der letzten 5min
hat keinen tieferen Sinn. Man könnte dafür auch das Messintervall auf 5 Minuten setzen.

LG

pah




FEHMPiDi

Danke für deine Erklärung.

ZitatDas ist nicht die Definition eines gleitenden Mittelwertes. Der heißt nämlich deshalb gleitend, weil er ein Zeitfenster (z.B. 5 Minuten) über die Messwerte gleiten lässt. Auch wenn diese z.B. alle 10 Sekunden eintrudeln.

Danke, habe ich jetzt verstanden, sagte ich ja bereits.

ZitatGlaube ich eher nicht. Denn
Zitat
alle 5min einen neuen Mittelwert der letzten 5min
hat keinen tieferen Sinn. Man könnte dafür auch das Messintervall auf 5 Minuten setzen.

Hm, sehe ich nicht so. Bei mir schwanken die Messwerte sehr stark um einen Mittelwert. Um die Schwankungen etwas abzuschwächen möchte ich eben den Mittelwert haben. Ich sehe also für meine Anwendung keinen Sinn darin nur alle 5min einen Messwert zu bekommen. Ich denke deine pauschale Aussage kann man so auch gar nicht treffen wenn man die Anwendung dahinter nicht kennt. Aber trotzdem Danke für Deinen Lösungsvorschlag.
FHEM5.7@RaspPi.3|NanoCUL868-HM|NanoCUL868-Max|SDuino|DS18B20|1xHM-Sen-MDIR-WM55|   
2xHM-LC-Sw1PBU-FM|HM-LC-SW4-DR|I2C_MCP23017|2xMAX-ShutterContact|11xHM-LC-Bl1PBU-FM|CTW600|VCONTROL|1xHM-Sen-MDIR-O|2xMilight

Prof. Dr. Peter Henning

ZitatIch denke deine pauschale Aussage kann man so auch gar nicht treffen
Aber doch.

LG

pah