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. JSON Input in Datei ergänzen

    NEWS

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    JSON Input in Datei ergänzen

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

      Hallo,

      ich habe folgenden Node-Red Flow:

      [
          {
              "id": "9e75046f5f1c0aa5",
              "type": "tab",
              "label": "Flow 3",
              "disabled": false,
              "info": "",
              "env": []
          },
          {
              "id": "310ce090fd60a3ad",
              "type": "file",
              "z": "9e75046f5f1c0aa5",
              "name": "",
              "filename": "D:/NodeRed/Werte.json",
              "filenameType": "str",
              "appendNewline": false,
              "createDir": false,
              "overwriteFile": "true",
              "encoding": "utf8",
              "x": 1070,
              "y": 240,
              "wires": [
                  [
                      "47176142f051ed11"
                  ]
              ]
          },
          {
              "id": "d7de8e19954f4b8f",
              "type": "file in",
              "z": "9e75046f5f1c0aa5",
              "name": "",
              "filename": "D:/NodeRed/Werte.json",
              "filenameType": "str",
              "format": "utf8",
              "chunk": false,
              "sendError": false,
              "encoding": "utf8",
              "allProps": false,
              "x": 570,
              "y": 240,
              "wires": [
                  [
                      "69e0138d6ef4b446"
                  ]
              ]
          },
          {
              "id": "47176142f051ed11",
              "type": "debug",
              "z": "9e75046f5f1c0aa5",
              "name": "debug 35",
              "active": true,
              "tosidebar": true,
              "console": false,
              "tostatus": false,
              "complete": "false",
              "statusVal": "",
              "statusType": "auto",
              "x": 1320,
              "y": 240,
              "wires": []
          },
          {
              "id": "250cb94b595edf29",
              "type": "inject",
              "z": "9e75046f5f1c0aa5",
              "name": "",
              "props": [
                  {
                      "p": "payload"
                  },
                  {
                      "p": "topic",
                      "vt": "str"
                  }
              ],
              "repeat": "",
              "crontab": "",
              "once": false,
              "onceDelay": 0.1,
              "topic": "",
              "payload": "{\"Wert1\":\"B\",\"Wert2\":\"Test\"}",
              "payloadType": "str",
              "x": 330,
              "y": 240,
              "wires": [
                  [
                      "d7de8e19954f4b8f"
                  ]
              ]
          },
          {
              "id": "69e0138d6ef4b446",
              "type": "function",
              "z": "9e75046f5f1c0aa5",
              "name": "function 3",
              "func": "\nreturn msg;",
              "outputs": 1,
              "noerr": 0,
              "initialize": "",
              "finalize": "",
              "libs": [],
              "x": 820,
              "y": 240,
              "wires": [
                  [
                      "310ce090fd60a3ad"
                  ]
              ]
          }
      ]
      

      Dabei kann zu Anfangs die Datei Werte.json eine komplett leere Datei sein. Die Funktion sollte nun die sein, dass die Datei eingelesen wird und anschließend der Input JSON der Datei hinzugefügt wird. Sollte ein weiteres Input kommen, wird er auch der Datei hinzugefügt. Am Ende soll eine gültige JSON Datei enstehen, welche wieder an einer anderen Stelle mit all den Input JSON Objekten eingelesen werden kann.

      Wie sieht dazu die Funktion aus?

      Ich habe dazu auch mal folgende Function Node verwendet (zu meiner Schande hat hier auch ChatGPT mitgeholfen):

      // Neue Daten (als JSON-Objekt)
      let newData = msg.payload;
      
      // Bestehende Daten aus der Datei (falls vorhanden)
      let existingData = msg.payload || '[]'; // Falls Datei leer ist, auf leeres Array setzen
      
      // Versuche, die bestehenden Daten zu parsen
      let jsonData;
      try {
          jsonData = JSON.parse(existingData);
          if (!Array.isArray(jsonData)) {
              // Falls die Datei kein Array ist, setzen wir es auf ein leeres Array
              jsonData = [];
          }
      } catch (error) {
          // Falls die Datei nicht geparst werden kann (z.B. leer oder ungültig), setzen wir auf ein leeres Array
          jsonData = [];
      }
      
      // Füge die neuen Daten dem Array hinzu
      jsonData.push(newData);
      
      // Konvertiere das Array in einen JSON-String
      msg.payload = JSON.stringify(jsonData, null, 2); // 2 für besser lesbares Format
      
      return msg;
      

      Allerdings wird dann die leere Datei nur wie folgt beschrieben:
      [
      ""
      ]

      An der Stelle weiß ich auch nicht weiter, wie ich hier vorgehen muss und wo genau der Fehler ist?
      @mickym evtl. weißt du oder jemand anders hier rat :)?

      Vielen Dank

      1 Reply Last reply Reply Quote 0
      • OliverIO
        OliverIO last edited by OliverIO

        @_r_a_l_f_
        so ganz logisch ist die Funktion nicht.
        du bekommst den payload und speicherst ihn in newdata.
        Dann nimmst du wieder den payload und speicherst ihn in existingData.
        Dann prüfst du ob existingData leer ist und initialisiert es als Array.
        Dann fügst du dann newData hinzu.
        um das Ergebnis zu erhalten, dass du zeigst, müsste newData einen leeren String enthalten.

        wo sollte deiner Meinung nach exustingData herkommen?

        _ 1 Reply Last reply Reply Quote 1
        • _
          _R_A_L_F_ @OliverIO last edited by

          @oliverio ja manchmal sieht man wirklich den Wald vor lauter Bäumen nicht und ja, genau das ist das eigentlich Problem. Ich lese eine leere Datei ein und zusätzlich die neuen Daten. Jedoch werden die neuen Daten nie an die Function übergeben. Somit werden dadurch natürlich auch keine neuen Datensätze eingefügt 😄

          Ich hab jetzt vor dem Input und dem Fileinput eine join Node gepackt und den Code in der Function Node wie folgt abgeändert und jetzt klappt es (welch Wunder) auch :D:

          Aber Danke für den Hinweis 😉

          Hier noch der korrigierte Code der Function Node

          // Bestehende Daten aus der Datei
          let existingData = msg.payload.file;
          
          // Neue Daten vom HTTP Request
          let newData = msg.payload.feedback;
          
          // Falls die Datei leer oder ungültig ist, setzen wir die bestehenden Daten auf ein leeres Array
          if (!existingData || existingData.trim() === "" || existingData === '""') {
              existingData = '[]';
          }
          
          // Versuche, die bestehenden Daten zu parsen
          let jsonData;
          try {
              jsonData = JSON.parse(existingData);
              if (!Array.isArray(jsonData)) {
                  // Falls die Datei kein Array ist, setzen wir es auf ein leeres Array
                  jsonData = [];
              }
          } catch (error) {
              // Falls die Datei nicht geparst werden kann (z.B. leer oder ungültig), setzen wir auf ein leeres Array
              jsonData = [];
          }
          
          // Füge die neuen Daten dem Array hinzu
          jsonData.push(newData);
          
          // Konvertiere das Array in einen JSON-String
          msg.payload = JSON.stringify(jsonData, null, 2); // 2 für besser lesbares Format
          
          return msg;
          
          OliverIO 1 Reply Last reply Reply Quote 0
          • mickym
            mickym Most Active last edited by

            Ja - der Code ist Käse - ausserdem überschreibst Du ja mit deinem Einlesen der Datei deine Daten. Ich verstehe einfach nicht, warum man immer wieder versucht zu codieren, anstatt einen Flow zu basteln. 😉

            Hier mal ein Flow - als Vorschlag.

            aff0e724-ee83-48e9-a5e7-2300cbc10037-image.png

            Ich habe den Flow mal so gebastelt, dass die vorhandene Datei NUR 1 mal eingelesen wird und bei jedem Update geschrieben wird, das vermindert diesen I/O Verkehr

            Hier der Flow:

            [
               {
                   "id": "310ce090fd60a3ad",
                   "type": "file",
                   "z": "9e75046f5f1c0aa5",
                   "name": "",
                   "filename": "/home/iobroker/Werte.json",
                   "filenameType": "str",
                   "appendNewline": false,
                   "createDir": false,
                   "overwriteFile": "true",
                   "encoding": "utf8",
                   "x": 1500,
                   "y": 220,
                   "wires": [
                       [
                           "47176142f051ed11"
                       ]
                   ]
               },
               {
                   "id": "d7de8e19954f4b8f",
                   "type": "file in",
                   "z": "9e75046f5f1c0aa5",
                   "name": "",
                   "filename": "/home/iobroker/Werte.json",
                   "filenameType": "str",
                   "format": "utf8",
                   "chunk": false,
                   "sendError": false,
                   "encoding": "utf8",
                   "allProps": false,
                   "x": 360,
                   "y": 100,
                   "wires": [
                       [
                           "985b9f9d8a707171"
                       ]
                   ]
               },
               {
                   "id": "47176142f051ed11",
                   "type": "debug",
                   "z": "9e75046f5f1c0aa5",
                   "name": "Datei schreiben",
                   "active": true,
                   "tosidebar": true,
                   "console": false,
                   "tostatus": false,
                   "complete": "payload",
                   "targetType": "msg",
                   "statusVal": "",
                   "statusType": "auto",
                   "x": 1740,
                   "y": 220,
                   "wires": []
               },
               {
                   "id": "250cb94b595edf29",
                   "type": "inject",
                   "z": "9e75046f5f1c0aa5",
                   "name": "Werte Ralf",
                   "props": [
                       {
                           "p": "payload"
                       }
                   ],
                   "repeat": "",
                   "crontab": "",
                   "once": false,
                   "onceDelay": 0.1,
                   "topic": "",
                   "payload": "{\"Wert1\":\"B\",\"Wert2\":\"Test\"}",
                   "payloadType": "json",
                   "x": 700,
                   "y": 260,
                   "wires": [
                       [
                           "63f5fd3ff51ce907"
                       ]
                   ]
               },
               {
                   "id": "76925760adc38862",
                   "type": "inject",
                   "z": "9e75046f5f1c0aa5",
                   "name": "Einmal einlesen",
                   "props": [
                       {
                           "p": "trigger",
                           "v": "true",
                           "vt": "bool"
                       }
                   ],
                   "repeat": "",
                   "crontab": "",
                   "once": true,
                   "onceDelay": 0.1,
                   "topic": "",
                   "x": 120,
                   "y": 100,
                   "wires": [
                       [
                           "d7de8e19954f4b8f"
                       ]
                   ]
               },
               {
                   "id": "876223381ca83538",
                   "type": "debug",
                   "z": "9e75046f5f1c0aa5",
                   "name": "Eingelesene Daten",
                   "active": true,
                   "tosidebar": true,
                   "console": false,
                   "tostatus": false,
                   "complete": "payload",
                   "targetType": "msg",
                   "statusVal": "",
                   "statusType": "auto",
                   "x": 910,
                   "y": 40,
                   "wires": []
               },
               {
                   "id": "373a07a7f9bdd428",
                   "type": "catch",
                   "z": "9e75046f5f1c0aa5",
                   "name": "",
                   "scope": [
                       "d7de8e19954f4b8f",
                       "985b9f9d8a707171"
                   ],
                   "uncaught": false,
                   "x": 710,
                   "y": 160,
                   "wires": [
                       [
                           "690371800bb5e2c4"
                       ]
                   ]
               },
               {
                   "id": "690371800bb5e2c4",
                   "type": "change",
                   "z": "9e75046f5f1c0aa5",
                   "name": "",
                   "rules": [
                       {
                           "t": "set",
                           "p": "Werte",
                           "pt": "flow",
                           "to": "[]",
                           "tot": "json"
                       }
                   ],
                   "action": "",
                   "property": "",
                   "from": "",
                   "to": "",
                   "reg": false,
                   "x": 900,
                   "y": 160,
                   "wires": [
                       [
                           "bbdb2e54a717ec39"
                       ]
                   ]
               },
               {
                   "id": "fc7bbb3bd59b5f87",
                   "type": "json",
                   "z": "9e75046f5f1c0aa5",
                   "name": "",
                   "property": "payload",
                   "action": "",
                   "pretty": false,
                   "x": 1290,
                   "y": 220,
                   "wires": [
                       [
                           "310ce090fd60a3ad"
                       ]
                   ]
               },
               {
                   "id": "bbdb2e54a717ec39",
                   "type": "change",
                   "z": "9e75046f5f1c0aa5",
                   "name": "",
                   "rules": [
                       {
                           "t": "set",
                           "p": "payload",
                           "pt": "msg",
                           "to": "Werte",
                           "tot": "flow"
                       }
                   ],
                   "action": "",
                   "property": "",
                   "from": "",
                   "to": "",
                   "reg": false,
                   "x": 1110,
                   "y": 220,
                   "wires": [
                       [
                           "fc7bbb3bd59b5f87"
                       ]
                   ]
               },
               {
                   "id": "985b9f9d8a707171",
                   "type": "json",
                   "z": "9e75046f5f1c0aa5",
                   "name": "",
                   "property": "payload",
                   "action": "",
                   "pretty": false,
                   "x": 570,
                   "y": 100,
                   "wires": [
                       [
                           "e4e1d6f34d886167"
                       ]
                   ]
               },
               {
                   "id": "e4e1d6f34d886167",
                   "type": "switch",
                   "z": "9e75046f5f1c0aa5",
                   "name": "",
                   "property": "payload",
                   "propertyType": "msg",
                   "rules": [
                       {
                           "t": "istype",
                           "v": "array",
                           "vt": "array"
                       },
                       {
                           "t": "else"
                       }
                   ],
                   "checkall": "true",
                   "repair": false,
                   "outputs": 2,
                   "x": 710,
                   "y": 100,
                   "wires": [
                       [
                           "876223381ca83538"
                       ],
                       [
                           "690371800bb5e2c4"
                       ]
                   ]
               },
               {
                   "id": "1121a3814a04cf18",
                   "type": "inject",
                   "z": "9e75046f5f1c0aa5",
                   "name": "Datei neuschreiben",
                   "props": [
                       {
                           "p": "payload"
                       }
                   ],
                   "repeat": "",
                   "crontab": "",
                   "once": false,
                   "onceDelay": 0.1,
                   "topic": "",
                   "payload": "Datei bitte neu einlesen!",
                   "payloadType": "str",
                   "x": 1230,
                   "y": 160,
                   "wires": [
                       [
                           "310ce090fd60a3ad"
                       ]
                   ]
               },
               {
                   "id": "63f5fd3ff51ce907",
                   "type": "change",
                   "z": "9e75046f5f1c0aa5",
                   "name": "",
                   "rules": [
                       {
                           "t": "set",
                           "p": "Werte",
                           "pt": "flow",
                           "to": "$append($flowContext(\"Werte\"), payload)\t",
                           "tot": "jsonata"
                       }
                   ],
                   "action": "",
                   "property": "",
                   "from": "",
                   "to": "",
                   "reg": false,
                   "x": 900,
                   "y": 280,
                   "wires": [
                       [
                           "bbdb2e54a717ec39"
                       ]
                   ]
               },
               {
                   "id": "8905da24f1cf2f72",
                   "type": "inject",
                   "z": "9e75046f5f1c0aa5",
                   "name": "Werte mickym",
                   "props": [
                       {
                           "p": "payload"
                       }
                   ],
                   "repeat": "",
                   "crontab": "",
                   "once": false,
                   "onceDelay": 0.1,
                   "topic": "",
                   "payload": "{\"Wert1\":\"B\",\"Timestamp\":$moment().format('DD.MM.YY - HH:mm:ss')}",
                   "payloadType": "jsonata",
                   "x": 690,
                   "y": 300,
                   "wires": [
                       [
                           "63f5fd3ff51ce907"
                       ]
                   ]
               }
            ]
            

            Die Pfade zu der Datei musst halt wieder auf Windows und Deinen Pfad anpassen.

            1 Reply Last reply Reply Quote 0
            • OliverIO
              OliverIO @_R_A_L_F_ last edited by

              @_r_a_l_f_

              Zeile 8, 9,10 kannst du dir eigentlich sparen.
              Das wird schon durch das try/catch Konstrukt erledigt.

              _ 1 Reply Last reply Reply Quote 0
              • _
                _R_A_L_F_ @OliverIO last edited by

                @oliverio sagte in JSON Input in Datei ergänzen:

                Zeile 8, 9,10 kannst du dir eigentlich sparen.

                Danke für den Tipp 🙂

                1 Reply Last reply Reply Quote 0
                • _
                  _R_A_L_F_ last edited by

                  @mickym sagte in JSON Input in Datei ergänzen:

                  Ich verstehe einfach nicht, warum man immer wieder versucht zu codieren, anstatt einen Flow zu basteln.

                  Danke dir für den Ansatz. Auf das wäre ich gar nicht gekommen, dass ich es so auch umsetzen kann. Daher leider Ansatz mit dem codieren 🤷‍♂️

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

                    @_r_a_l_f_ sagte in JSON Input in Datei ergänzen:

                    Daher leider Ansatz mit dem codieren

                    Na meine Meinung hierzu kennst Du ja. Insbesondere da der Flow nicht kompliziert ist und ich das Einlesen der Datei bei jedem Update unnötig finde, aber letztlich musst Du selbst wissen, was Dir wichtig ist. Chat GPT wird Dir in der Regel immer Code vorschlagen, da NodeRed als grafisches Tool genau das Gegenteil ist, was Chat GPT kann.

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    761
                    Online

                    31.6k
                    Users

                    79.4k
                    Topics

                    1.3m
                    Posts

                    3
                    8
                    355
                    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