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. [gelöst] JSON aus verschiedenen DP (Payloads) erstellen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    [gelöst] JSON aus verschiedenen DP (Payloads) erstellen

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

      Tag,
      mein heutiges Projekt soll folgendes Ergebnis liefern:

      Ich logge meine GPS Daten vom Handy per Tasker im ioB - funktioniert blendend.
      Anhand dieser GPS-Daten lasse ich mir in NodeRed per TankerkönigNode alle Tankstellen in einem gewissen Radius auslesen - funktioniert auch !
      Jetzt möchte ich diese Tankstellen in ein JSON schreiben - soweit funktioniert dies auch...
      ABER:

      Es wird von allen Tankstellen welche sich innerhalb des Radius befinden der komplette Payload in die JSON geschrieben.
      Könnte ich zwar auch damit leben aber jetzt hab ich das "Problemchen" dass die Benzinpreise verschachtelt sind und ich damit diese in meiner VIS in einem JSON-Widget nicht anzeigen lassen kann.

      Folgende Screenshots:
      Screenshot 2022-11-01 140146.png

      Einstellungen in der letzten ChangeNode:
      Screenshot 2022-11-01 140253.png

      Und jetzt noch die DEBUG-Ausgabe:
      Screenshot 2022-11-01 140207.png

      Da muss ich sicher in der ChangeNode noch mehr konfigurieren ?!

      Falls mir da jemand helfen kann wäre ich glücklich 🙂

      Ach und falls Infos fehlen liefere ich die gerne nach.

      Merci schon mal.

      F 1 Reply Last reply Reply Quote 0
      • F
        frankyboy73 @DJMarc75 last edited by

        @djmarc75 Hi, welche Werte in welcher Form sollen denn da rauskommen?

        Hier mal ein Beispiel wo nur der Name und der Preis ausgegeben werden sollte, getrenn durch Leerzeichen. In der change Setze msg.paylaod to JSONata auswählen und dort folgendes eingeben.

        payload.stations.name & ' ' & payload.stations.prices.e5
        

        Json1.jpg

        Obs wirklich funktioniert, kann ich nicht testen, da kein Tankerkönig bei mir vorhanden.

        DJMarc75 1 Reply Last reply Reply Quote 0
        • DJMarc75
          DJMarc75 @frankyboy73 last edited by

          @frankyboy73 sagte in JSON aus verschiedenen DP (Payloads) erstellen:

          welche Werte in welcher Form sollen denn da rauskommen?

          So hatte ich es vor und so ist es mir nun auch gelungen, allerdings in Blockly:

          [
            {
              "name": "ARAL",
              "preis": "1.909 €",
              "adresse": "xxx Straße 5 in 742xx xxx",
              "dist": "1.1 km",
              "open": "/icons-open-icon-library-png/others/circle_green.png"
            },
          

          Die JSON welche ich oben per NodeRed erzeuge hab ich dann per Blockly und per Schleife "zerlegt" und neu nach meinen Wünschen angelegt.
          Dachte sowas gibbed auch in NodeRed.

          Trotzdem vielen Dank für Deine Antwort.

          F mickym 2 Replies Last reply Reply Quote 0
          • F
            frankyboy73 @DJMarc75 last edited by

            @djmarc75 Hi, schön wenn du es selber hinbekommen hast.
            Mit Node Red sollte das aber auch gehen. Im Prinzip braucht du eigentlich nur per Change die nicht gewünschten msg`s löschen. Müsste ich mal testen.

            DJMarc75 1 Reply Last reply Reply Quote 1
            • DJMarc75
              DJMarc75 @frankyboy73 last edited by

              @frankyboy73 Vll war mein Beitragstitle etwas verwirrend.
              Aber mit diesen Nodes, Flows, Arrays, usw kenn ich mich nicht so aus.... ich bin Koch 😁

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

                @djmarc75 sagte in [gelöst] JSON aus verschiedenen DP (Payloads) erstellen:

                Die JSON welche ich oben per NodeRed erzeuge hab ich dann per Blockly und per Schleife "zerlegt" und neu nach meinen Wünschen angelegt.
                Dachte sowas gibbed auch in NodeRed.

                1. Kann man das aufteilen mit split Nodes

                Selbstverständlich geht das, sogar noch viel eleganter. 😉

                1. Kann man aber sogar ohne Schleife sich nur die benötigten Eigenschaften rausholen und in ein neues Objekt schreiben. Das ist noch viel eleganter.

                Sowas wie Schleifen ist viel zuviel Programmierung! Das Tool ist viel intelligenter. 😉

                Wenn das das Ziel ist:

                  {
                    "name": "ARAL",
                    "preis": "1.909 €",
                    "adresse": "xxx Straße 5 in 742xx xxx",
                    "dist": "1.1 km",
                    "open": "/icons-open-icon-library-png/others/circle_green.png"
                  }
                

                dann poste nochmal die Quelle. das Array öffnest Du mit einer split und schliesst es mit einer JOIN Node. Wie gesagt poste mal das gesamte Array der Ausgabe der Tankerkönig Node in CodeTags hier.

                DJMarc75 1 Reply Last reply Reply Quote 0
                • DJMarc75
                  DJMarc75 @mickym last edited by

                  @mickym GuMo, hier erstmal die Ausgabe vom Tankerkönig Node:

                  msg.payload : Object
                  object
                  ok: true
                  license: "CC BY 4.0 -  https://creativecommons.tankerkoenig.de"
                  data: "MTS-K"
                  status: "ok"
                  stations: array[10]
                  0: object
                  id: "60ae1709-c676-4843-a5e4-7b5849dec185"
                  name: "Aral Tankstelle"
                  brand: "ARAL"
                  street: "Züttlinger Straße"
                  place: "Möckmühl"
                  lat: 49.32193
                  lng: 9.363825
                  dist: 1.1
                  isOpen: true
                  houseNumber: "5"
                  postCode: 74219
                  prices: object
                  e5: 2.119
                  1: object
                  2: object
                  3: object
                  4: object
                  5: object
                  6: object
                  7: object
                  8: object
                  9: object
                  

                  hab jetzt mal auf das ausXen verzichtet.
                  Jeder Objektstrang ist identisch aufgebaut, allerdings gilt zu beachten, dass sich die Anzahl und die Inhalte bei z.B. verlassen des Hauses verändert da dieses TankerkönigNode den Radius aus GPS Daten errechnet und ich diese Node mit meinen GPS Daten vom Smartphone füttere.

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

                    @djmarc75 Na so hilft mir das nichts - Du musstest hier mal die ganze payload rein kopieren. Das macht man so (copy value oder Wert kopieren):

                    copy path.gif , aber ich versuchs mal ohne den kompletten Input zu erklären.

                    In NodeRed brauchst Du keine Schleifen programmieren, sondern brichst das Array mit einer Split Node auf. Auf die einzelenen Objekteigenschaften greifst Du direkt zu. Wie gesagt so nutzt mir das nur wenig, aber ich versuch mal so rudimentär ein Beispiel zu konstruieren.

                    Ich simuliere das einfach mal mit dem Objekt bissi modifiziert und kopiert, so dass das Array hier 2 Tankstellen hat.

                    75f46bf6-ea0b-4dba-a127-fbabac1414e9-image.png

                    Das erste was Du machst ist natürlich, dass Du dieses Array Stations extrahierst.

                    DJMarc75 1 Reply Last reply Reply Quote 0
                    • DJMarc75
                      DJMarc75 @mickym last edited by

                      @mickym Okay, hoffe ich hab Dich da jetzt richtig verstanden:

                      payload.stations[0].id
                      60ae1709-c676-4843-a5e4-7b5849dec185
                      payload.stations[0].name
                      Aral Tankstelle
                      payload.stations[0].brand
                      ARAL
                      payload.stations[0].street
                      Züttlinger Straße
                      payload.stations[0].place
                      Möckmühl
                      payload.stations[0].lat
                      49.32193
                      payload.stations[0].lng
                      9.363825
                      payload.stations[0].dist
                      1.1
                      payload.stations[0].isOpen
                      true
                      payload.stations[0].houseNumber
                      5
                      payload.stations[0].postCode
                      74219
                      payload.stations[0].prices.e5
                      2.119
                      

                      Hab nun eine Splitnode nach der TankerkönigNode angesetzt mit folgendem Debug:

                      Screenshot 2022-11-05 085820.png

                      mickym 2 Replies Last reply Reply Quote 0
                      • mickym
                        mickym Most Active @DJMarc75 last edited by

                        @djmarc75 Nee - aber macht nichts - habs gleich fertig. 😉 - Ich zeigs Dir gleich.

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

                          @djmarc75 So wenn Du aus dem Debug Fenster einfach den Wert in die Zwischenablage kopierst:

                          886c0ea9-9418-4014-a4a7-e8106ef6e6b9-image.png

                          dann kannst Du hier das ganze JSON hier in CodeTags kopieren - ist einfacher und vollständig für die Zukunft. Hab die Daten bissi abgeändert:

                          {"ok":true,"license":"CC BY 4.0 -  https://creativecommons.tankerkoenig.de","data":"MTS-K","status":"ok","stations":[{"name":"Aral Tankstelle","brand":"ARAL","street":"Aral Straße","place":"Mühl","dist":1.1,"isOpen":true,"houseNumber":"5","postCode":74000,"prices":{"e5":2.119}},{"name":"Aral Tankstelle","brand":"SHELL","street":"Shell Straße","place":"Ort","dist":1.1,"isOpen":false,"houseNumber":"5","postCode":74999,"prices":{"e5":2.219}}]}
                          

                          So hätte es dann ausgesehen.

                          Zur Veranschaulichung habe ich die Objekte hoffentlich nach Deinen Wünschen konvertiert:

                          74064b14-b0f7-4be3-94c2-f2f88fad99c4-image.png

                          f91dc118-83ad-41c8-b0b0-c496bd5bab94-image.png

                          1. Im ersten Schritt - setzt Du die payload auf das stations Array
                          2. Dann brichst Du das Array einfach auf in einzelne Nachrichten, was Du im Blockly mühsam mit Schleifen machst, wo Du Zähler etc. brauchst. 😉
                          3. Dort setzt Du dein Objekt mit JSONATA einfach mit den Objektpfaden neu zusammen
                          4. Die einzelnen Nachrichten werden nun wieder zum ursprünglichen Array, aber mit modifizierten Objekten zusammengefasst.

                          Hier der Code:

                          [
                             {
                                 "id": "4e449ff99f6d5a47",
                                 "type": "inject",
                                 "z": "289f539dcc33814e",
                                 "name": "",
                                 "props": [
                                     {
                                         "p": "payload"
                                     }
                                 ],
                                 "repeat": "",
                                 "crontab": "",
                                 "once": false,
                                 "onceDelay": 0.1,
                                 "topic": "",
                                 "payload": "{\"ok\":true,\"license\":\"CC BY 4.0 -  https://creativecommons.tankerkoenig.de\",\"data\":\"MTS-K\",\"status\":\"ok\",\"stations\":[{\"name\":\"Aral Tankstelle\",\"brand\":\"ARAL\",\"street\":\"Aral Straße\",\"place\":\"Mühl\",\"dist\":1.1,\"isOpen\":true,\"houseNumber\":\"5\",\"postCode\":74000,\"prices\":{\"e5\":2.119}},{\"name\":\"Aral Tankstelle\",\"brand\":\"SHELL\",\"street\":\"Shell Straße\",\"place\":\"Ort\",\"dist\":1.1,\"isOpen\":false,\"houseNumber\":\"5\",\"postCode\":74999,\"prices\":{\"e5\":2.219}}]}",
                                 "payloadType": "json",
                                 "x": 350,
                                 "y": 4560,
                                 "wires": [
                                     [
                                         "7eaebeb1f37724d3",
                                         "d175c7ce933851f2"
                                     ]
                                 ]
                             },
                             {
                                 "id": "7eaebeb1f37724d3",
                                 "type": "change",
                                 "z": "289f539dcc33814e",
                                 "name": "",
                                 "rules": [
                                     {
                                         "t": "set",
                                         "p": "payload",
                                         "pt": "msg",
                                         "to": "payload.stations",
                                         "tot": "msg"
                                     }
                                 ],
                                 "action": "",
                                 "property": "",
                                 "from": "",
                                 "to": "",
                                 "reg": false,
                                 "x": 570,
                                 "y": 4560,
                                 "wires": [
                                     [
                                         "f7adebed01e88ce5",
                                         "8fdd4ea373e2b3de"
                                     ]
                                 ]
                             },
                             {
                                 "id": "d175c7ce933851f2",
                                 "type": "debug",
                                 "z": "289f539dcc33814e",
                                 "name": "debug 43",
                                 "active": true,
                                 "tosidebar": true,
                                 "console": false,
                                 "tostatus": false,
                                 "complete": "false",
                                 "statusVal": "",
                                 "statusType": "auto",
                                 "x": 540,
                                 "y": 4500,
                                 "wires": []
                             },
                             {
                                 "id": "f7adebed01e88ce5",
                                 "type": "debug",
                                 "z": "289f539dcc33814e",
                                 "name": "debug 44",
                                 "active": true,
                                 "tosidebar": true,
                                 "console": false,
                                 "tostatus": false,
                                 "complete": "false",
                                 "statusVal": "",
                                 "statusType": "auto",
                                 "x": 780,
                                 "y": 4500,
                                 "wires": []
                             },
                             {
                                 "id": "8fdd4ea373e2b3de",
                                 "type": "split",
                                 "z": "289f539dcc33814e",
                                 "name": "",
                                 "splt": "\\n",
                                 "spltType": "str",
                                 "arraySplt": 1,
                                 "arraySpltType": "len",
                                 "stream": false,
                                 "addname": "",
                                 "x": 770,
                                 "y": 4560,
                                 "wires": [
                                     [
                                         "d8a0e62da9474c8d",
                                         "3011705ebe3d9f57"
                                     ]
                                 ]
                             },
                             {
                                 "id": "d8a0e62da9474c8d",
                                 "type": "debug",
                                 "z": "289f539dcc33814e",
                                 "name": "debug 45",
                                 "active": true,
                                 "tosidebar": true,
                                 "console": false,
                                 "tostatus": false,
                                 "complete": "false",
                                 "statusVal": "",
                                 "statusType": "auto",
                                 "x": 980,
                                 "y": 4500,
                                 "wires": []
                             },
                             {
                                 "id": "3011705ebe3d9f57",
                                 "type": "change",
                                 "z": "289f539dcc33814e",
                                 "name": "",
                                 "rules": [
                                     {
                                         "t": "set",
                                         "p": "payload",
                                         "pt": "msg",
                                         "to": "  {\t    \"name\": payload.brand,\t    \"preis\": payload.prices.e5,\t    \"adresse\": payload.street & \" \" & payload.houseNumber & \" in \" & payload.postCode & \" \" & payload.place,\t    \"dist\": payload.dist & \" km\",\t    \"open\": payload.isOpen ? \"/icons-open-icon-library-png/others/circle_green.png\" : \"/icons-open-icon-library-png/others/circle_red.png\"\t  }\t",
                                         "tot": "jsonata"
                                     }
                                 ],
                                 "action": "",
                                 "property": "",
                                 "from": "",
                                 "to": "",
                                 "reg": false,
                                 "x": 970,
                                 "y": 4560,
                                 "wires": [
                                     [
                                         "c83e9a4e75e39a8e",
                                         "91adfca9f68e6c88"
                                     ]
                                 ]
                             },
                             {
                                 "id": "c83e9a4e75e39a8e",
                                 "type": "debug",
                                 "z": "289f539dcc33814e",
                                 "name": "debug 46",
                                 "active": true,
                                 "tosidebar": true,
                                 "console": false,
                                 "tostatus": false,
                                 "complete": "false",
                                 "statusVal": "",
                                 "statusType": "auto",
                                 "x": 1180,
                                 "y": 4500,
                                 "wires": []
                             },
                             {
                                 "id": "91adfca9f68e6c88",
                                 "type": "join",
                                 "z": "289f539dcc33814e",
                                 "name": "",
                                 "mode": "auto",
                                 "build": "object",
                                 "property": "payload",
                                 "propertyType": "msg",
                                 "key": "topic",
                                 "joiner": "\\n",
                                 "joinerType": "str",
                                 "accumulate": "false",
                                 "timeout": "",
                                 "count": "",
                                 "reduceRight": false,
                                 "x": 1170,
                                 "y": 4560,
                                 "wires": [
                                     [
                                         "c42aa4e722e333a5"
                                     ]
                                 ]
                             },
                             {
                                 "id": "c42aa4e722e333a5",
                                 "type": "debug",
                                 "z": "289f539dcc33814e",
                                 "name": "debug 47",
                                 "active": true,
                                 "tosidebar": true,
                                 "console": false,
                                 "tostatus": false,
                                 "complete": "false",
                                 "statusVal": "",
                                 "statusType": "auto",
                                 "x": 1380,
                                 "y": 4500,
                                 "wires": []
                             }
                          ]
                          

                          Das sollte eigentlich einfacher sein. Das JSON Objekt enthält auch eine einfache Abfrage für deine beiden verschiedenen Icons.

                            {
                              "name": payload.brand,
                              "preis": payload.prices.e5,
                              "adresse": payload.street & " " & payload.houseNumber & " in " & payload.postCode & " " & payload.place,
                              "dist": payload.dist & " km",
                              "open": payload.isOpen ? "/icons-open-icon-library-png/others/circle_green.png" : "/icons-open-icon-library-png/others/circle_red.png"
                            }
                          

                          Zum Schluss kannst ja das Objekt bzw. Array wieder mit einer JSON Node konvertieren und in Deinen Datenpunkt schreiben.
                          So einfach kann Node Red sein. 😉

                          DJMarc75 1 Reply Last reply Reply Quote 1
                          • DJMarc75
                            DJMarc75 @mickym last edited by DJMarc75

                            @mickym Na das ist ja super. Hatte bei meinen "Tests" dies auch schon so gehabt nur hatte ich keine Join Node gesetzt.

                            Ich bastel jetzt meinen Flow um und berichte.

                            p.s. mein Blockly war in 10 Minuten erstellt 😁 aber ich wollte diese JSON welche ich in VIS verwende nicht unbedingt aus 2 verschiedenen Maschinen holen und das wird jetzt allein in NodeRed umgesetzt.

                            Vielen Dank für Deine stetigen Hilfen. Made my day !

                            Edit: Rennt wie ein Uhrwerk und Blocklyskript ist deaktiviert 😂

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

                              @djmarc75 sagte in [gelöst] JSON aus verschiedenen DP (Payloads) erstellen:

                              Edit: Rennt wie ein Uhrwerk und Blocklyskript ist deaktiviert

                              Freut mich. 🙂 - Wie gesagt für die Zukunft einfach die Werte wie beschrieben aus dem Debugfenster kopieren, dann kann man Dir bei den Flows leichter helfen, weil man dann die Daten zur Verfügung hat und über die Inject-Nodes den Flow selbst erstellen kann ohne dass man die Hardware oder die Adapter selbst installiert hat.

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              676
                              Online

                              31.9k
                              Users

                              80.2k
                              Topics

                              1.3m
                              Posts

                              3
                              13
                              857
                              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