NEWS
Gleitender Durchschnitt mit Blockly
-
Servus Leute,
ich habe einen analogen Sensor der über ESP-Easy Mega alle 60 Sekunden einen Wert schickt. Jetzt möchte ich diesen Wert glätten. Also wäre die richtige Methode gleitender Mittelwert/Durchschnitt. Wie löse ich das mit Blockly? Irgendwie mit Listen müsste das gehen oder ?
Der analoge wert soll nur dann in den gleitenden Mittelwert einbezogen werden wenn eine Bedingung erfüllt ist......
-
-
@paul53 oder es ist an der Zeit das mir jemand JS näherbringt....... haha.
Zum Verständnis:
Ich brauche eine gewisse Anzahl an variablen im Vorfeld, die lege ich mir an sagen wir 10. Mein Skript schreibt dann alle 10 Sekunden in eine neue Variable meinen Wert. wenn diese Liste voll ist, also nach 100 Sekunden gehts weiter.... oder ?
-
Hi,
es gibt auch eine sehr einfache Möglichkeit.
z.B. Mittelwert = (Mittelwert *10+Auktualwert)/11 -
@jaenes sagte:
wenn diese Liste voll ist, also nach 100 Sekunden gehts weiter.... oder ?
Nein, bei einem gleitenden Durchschnitt wird der älteste Wert aus der Liste entfernt und der aktuelle Wert der Liste hinzugefügt (Schieberegister). Anschließend erfolgt eine Mittelwertbildung über alle Werte der Liste.
-
@jaenes Schieberegister kann man mit Blockly leider nicht realisieren, aber so sollte die gleitende Mittelwertbildung über 10 Werte funktionieren:
-
Hallo,
ich habe Dein Beispiel mal umgesetzt, um verschiedensten Messwerte zu glätten, z.b. die Windmessung
Ich bin der Meinung die Reihenfolge der Befüllung der Liste passt nicht.
Jedenfalls stimmen in meinem Beispiel die Werte nur in ca. 60% der Fälle (nach Gefühl), dann hab ich Ausreißer nach oben, die niemals dem (gleitenden) Durchschnitt entsprechen können.Hat jemand eine Idee?
<xml xmlns="http://www.w3.org/1999/xhtml"> <variables> <variable type="" id=",w^.=D}$CQ[V7pzCL72J">Liste</variable> <variable type="" id="|nsSA#%f}nMpDF9f[%s~">Index</variable> <variable type="" id="y/U;,Qb.Nr8Oo+/`~hP~">Summe</variable> <variable type="" id="hGz@,GqUkjk#,:XaV}MP">i</variable> </variables> <block type="variables_set" id="RTUA!,2m0j#}}ko7OBoB" x="-662" y="138"> <field name="VAR" id=",w^.=D}$CQ[V7pzCL72J" variabletype="">Liste</field> <value name="VALUE"> <block type="lists_repeat" id="(=LzJ5)|$oc[A);}JvJS"> <value name="NUM"> <shadow type="math_number" id="87]Qx,xmkMD!$Q@/1@;)"> <field name="NUM">10</field> </shadow> </value> <value name="ITEM"> <block type="get_value" id="3~*kY|^$rA,s(p,qczz["> <field name="ATTR">val</field> <field name="OID">javascript.0.Wetterstation.Wind</field> </block> </value> </block> </value> <next> <block type="variables_set" id="iW%C^9/JhHumbS#zg3)C"> <field name="VAR" id="|nsSA#%f}nMpDF9f[%s~" variabletype="">Index</field> <value name="VALUE"> <block type="math_number" id="AugG5vuP%[LOm2@_M+HJ"> <field name="NUM">1</field> </block> </value> <next> <block type="on_ext" id="vFE,)!c?~Z$=KJQ[l.d`"> <mutation items="1"></mutation> <field name="CONDITION">any</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="OSi=yG(ihidHOz.CC{,,"> <field name="oid">javascript.0.Wetterstation.Wind</field> </shadow> </value> <statement name="STATEMENT"> <block type="lists_setIndex" id="Ue,2EJHPrBq4j%LV^^P."> <mutation at="true"></mutation> <field name="MODE">SET</field> <field name="WHERE">FROM_START</field> <value name="LIST"> <block type="variables_get" id="9Y5|dAIiYW;jqyDV^.12"> <field name="VAR" id=",w^.=D}$CQ[V7pzCL72J" variabletype="">Liste</field> </block> </value> <value name="AT"> <block type="variables_get" id="(cD0-P+rOdV7[+VxX:;w"> <field name="VAR" id="|nsSA#%f}nMpDF9f[%s~" variabletype="">Index</field> </block> </value> <value name="TO"> <block type="get_value" id="X?~@4ti8Sr@d4P;=*/Gg"> <field name="ATTR">val</field> <field name="OID">javascript.0.Wetterstation.Wind</field> </block> </value> <next> <block type="math_change" id="iHM7|{2:7es8frET@lbV"> <field name="VAR" id="|nsSA#%f}nMpDF9f[%s~" variabletype="">Index</field> <value name="DELTA"> <shadow type="math_number" id="Op~gK+*i3yG,NxAnX#E^"> <field name="NUM">1</field> </shadow> </value> <next> <block type="controls_if" id="Ev=u_,#:ITq@sH4OiERd"> <value name="IF0"> <block type="logic_compare" id="DQ,9UZd*Y1s:1wALu{Gj"> <field name="OP">GT</field> <value name="A"> <block type="variables_get" id="#IdY8V@(1Ndfy0Oy;}O?"> <field name="VAR" id="|nsSA#%f}nMpDF9f[%s~" variabletype="">Index</field> </block> </value> <value name="B"> <block type="math_number" id="1|5;Drd+s?+T}.0{*S7U"> <field name="NUM">10</field> </block> </value> </block> </value> <statement name="DO0"> <block type="variables_set" id="!1H^6U]iK*T`dKg}_^_u"> <field name="VAR" id="|nsSA#%f}nMpDF9f[%s~" variabletype="">Index</field> <value name="VALUE"> <block type="math_number" id="8SOkC-(XJySD(`SNe`d2"> <field name="NUM">1</field> </block> </value> </block> </statement> <next> <block type="variables_set" id="Pl1+j/wdFvVs[QD$eE-X"> <field name="VAR" id="y/U;,Qb.Nr8Oo+/`~hP~" variabletype="">Summe</field> <value name="VALUE"> <block type="math_number" id="fYZ5!wFM9_*Bt#+5KLOw"> <field name="NUM">0</field> </block> </value> <next> <block type="controls_for" id="HyJ*RpPrKT@0MdcOx^^e"> <field name="VAR" id="hGz@,GqUkjk#,:XaV}MP" variabletype="">i</field> <value name="FROM"> <shadow type="math_number" id="5HJ!2;[nfS,}XAw*nUMi"> <field name="NUM">1</field> </shadow> </value> <value name="TO"> <shadow type="math_number" id="ImZnUR}.I*E/h}#.|wy4"> <field name="NUM">10</field> </shadow> </value> <value name="BY"> <shadow type="math_number" id="K`1U_LE#RLKcqF!kwOE3"> <field name="NUM">1</field> </shadow> </value> <statement name="DO"> <block type="variables_set" id="}rJ2rUz6;aDQOHmvK@Oe"> <field name="VAR" id="y/U;,Qb.Nr8Oo+/`~hP~" variabletype="">Summe</field> <value name="VALUE"> <block type="math_arithmetic" id="%Y+JtUD?c46n_[O(n`8S"> <field name="OP">ADD</field> <value name="A"> <shadow type="math_number" id="Nurdy}zCf#G45e8womn."> <field name="NUM">1</field> </shadow> <block type="variables_get" id="-A8H3G,#Tg4dBOKVy=Cv"> <field name="VAR" id="y/U;,Qb.Nr8Oo+/`~hP~" variabletype="">Summe</field> </block> </value> <value name="B"> <shadow type="math_number" id="GS5E8aL*]O^Y6JVG?9LT"> <field name="NUM">1</field> </shadow> <block type="lists_getIndex" id="1}bWK9uFo;24|WfTq*@b"> <mutation statement="false" at="true"></mutation> <field name="MODE">GET</field> <field name="WHERE">FROM_START</field> <value name="VALUE"> <block type="variables_get" id="uJ59NT:qhOr?$9ji*YM;"> <field name="VAR" id=",w^.=D}$CQ[V7pzCL72J" variabletype="">Liste</field> </block> </value> <value name="AT"> <block type="variables_get" id=":FZ]]msyos78Mjekn;Ac"> <field name="VAR" id="hGz@,GqUkjk#,:XaV}MP" variabletype="">i</field> </block> </value> </block> </value> </block> </value> </block> </statement> <next> <block type="update" id="5B:FCNmeZN+Qu{^R`z=Q"> <mutation delay_input="true"></mutation> <field name="OID">0_userdata.0.Wetter.avg-Wind</field> <field name="WITH_DELAY">TRUE</field> <field name="DELAY_MS">10</field> <field name="UNIT">sec</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="VALUE"> <block type="math_arithmetic" id="wONJ/pl_}L6Q0!xpIwS$"> <field name="OP">DIVIDE</field> <value name="A"> <shadow type="math_number" id=";%/}}]`uw?T22_tdBqT5"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="_z`SsbiwcJJ1td:gT1{["> <field name="VAR" id="y/U;,Qb.Nr8Oo+/`~hP~" variabletype="">Summe</field> </block> </value> <value name="B"> <shadow type="math_number" id=")FtUw``uljgXg$jxR@;U"> <field name="NUM">10</field> </shadow> </value> </block> </value> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </xml>
Grüße,
Kay -
-
@paul53 : Besten Dank für das neue Beispiel. Sieht gut aus
-
Ich hatte eben auch das Problem mit einem Schieberegister.
Habe es mir als Funktion mal eben selbst gebaut.Ich glätte damit meinen PH-Messwert von Pool, der sprang mir einfach zu sehr auf und ab.
Ist etwas aufwändiger, aber nachvollziehbar -
@marius-kossinna sagte in Gleitender Durchschnitt mit Blockly:
Ich glätte damit meinen PH-Messwert von Pool, der sprang mir einfach zu sehr auf und ab.
Ist etwas aufwändiger, aber nachvollziehbarEtwas aufwändiger ? Das ist ein Understatement.
- Warum nutzt du überhaupt eine Liste wenn du sowieso jede variable einzeln hältst. Du kannst doch beim Umschreiben auch gleich addieren
- 10 Variablen von Hand "schieben" ? meh.
Wenn schon Schieberegister, dann wenigstens so:
A.
Korrektur: Fehler im screenshot.
-
-
@christian-sandkaulen
Könnte ich.
Selberbauen lehrt. Also bau mal Letztendlich sollten alle Blöcke eindeutig sein. Einzig der "state value" ist kritisch - dieser stammt aus dem "trigger" Bereich und ist da mit "Objekt ID" vorgesetzt.
A.
-
@asgothian sagte: Wenn schon Schieberegister, dann wenigstens so:
Ein Trigger auf "wurde geändert" ist für einen gleitenden Durchschnitt ungeeignet, da so Werte, die längere Zeit konstant sind, untergewichtet werden.
Bei Adaptern, die zyklisch aktualisieren (pollen), kann auf "wurde aktualisiert" getriggert werden. Andernfalls muss ein Zeitplan als Trigger verwendet werden.Da nach Skriptstart die Liste erst einmal wächst, darf zur Mittelwertbildung nicht durch die Konstante 10, sondern es muss durch die Länge der Liste dividiert werden. Oder man verwendet gleich die mathematische Funktion "Mittelwert der Liste".
-
Hallo,
ich habe mir nach den angegebenen Hinweisen in diesen Thread die Steuerung gebaut, doch ich erhalte Fehlermeldungen und das Skript funktioniert nicht. Ich freue mich, wenn ihr einmal auf das Skript sehen könnt. Wo liegt der Hund begraben ?
Hier die Fehlermeldungen:
Was mache ich falsch ?
Beste Grüße
schweiger2 -
@schweiger2 sagte: Was mache ich falsch ?
Verwende für "WIND_SPEED" und "ILLUMINATION" jeweils nur einen Trigger und arbeite die Befehle dort in der richtigen Reihenfolge ab.
Für den Teil "windig":
-
@schweiger2 sagte: ich erhalte Fehlermeldungen
Anstelle von "setze für Letzte ein" selektiere "füge als Letzte ein":
-
Ich habe das jetzt so gebaut (letzten 2 Zeilen unten nur als Kennzeichen für den Beginn des anderen Blocks):
Jetzt warte ich, ob neue Fehler im Log auftreten. Die Funktion - darum geht es ja eigentlich - des Skripts sehe ich mir im Nachhinein an, wenn keine Syntax-Fehler mehr aftauchen.
Besten Dank erst einmal.
-
@schweiger2 sagte: Ich habe das jetzt so gebaut
Den Wert, den der Trigger-Datenpunkt übergibt, magst Du wohl nicht?
Zur Funktion "markise": Wenn level einmal auf 100 gesetzt wurde, bleibt er auf 100. Nach Skriptstart ist level erst einmal undefined, womit "steuere" meckern wird.
-
Hallo paul53,
sorry, den ersten Punkt kann ich fachlich nicht verstehen. Ich übergebe der Liste doch als letzten Listeneintrag den aktualisierten Wert aus dem Objekt "Wind Speed" des Wettersensors durch
,
oder wie meinst Du das ?
Im Protokoll finde ich jetzt keine errors mehr, das ist schonmal ein Teilerfolg dank Deiner Hilfe.
Zu level: verstehe ich, hoffe ich. Wenn ich "level" zu Beginn der Funktion "=0" setze, würde die Markise - wenn Sie z.B. auf 30% ausgefahren ist und "windig" und "dunkel" NICHT wahr sind, auf Null % (=komplett zu) fahren, oder ?