Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
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

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    324

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.5k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.5k

Zählerstand vorheriger Wert (previous)

Geplant Angeheftet Gesperrt Verschoben Node-Red
10 Beiträge 3 Kommentatoren 872 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • L Offline
    L Offline
    LangeWiese82
    schrieb am zuletzt editiert von
    #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 Antwort Letzte Antwort
    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
      schrieb am zuletzt editiert von
      #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 Antwort Letzte Antwort
      0
      • arteckA arteck

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

        L Offline
        L Offline
        LangeWiese82
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        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
          schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
          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
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            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
              schrieb am zuletzt editiert von
              #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 Antwort Letzte Antwort
              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
                schrieb am zuletzt editiert von
                #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 Antwort Letzte Antwort
                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
                  schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                  0
                  • mickymM Online
                    mickymM Online
                    mickym
                    Most Active
                    schrieb am zuletzt editiert von
                    #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 Antwort Letzte Antwort
                    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
                      schrieb am zuletzt editiert von
                      #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 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      538

                      Online

                      32.5k

                      Benutzer

                      81.7k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe