Skip to content
  • 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
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Node-Red
  5. JSON Input in Datei ergänzen

NEWS

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.8k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.1k

JSON Input in Datei ergänzen

Scheduled Pinned Locked Moved Node-Red
8 Posts 3 Posters 705 Views 3 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.
  • _ Offline
    _ Offline
    _R_A_L_F_
    wrote on last edited by
    #1

    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
    0
    • OliverIOO Offline
      OliverIOO Offline
      OliverIO
      wrote on last edited by OliverIO
      #2

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

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      _ 1 Reply Last reply
      1
      • OliverIOO 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?

        _ Offline
        _ Offline
        _R_A_L_F_
        wrote on last edited by
        #3

        @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;
        
        OliverIOO 1 Reply Last reply
        0
        • mickymM Offline
          mickymM Offline
          mickym
          Most Active
          wrote on last edited by
          #4

          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.

          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
          • _ _R_A_L_F_

            @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;
            
            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            wrote on last edited by
            #5

            @_r_a_l_f_

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

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

            _ 1 Reply Last reply
            0
            • OliverIOO OliverIO

              @_r_a_l_f_

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

              _ Offline
              _ Offline
              _R_A_L_F_
              wrote on last edited by
              #6

              @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
              0
              • _ Offline
                _ Offline
                _R_A_L_F_
                wrote on last edited by
                #7

                @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 :man-shrugging:

                mickymM 1 Reply Last reply
                0
                • _ _R_A_L_F_

                  @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 :man-shrugging:

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

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

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


                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  365

                  Online

                  32.4k

                  Users

                  81.4k

                  Topics

                  1.3m

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

                  • Don't have an account? Register

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