Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Gleitender Durchschnitt mit Blockly

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Gleitender Durchschnitt mit Blockly

    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      kaybau last edited by

      Hallo,
      ich habe Dein Beispiel mal umgesetzt, um verschiedensten Messwerte zu glätten, z.b. die Windmessung
      6f9c4c8d-0c7c-417f-96ec-e45687a9f469-grafik.png

      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 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @kaybau last edited by

        @kaybau
        Besseres Beispiel.

        K 1 Reply Last reply Reply Quote 0
        • K
          kaybau @paul53 last edited by

          @paul53 : Besten Dank für das neue Beispiel. Sieht gut aus 😉

          Marius_90 1 Reply Last reply Reply Quote 0
          • Marius_90
            Marius_90 @kaybau last edited by

            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

            d5edaa58-35c0-4c10-bdc9-34869ff4254a-image.png

            Asgothian 1 Reply Last reply Reply Quote 0
            • Asgothian
              Asgothian Developer @Marius_90 last edited by Asgothian

              @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 nachvollziehbar

              Etwas 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:

              Screenshot 2021-07-12 at 16.02.09.png

              A.

              Korrektur: Fehler im screenshot.

              ChrisNett paul53 K 3 Replies Last reply Reply Quote 1
              • ChrisNett
                ChrisNett @Asgothian last edited by

                @asgothian

                Hi, kannst du das mal als export hochladen?

                Christian

                Asgothian 1 Reply Last reply Reply Quote 0
                • Asgothian
                  Asgothian Developer @ChrisNett last edited by

                  @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.

                  1 Reply Last reply Reply Quote 1
                  • paul53
                    paul53 @Asgothian last edited by paul53

                    @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".

                    S 1 Reply Last reply Reply Quote 0
                    • S
                      schweiger2 @paul53 last edited by

                      @paul53

                      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 ?

                      dc0cfb1a-587e-4ef1-95f7-f68995d48096-image.png

                      Hier die Fehlermeldungen:

                      e4589a19-b741-4679-822d-0d15752cddac-image.png

                      Was mache ich falsch ?

                      Beste Grüße
                      schweiger2

                      paul53 2 Replies Last reply Reply Quote 0
                      • paul53
                        paul53 @schweiger2 last edited by paul53

                        @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":

                        Bild_2021-07-19_134446.png

                        1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 @schweiger2 last edited by paul53

                          @schweiger2 sagte: ich erhalte Fehlermeldungen

                          Anstelle von "setze für Letzte ein" selektiere "füge als Letzte ein":

                          Bild_2021-07-19_131423.png

                          S 1 Reply Last reply Reply Quote 0
                          • S
                            schweiger2 @paul53 last edited by

                            @paul53

                            Ich habe das jetzt so gebaut (letzten 2 Zeilen unten nur als Kennzeichen für den Beginn des anderen Blocks):

                            d96193a4-265a-4e83-8046-392714c8e2f0-image.png

                            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.

                            paul53 1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 @schweiger2 last edited by paul53

                              @schweiger2 sagte: Ich habe das jetzt so gebaut

                              Den Wert, den der Trigger-Datenpunkt übergibt, magst Du wohl nicht?

                              Blockly_DP_Props.JPG

                              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.

                              S 1 Reply Last reply Reply Quote 0
                              • S
                                schweiger2 @paul53 last edited by

                                @paul53

                                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

                                2131dee1-8a27-422e-abee-b06551d76a91-image.png ,

                                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 ?

                                paul53 1 Reply Last reply Reply Quote 0
                                • paul53
                                  paul53 @schweiger2 last edited by paul53

                                  @schweiger2 sagte: oder wie meinst Du das ?

                                  Den identischen Wert wie "Wert vom Objekt WIND_SPEED" liefert die lokale Trigger-Variable Wert. Ist nur etwas eleganter (Ressourcen schonender).

                                  @schweiger2 sagte in Gleitender Durchschnitt mit Blockly:

                                  "windig" und "dunkel" NICHT wahr sind, auf Null % (=komplett zu) fahren, oder ?

                                  Wahrscheinlich würde eine Warnung oder einer Error erzeugt. Was ist "0 % = komplett zu" bei einer Markise? Voll ausgefahren?
                                  Soll die Markise nicht wieder ausfahren, wenn sich der Wind gelegt hat? Wenn doch, dann versuche es mal so:

                                  Bild_2021-07-19_150915.png

                                  S 1 Reply Last reply Reply Quote 1
                                  • S
                                    schweiger2 @paul53 last edited by

                                    @paul53

                                    ahaaa, danke, ist schon geändert.

                                    Zum "level": 0% = 0% Helligkeit = komplett herausgefahren. Ja, dies ist für mich nur eine Schutzschaltung, wenn das Schließen mal vergessen wurde; das Öffnen möchte ich manuell selbst bestimmen.

                                    paul53 1 Reply Last reply Reply Quote 0
                                    • paul53
                                      paul53 @schweiger2 last edited by

                                      @schweiger2 sagte: nur eine Schutzschaltung, wenn das Schließen mal vergessen wurde; das Öffnen möchte ich manuell selbst bestimmen.

                                      Dann mache es so (ohne Probleme mit undefined) :

                                      Bild_2021-07-19_152317.png

                                      S 1 Reply Last reply Reply Quote 1
                                      • S
                                        schweiger2 @paul53 last edited by

                                        @paul53

                                        es ist so einfach - wenn man den Wald vor lauter Bäumen sehen würde.

                                        Danke vielmals für Deine Hilfe.

                                        schweiger2

                                        1 Reply Last reply Reply Quote 0
                                        • K
                                          k_b @Asgothian last edited by

                                          @asgothian
                                          Ich hatte vor Dein Script zu nutzen und bin gleich zu Beginn daran gescheitert, dass mein JS-Adapter (5.1.3) kein Blockly-Element enthält, mit dem ich ein Element der Liste löschen könnte ("remove"/"first"):
                                          d5eae08c-469c-4d22-a21d-f95db30b69e2-grafik.png
                                          Mit dem was mir der Menüpunkt Liste anbietet, kann ich nur überschreiben:
                                          afd3bcd8-0da6-4de0-a3c8-bcafd2686458-grafik.png
                                          Das könnte ich funktional zwar durch das von vorne fortschreitende Überschreiben mit Nullen "abfangen", führt aber zu einer beständig steigenden Länge der Liste ...
                                          Hast Du einen Tipp zu meinem Problem?
                                          Schon mal danke

                                          paul53 R 2 Replies Last reply Reply Quote 0
                                          • paul53
                                            paul53 @k_b last edited by

                                            @k_b sagte: kein Blockly-Element enthält, mit dem ich ein Element der Liste löschen könnte ("remove"/"first"):

                                            Bild_2021-07-24_173201.png

                                            ChrisNett 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            920
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            blockly
                                            15
                                            67
                                            10855
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo