Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Node-Red
  5. Zählerstand vorheriger Wert (previous)

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    17
    1
    630

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    5.6k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.5k

Zählerstand vorheriger Wert (previous)

Scheduled Pinned Locked Moved Node-Red
10 Posts 3 Posters 989 Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Offline
    L Offline
    LangeWiese82
    wrote on last edited by
    #1

    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??

    arteckA 1 Reply Last reply
    0
    • L LangeWiese82

      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??

      arteckA Offline
      arteckA Offline
      arteck
      Developer Most Active
      wrote on last edited by
      #2

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

      zigbee hab ich, zwave auch, nuc's genauso und HA auch

      L 1 Reply Last reply
      0
      • arteckA arteck

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

        L Offline
        L Offline
        LangeWiese82
        wrote on last edited by
        #3

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

        mickymM 1 Reply Last reply
        0
        • L LangeWiese82

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

          mickymM Online
          mickymM Online
          mickym
          Most Active
          wrote on last edited by mickym
          #4

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

          Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

          L 1 Reply Last reply
          0
          • mickymM mickym

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

            L Offline
            L Offline
            LangeWiese82
            wrote on last edited by
            #5

            @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

            mickymM 1 Reply Last reply
            0
            • L LangeWiese82

              @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

              mickymM Online
              mickymM Online
              mickym
              Most Active
              wrote on last edited by
              #6

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

              Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

              L 1 Reply Last reply
              0
              • mickymM mickym

                @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 Offline
                L Offline
                LangeWiese82
                wrote on last edited by
                #7

                @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

                mickymM 1 Reply Last reply
                0
                • L LangeWiese82

                  @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

                  mickymM Online
                  mickymM Online
                  mickym
                  Most Active
                  wrote on last edited by mickym
                  #8

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

                  Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                  1 Reply Last reply
                  0
                  • mickymM Online
                    mickymM Online
                    mickym
                    Most Active
                    wrote on last edited by
                    #9

                    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;
                    
                    

                    Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                    L 1 Reply Last reply
                    0
                    • mickymM mickym

                      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 Offline
                      L Offline
                      LangeWiese82
                      wrote on last edited by
                      #10

                      @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
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      655

                      Online

                      32.7k

                      Users

                      82.6k

                      Topics

                      1.3m

                      Posts
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Home
                      • Recent
                      • Tags
                      • Unread 0
                      • Categories
                      • Unreplied
                      • Popular
                      • GitHub
                      • Docu
                      • Hilfe