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

  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.2k

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

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

JSON Input in Datei ergänzen

Geplant Angeheftet Gesperrt Verschoben Node-Red
8 Beiträge 3 Kommentatoren 708 Aufrufe 3 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.
  • _ Offline
    _ Offline
    _R_A_L_F_
    schrieb am zuletzt editiert von
    #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 Antwort Letzte Antwort
    0
    • OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
      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_
        schrieb am zuletzt editiert von
        #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 :D

        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 Antwort Letzte Antwort
        0
        • mickymM Online
          mickymM Online
          mickym
          Most Active
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          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 :D

            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
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            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_
              schrieb am zuletzt editiert von
              #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 Antwort Letzte Antwort
              0
              • _ Offline
                _ Offline
                _R_A_L_F_
                schrieb am zuletzt editiert von
                #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 Antwort Letzte Antwort
                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 Online
                  mickymM Online
                  mickym
                  Most Active
                  schrieb am zuletzt editiert von
                  #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 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

                  534

                  Online

                  32.4k

                  Benutzer

                  81.4k

                  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