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
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
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
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
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
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 :)
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
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
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
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.
ZitatIch denke deine pauschale Aussage kann man so auch gar nicht treffen
Aber doch.
LG
pah