Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Node-Red
    5. Zählerstand vorheriger Wert (previous)

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Zählerstand vorheriger Wert (previous)

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

      Hallo zusammen,

      ich bekomme von meinem Modbuszähler alle 10 Sekunden einen neuen Float Wert. Mich interessiert aber nicht der Zählerstand, sondern die Differenz zum Vorgängerwert. Daher bin ich auf diesen älteren Beitrag gestoßen, wo mit dem context gearbeitet wird. Ist das der richtige Ansatz ?

      Grüße

      Re: Wert und vorheriger wert??

      arteck 1 Reply Last reply Reply Quote 0
      • arteck
        arteck Developer Most Active @LangeWiese82 last edited by

        @langewiese82 merk dir den Wert doch bei änderung im anderen Datenpunkt

        L 1 Reply Last reply Reply Quote 0
        • L
          LangeWiese82 @arteck last edited by

          @arteck hatte ich auch dran gedacht, also quasi wie in C in einer variable speichern. Aber in Node Red wüsste ich gerade nicht, wie ich das umsetze ?

          mickym 1 Reply Last reply Reply Quote 0
          • mickym
            mickym Most Active @LangeWiese82 last edited by mickym

            @langewiese82 ja das ist der richtige Ansatz - entweder über Flow-Variablen oder den Node-Kontext bei function Nodes

            L 1 Reply Last reply Reply Quote 0
            • L
              LangeWiese82 @mickym last edited by

              @mickym momentan habe ich es folgendermaßen umgesetzt, aber da ist noch der Wurm drin .... nach ein paar Durchläufen wiederholen sich die Werte immer wieder. Der Sinn von dem Ganzen soll ja sein, in erster Linie die Wertänderung festzustellen. Diese wird dann später mal auf einen festen abgelesenen Zählerwert des EVUs addiert.

              var vorherigerWert = context.get('previous') || 0;
              context.set('previous', msg.payload);
              msg.previous = vorherigerWert;
              msg.payload=msg.payload-msg.previous;
              return msg;

              Info: msg.payload ist der float wert, welcher alle 10 Sekunden vom Buffer parser rüberkommtScreenshot.jpg

              mickym 1 Reply Last reply Reply Quote 0
              • mickym
                mickym Most Active @LangeWiese82 last edited by

                @langewiese82 Ehrlich gesagt kann ich keinen Fehler entdecken. Zur Interpretation der Zahlen kann ich nichts sagen. Du siehst doch selbst - da Du Dir ja beides ausgeben lässt, ob die Logik stimmt. Gerechnet werden kann ja nur mit den Zahlen, die Du eingibst. - Also an der Logik kann ich auf den ersten Blick nichts entdecken.

                L 1 Reply Last reply Reply Quote 0
                • L
                  LangeWiese82 @mickym last edited by

                  @mickym Hallo, ich hab jetzt noch ein bisschen recherchiert und diverse Ansätze probiert und am weitesten komme ich mit der function node. Allerdings fällt mir auf, dass die Werte meiner Subtraktion sich wiederholen und das kann ja eigentlich nicht sein ? (siehe jpg.1 und jpg.3). Meine function Node ist folgendermaßen aufgebaut:

                  var alterWert = flow.get("vorgaenger") || 0;
                  flow.set("vorgaenger", msg.payload);
                  msg.vorgaenger = alterWert;
                  msg.payload = msg.payload - msg.vorgaenger;
                  return msg;

                  Das ist doch noch irgendwo ein Fehler .... ???

                  1.jpg

                  2.jpg

                  3.jpg

                  mickym 1 Reply Last reply Reply Quote 0
                  • mickym
                    mickym Most Active @LangeWiese82 last edited by mickym

                    @langewiese82 sagte in Zählerstand vorheriger Wert (previous):

                    var alterWert = flow.get("vorgaenger") || 0;
                    flow.set("vorgaenger", msg.payload);
                    msg.vorgaenger = alterWert;
                    msg.payload = msg.payload - msg.vorgaenger;
                    return msg;

                    Bei einer function Node kannst Du das auch im context speichern - musst nicht im Flow speichern. Das Ganze kann ich nicht ganz beurteilen, weil ich ja nicht weiß, was die Eingabe ist, ausser Du setzt den value als neue payload. Testen kannst Du Deine Funktion aber doch am Besten selbst.

                    Warum soll sich das Ganze denn nicht wiederholen können. Wenn Du 2 mal den gleichen Wert eingibst kommt auch immer die 0 raus. Du kannst ja mal eine Warnung direkt die Eingabe mit im debug-Fenster ausgeben:

                    node.warn(msg.payload);
                    var alterWert = context.get("vorgaenger") || 0;
                    context.set("vorgaenger", msg.payload);
                    msg.vorgaenger = alterWert;
                    msg.payload = msg.payload - msg.vorgaenger;
                    return msg;
                    

                    und ich nutze einfache Zahlen, um das nachzuvollziehen:

                    2e6488bd-0fd7-4c3e-ac8f-f89fd7ec5223-image.png

                    Also 2,5,14. Damit ich sehe was ich gedrückt habe, lasse ich in einer Warnung immer die Eingangspayload ausgeben.

                    Am Anfang gebe ich also 3 mal die 2 ein:

                    64a5d14e-40e8-403d-bcb1-cb30195ff83d-image.png

                    In der neuen payload gibst du ja die Differenz zur alten payload aus und in vorgaenger den vorherigen Wert.

                    Beim erstem Mal 2 drücken, kommt also 2 (die neue Differenz zu 0 als vorgaenger raus).
                    Beim zweiten und dritten Mal 2 drücken kommt immer 0 raus, da die Differenz zum Vorgänger ist ja 2 immer 0 ist.

                    9c032fb3-c5c5-4fef-bac3-49c4d31bd52e-image.png

                    Dann drücke ich eine 5 und die payload ist eine 3 also die Differenz zwischen 5-2 und im vorgänger stand ja die 2 drin. Also ist das doch richtig.

                    Dann drücke ich die 14 und es kommt richtig die Differenz 9 raus (14-5) und im Vorgänger stand die 5.

                    Drücke ich dann wieder die 2, kommt -12 raus.

                    ALSO: Wenn eine Funktion so erst mal korrekt arbeitet, liegt es doch nicht an Deiner Funktion sondern an Deinen Eingabewerten

                    Ich habe es mal mit dem mittleren Wert auch getestet:

                    194a1932-af05-47e7-ac85-1126fbc22c2c-image.png

                    Dabei ist lediglich die 375 am Ende dazugedichtet. Das ist aber ein Problem von Javascript generell, dass die Genauigkeit hier nicht stimmt. Das korrekte Ergebnis beim manuellen Nachrechnen ist:

                    0.00600433349609
                    

                    ggf musst Du halt in Integer umwandeln - wobei ich wie gesagt glaube, dass Du ein Problem mit Deiner Eingabe hast, die Werte stimmen, wenn Du msg.specification.value als neue msg.payload einspeist:

                    Nehme ich Deinen 1. Screenshot:
                    e7473720-a4b5-4fdb-ab8d-964f81c32473-image.png

                    baf7ab23-dff7-4210-be83-72673e9d90ce-image.png

                    Nehme ich Deinen 3. Screenshot:

                    120fb78d-a986-4604-a99a-4ca985d20595-image.png

                    b7c86f83-a984-4767-9fca-64d5e7fd575f-image.png

                    Wenn Du diese Rundungsfehler bei JS vermeiden willst, musst Du halt mit Integern rechnen, aber insgesamt stimmt das alles:

                    msg.payload *= 100000000000000;
                    node.warn(msg.payload);
                    var alterWert = context.get("vorgaenger") || 0;
                    context.set("vorgaenger", msg.payload);
                    msg.vorgaenger = alterWert;
                    msg.payload = (msg.payload - msg.vorgaenger) / 100000000000000;
                    return msg;
                    
                    
                    1 Reply Last reply Reply Quote 0
                    • mickym
                      mickym Most Active last edited by

                      Wenn Du von diesen Rundungsfehlern wegkommen willst, wobei ich denke nicht, dass das Dein Problem ist:

                      031bff75-90b5-496b-bd91-f6bccb0c6f1a-image.png

                      Dann kannst Du auch mit BigInt arbeiten:

                      c6d1e25a-9b0d-404b-8f02-c2356fee5dcb-image.png

                      Das passt lt. Rechner:
                      e44d70ec-c832-4e0e-a793-8cdf1a780fe3-image.png

                      msg.payload = BigInt(msg.payload * 100000000000000);
                      node.warn(msg.payload);
                      var alterWert = BigInt(context.get("vorgaenger") || 0);
                      context.set("vorgaenger", msg.payload);
                      msg.vorgaenger = alterWert;
                      msg.payload = Number(msg.payload - msg.vorgaenger) / 100000000000000;
                      return msg;
                      
                      
                      L 1 Reply Last reply Reply Quote 0
                      • L
                        LangeWiese82 @mickym last edited by

                        @mickym Wow !!! was eine Antwort, das schaue ich mir mal in Ruhe genau an … Rundungsfehler hatte ich auch schon im Verdacht … Danke für deine Mühe … ich werde berichten

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        989
                        Online

                        31.7k
                        Users

                        79.7k
                        Topics

                        1.3m
                        Posts

                        3
                        10
                        605
                        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