Ankündigung

Einklappen
Keine Ankündigung bisher.

Kaskadierbare JSON Decoder Bausteine (LBS19001072 - LBS19001075)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Kaskadierbare JSON Decoder Bausteine (LBS19001072 - LBS19001075)

    Hallo zusammen,

    ich möchte hier meine neuen JSON Decoder Bausteine vorstellen. Diese Bausteine dekodieren einen JSON-String anhand der vorgegebenen Schlüssel. Kaskadierbar sind sie dadurch, dass, wenn ein Wert ein Array darstellt, dieses Array wieder als JSON-String kodiert wird und der JSON-String als Wert ausgegeben wird. Dieser JSON-String lässt sich dann an den entsprechenen JSON-Eingang eines weiteren JSON Decoders anschließen. So lassen sich alle Ebenen eines JSON-String zerlegen.
    Die Bausteine unterscheiden sich nur in der Anzahl der Schlüssel/Wert-Paare, die an den Ein- bzw. Ausgängen zur Verfügung stehen.
    1. JSON Decoder (20x) with KEYs (LBS19001072)
    2. JSON Decoder (10x) with KEYs (LBS19001073)
    3. JSON Decoder (5x) with KEYs (LBS19001074)
    4. JSON Decoder (1x) with KEY (LBS19001075)



    Ich habe diese Bausteine für zwei Einsatzgebiete gebaut, in denen sie von mir benötigt werden:
    1. Auslesen von MQTT Payloads, die als JSON-String übertragen werden. Hier nenne ich mal als Beispiel alle MQTT-Clients, die der MQTT Smarthome Spezifikation folgen. Beispiele sind hm2mqtt (Homematic-Anbindung) und weitere Beispiele hier.
    2. Auslesen von HTTP POST Requests, die im Body JSON-Daten enthalten. Hier nutze ich aktuell zum Beispiel die Node.js basierte einfache HTTP-API für SONOS als Alternative zu dem hier im Forum vorhandnen SONOS LBS, da die HTTP API deutlich mehr Features bietet.

    Zuletzt geändert von Nanosonde; 21.05.2017, 14:56.

    #2
    Sehr schöne Sache. So kann sich jeder seinen Parser selbst bauen und genau die Informationen aus dem JSON-String holen, die er benötigt. Das erübrigt in meinem LBS die Prüfung, ob der String nur eine Ebene enthält.
    Gruß
    Stefan

    Kommentar


      #3
      Hi Leute,

      wie hole ich mir denn einen JSON-Sting der mehrere Ebenen enthält die JSON-Abfrage 19000933 geht ja nicht. Hab ich einen LBS übersehn?
      Ich arbeite mich gerade erst etwas in EDOMI ein, bitte also um Nachsicht ;-)

      Jürgen

      Kommentar


        #4
        Woher willst du denn den JSON String holen? Der 19000933 ruft doch einfach eine URL ab und prüft das Ergebnis auf JSON Konformität. Das sollte auch für mehrere Ebenen funktionieren. Und mit den Decodern sollte man die unterschiedlichen Ebenen auch zerlegen können.

        Kommentar


          #5
          Danke für die schnelle Antwort.

          Ich hab es mal zum Testen so aufgebaut:

          json2.JPG

          Dann kommt immer das:
          Json.JPG
          Vom Decoder bekomm ich so garkein LOG.

          Der String sieht so aus:

          Code:
           
           {"PowerSelfConsumption":695.8172605393088,"PowerConsumption":695.8172605393088,"PowerOut":3850.857994043176,"StatesOfCharge":{"WorkCharge":6000,"ModeConverter":"CHARGING","StateOfCharge":100},"PowerTotalPV":4546.675254582485,"PowerPVPeak":9900,"PowerSelfSupply":695.8172605393088,"PowerIn":0,"PowerConsumptionMax":{"2017-08-20":7053.1951943312115,"2017-08-18":6921.162961246531,"2017-08-21":6030.982027996735,"2017-08-22":4909.633426300654,"2017-08-23":4395.225,"2017-08-19":6009.623006184416,"2017-08-24":3579.309301892129}}
          Wenn ich den Sting direkt in E6 beim Decoder schreibe klappt es, aber natürlich ohne Refresh.

          Grüße
          Jürgen

          Kommentar


            #6
            Okay. Habe gerade gesehen, dass der LBS JSON Abfrage auf Tiefe 2 limitiert. Warum das so ist, kann ich dir leider nicht sagen, aber du könntest das ,2 im json_decode() Aufruf einfach mal löschen und schauen, ob dann was am Ausgang A1 ankommt, denn es ist ja korrektes JSON. Danach sollte es dann auch zerlegbar sein. Vielleicht kann MrIcemanLE als Autor des LBS ja etwas dazu sagen, warum die Abfrage auf Tiefe 2 limitiert ist.

            Kommentar


              #7
              Hab es grad getestet und des ",2" rausgelöscht und... passt.

              Vielen Dank für die Hilfe

              Viele Grüße
              Jürgen

              Kommentar


                #8
                Hallo Zusammen,

                Zum Zeitpunkt der LBS-Erstellung gab es die Decoder von Nanosonde noch nicht. Daher hatte ich das auf eine Ebene beschränkt. Werde den Tiefenfilter raus nehmen. Update folgt.
                Gruß
                Stefan

                Kommentar


                  #9
                  Hallo,

                  ich habe hier einen String, den der LBS komischerweise nicht richtig auflöst:
                  Code:
                  {"val":false,"ts":1509842157456,"lc":1509842157456,"hm":{"ADDRESS":"OEQ0201234:1"}}
                  Das Ergebnis im Logfile sieht wie folgt aus:
                  Code:
                  ================ ARRAY/OBJECT START ================
                  val =>
                  ts => 1509842157456
                  lc => 1509842157456
                  hm => Array
                  ================ ARRAY/OBJECT END ================
                  Ändere ich im String "val":false auf "val":1 , wird der Inhalt erkannt:
                  Code:
                  val => 1
                  Gibt es hierfür eine Erklärung? Der String wird von HM2MQTT geliefert, ich glaube du nutzt auch MQTT um Homematic Geräte einzubinden, oder?

                  MfG Sven

                  Kommentar


                    #10
                    Zitat von OleDeluxe Beitrag anzeigen
                    Gibt es hierfür eine Erklärung?
                    Ich verstehe das Problem nicht, es wird korrekt als "false" ausgewertet...
                    siehe zB: https://www.w3schools.com/js/js_json_datatypes.asp

                    Kommentar


                      #11
                      Zitat von wintermute Beitrag anzeigen
                      Ich verstehe das Problem nicht, es wird korrekt als "false" ausgewertet...
                      siehe zB: https://www.w3schools.com/js/js_json_datatypes.asp
                      Danke für den Hinweis, das hat meine Denkblockade gelöst :-) Ich hatte erwartet, dass ich im LOG an der Stelle auch im Klartext false/true lesen müsste. Ein Binärauslöser am entsprechenden Ausgang bringt hier den gewünschten Erfolgt. Danke!!

                      Kommentar


                        #12
                        Zitat von OleDeluxe Beitrag anzeigen
                        Ich hatte erwartet, dass ich im LOG an der Stelle auch im Klartext false/true lesen müsste.
                        Haette ich auch erwartet

                        Kommentar


                          #13
                          Gibt es ein Beispiel für den korrekten Umgang mit Arrays?
                          Mit einem ersten Decoder zerlege ich das JSON in 4 Substrings. Einer davon "Connections" ist ein Array mit Infos zu Zugverbindungen. Mit Key "Connections" bekomme ich als Ouptut Value den folgenden Array:

                          Code:
                          [{"time":"2017-12-10 13:48:00","*G":"S","*L":"7","type":"strain","line":"S7","operator":"SBB","color":"039~fff~","number":"S7 18753","terminal":{"id":"8503110","name":"Rapperswil","x":704369,"y":231356},"arr_delay":"+0","dep_delay":"+2"},
                          {"time":"2017-12-10 13:56:00","*G":"S","*L":"24","type":"strain","line":"S24","operator":"SBB","color":"039~fff~","number":"S24 20453","terminal":{"id":"8502204","name":"Zug","x":681620,"y":225300},"arr_delay":"+1","dep_delay":"+1"},
                          {"time":"2017-12-10 14:00:00","*G":"S","*L":"24","type":"strain","line":"S24","operator":"SBB","color":"039~fff~","number":"S24 20450","terminal":{"id":"8014487","name":"Herblingen","x":"691972","y":"285895"},"arr_delay":"+1","dep_delay":"+2"}]
                          Diesen gebe ich als Input zu einem zweiten Decoder. Aber wie kann ich diesen nun weiter zerlegen? Sämtliche Versuche sind bisher gescheitert.

                          Kommentar


                            #14
                            versuche mal mit den Keys 0, 1, 2, 3, ... usw.

                            Kommentar


                              #15
                              Ich dachte, das hätte ich versucht, aber offensichtlich nicht - klappt wunderbar, herzlichen Dank!

                              Kommentar

                              Lädt...
                              X