Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Daten Objekt aus MQTT zerlegen und in eigene Objekte packen

    NEWS

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    Daten Objekt aus MQTT zerlegen und in eigene Objekte packen

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      Meckii @Homoran last edited by

      @homoran
      Ja der schwebt da - das ist aber nicht der Fehler.
      Mein Problem habe ich glaube ich gefunden.
      Das Time bekomme ich rausgeparst - die anderen Werte nicht.

      Ich glaube das Problem ist das "verschachtelte" JSON...

      Homoran Thomas Braun 2 Replies Last reply Reply Quote 0
      • Homoran
        Homoran Global Moderator Administrators @Meckii last edited by Homoran

        @meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:

        das ist aber nicht der Fehler.

        sicher?

        @meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:

        Ich glaube das Problem ist das "verschachtelte" JSON...

        möglich!

        Bitte das json in code-tags posten damit keine Steuerzeichen verloren gehen
        https://forum.iobroker.net/topic/51555/hinweise-für-gute-forenbeiträge/1

        kann das sein, dass dirt ein " zuviel drin ist?

        probier mal ein 0.aktuelle......

        M 1 Reply Last reply Reply Quote 0
        • Thomas Braun
          Thomas Braun Most Active @Meckii last edited by

          @meckii

          Ich mach das mit diesem Skript:

          // where the mqtt messages arrive
          
          const mqttDatenpunktObjectId = 'mqtt.0.tele.bitshake_smartmeter.SENSOR';
          
          // where the states should appear
          
          const userDataFolder = '0_userdata.0.stromzaehler';
          
           
          
          // ############## end user config
          
           
          
          // receive
          
          on(mqttDatenpunktObjectId, (obj) => {
          
            const jsonString = obj.state.val;
          
            const jsonData = JSON.parse(jsonString);
          
           
          
            function createObjectsRecursively(parent, data) {
          
              for (const key in data) {
          
                const obj = data[key];
          
                const stateName = `${parent}.${key}`;
          
               
          
                if (typeof obj === 'object') {
          
                  createObjectsRecursively(stateName, obj);
          
                } else {
          
                 let value = obj;  
          
           
          
                  // Check if the state already exists. If it does, just update the value.
          
                  // If it does not exist create the states.
          
                  if (!existsState(stateName)) {
          
                    // If the state does not exist, create it and set the value
          
                    createState(stateName, value, {
          
                      name: key,
          
                      type: typeof value,
          
                      role: "value",
          
                      read: true,
          
                      write: true
          
                    });
          
                    log(`Created state ${stateName}`);
          
                    
          
                  } else {
          
                    setState(stateName, value, true);
          
                  }
          
                }
          
              }
          
            }
          
             createObjectsRecursively(userDataFolder, jsonData);
          
          });
          
          D 1 Reply Last reply Reply Quote 0
          • M
            Meckii @Homoran last edited by Meckii

            @homoran
            Ja, ich hab das so stehen lassen damit man meinen Lösungsansatz sieht.
            Dass das genau so wie im Bild nicht gehen kann ist mir klar 😉

            Gerne

            {"Time":"2023-12-10T14:30:04","":{"aktuelle_wirkleistung":1212,"zählerstand_tarif_1":12495.9,"zählerstand_tarif_2":0.0}}
            
            paul53 1 Reply Last reply Reply Quote 0
            • Homoran
              Homoran Global Moderator Administrators last edited by

              @meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:

              @homoran

              Gerne

              {"Time":"2023-12-10T14:30:04","":{"aktuelle_wirkleistung":1212,"zählerstand_tarif_1":12495.9,"zählerstand_tarif_2":0.0}}
              

              siehste, da ist das letzte " nicht drin, dann müsste es mit

              @homoran sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:

              probier mal ein 0.aktuelle......

              klappen

              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @Meckii last edited by paul53

                @meckii sagte: {"Time":"2023-12-10T14:30:04","":{"aktuelle_wirkleistung":1212,"zählerstand_tarif_1":12495.9,"zählerstand_tarif_2":0.0}}

                Das Problem ist der leere Bezeichner des Objektes. Man muss erst damit das Objekt erzeugen, um dann auf die Attribute zugreifen zu können.

                Blockly_temp.JPG

                M 1 Reply Last reply Reply Quote 0
                • M
                  Meckii @paul53 last edited by

                  @paul53 Da bekomme ich eine Fehlermeldung

                  Cannot parse "mqtt.0.tele.tasmota_729799.SEN"SyntaxError: Unexpected token m in JSON at position 0
                  
                  paul53 Homoran 3 Replies Last reply Reply Quote 0
                  • paul53
                    paul53 @Meckii last edited by paul53

                    @meckii

                    Blockly_temp.JPG

                    Blockly zeigen!

                    1 Reply Last reply Reply Quote 0
                    • Homoran
                      Homoran Global Moderator Administrators @Meckii last edited by Homoran

                      @meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:

                      @paul53 Da bekomme ich eine Fehlermeldung

                      Cannot parse "mqtt.0.tele.tasmota_729799.SEN"SyntaxError: Unexpected token m in JSON at position 0
                      

                      und mit 0.aktuel....

                      EDIT!
                      Natürlich hat @Paul53 wieder recht!
                      Screenshot_20231210-154606_Firefox.jpg

                      anders geht's nicht

                      M 1 Reply Last reply Reply Quote 0
                      • M
                        Meckii @Homoran last edited by Meckii

                        @homoran
                        Ok wenn ich es mache wie du - also das Objekt in einen Text kopieren - dann geht es.
                        Greife ich auf das Objekt direkt zu kommt eine Fehlermeldung...

                        16:54:44.761	error	javascript.0 (1473) script.js.Strom.Bezug.Messdaten: Cannot parse "mqtt.0.tele.tasmota_729799.SEN"SyntaxError: Unexpected token m in JSON at position 0
                        16:54:44.763	error	javascript.0 (1473) script.js.Strom.Bezug.Messdaten: Cannot get zählerstand_tarif_2 of null
                        

                        Gibt es einen vernünftigen Weg das originale Objekt wie es aus MQTT im ioBroker landet zu kopieren und hier einzufügen?

                        Edit:
                        Ich nehme alles zurück - der Depp saß vor dem Monitor.
                        Man sollte auf den Wert von ObjektID gehen und nicht auf die ObjektID..

                        Vielen Dank an alle!

                        paul53 1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 @Meckii last edited by

                          @meckii sagte: Greife ich auf das Objekt direkt zu kommt eine Fehlermeldung...

                          Wie erfolgt der Zugriff? Zeigen!

                          M 1 Reply Last reply Reply Quote 0
                          • M
                            Meckii @paul53 last edited by

                            @paul53 sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:

                            @meckii sagte: Greife ich auf das Objekt direkt zu kommt eine Fehlermeldung...

                            Wie erfolgt der Zugriff? Zeigen!

                            Ist erledigt.
                            Habs ein Beitrag weiter oben beschrieben - der Fehler saß vor dem Monitor 🙂

                            1 Reply Last reply Reply Quote 0
                            • M
                              Meckii last edited by

                              Meine Lösung für die Nachwelt:

                              var Objekt, wirkleistung, tarif1, tarif2, serverid;
                              
                              createState('Strom.Bezug.Wirkleistung', 0, JSON.parse('{"type": "number", "unit": "W"}'), async () => {
                              });
                              createState('Strom.Bezug.ZaehlerstandHT', 0, JSON.parse('{"type": "number", "unit": "kWh"}'), async () => {
                              });
                              createState('Strom.Bezug.ZaehlerstandNT', 0, JSON.parse('{"type": "number", "unit": "kWh"}'), async () => {
                              });
                              createState('Strom.Bezug.Server_ID', 0, async () => {
                              });
                              on({ id: [].concat(['mqtt.0.tele.tasmota_123456.SENSOR']), change: 'ne' }, async (obj) => {
                                let value = obj.state.val;
                                let oldValue = obj.oldState.val;
                                Objekt = getState('mqtt.0.tele.tasmota_123456.SENSOR').val;
                                wirkleistung = getAttr(getAttr(Objekt, ''), 'aktuelle_wirkleistung');
                                tarif1 = getAttr(getAttr(Objekt, ''), 'zählerstand_tarif_1');
                                tarif2 = getAttr(getAttr(Objekt, ''), 'zählerstand_tarif_2');
                                serverid = getAttr(getAttr(Objekt, ''), 'Server_ID');
                                setState('javascript.0.Strom.Bezug.Wirkleistung' /* Strom.Bezug.Wirkleistung */, wirkleistung, true);
                                setState('javascript.0.Strom.Bezug.ZaehlerstandHT' /* Strom.Bezug.ZaehlerstandHT */, tarif1, true);
                                setState('javascript.0.Strom.Bezug.ZaehlerstandNT' /* Strom.Bezug.ZaehlerstandNT */, tarif2, true);
                                setState('javascript.0.Strom.Bezug.Server_ID' /* Strom.Bezug.Server_ID */, serverid, true);
                              });
                              
                              
                              Homoran 1 Reply Last reply Reply Quote 0
                              • Homoran
                                Homoran Global Moderator Administrators @Meckii last edited by

                                @meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:

                                Meine Lösung für die Nachwelt:

                                wo ist das Blockly dazu?
                                https://forum.iobroker.net/topic/51555/hinweise-für-gute-forenbeiträge/1

                                @meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:

                                der Fehler saß vor dem Monitor

                                ID statt Wert von?

                                immer alles zeigen, zeigen, zeigen!!
                                was du trotz Nachfrage nicht gemacht hast

                                M 2 Replies Last reply Reply Quote 0
                                • M
                                  Meckii @Homoran last edited by Meckii

                                  @homoran
                                  Das reiche ich gerne nach.
                                  War nur so dass ich zwei Kinder auf mir rumturnen hatte - jetzt sind sie im Bett 🙂
                                  Screenshot 2023-12-10 193239.png

                                  Mir war übrigens nicht klar, warum ich dann etwas zeigen sollte wo ich den Fehler schon gefunden hatte...
                                  ICh gelobe besserung 🍻

                                  paul53 1 Reply Last reply Reply Quote 0
                                  • M
                                    Meckii @Homoran last edited by

                                    @homoran sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:

                                    ID statt Wert von?

                                    immer alles zeigen, zeigen, zeigen!!
                                    was du trotz Nachfrage nicht gemacht hast

                                    Ich hatte versehentlich den oberen Block genommen statt den unteren.
                                    Screenshot 2023-12-10 194021.png

                                    1 Reply Last reply Reply Quote 0
                                    • Homoran
                                      Homoran Global Moderator Administrators @Meckii last edited by Homoran

                                      @meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:

                                      @paul53 Da bekomme ich eine Fehlermeldung

                                      Cannot parse "mqtt.0.tele.tasmota_729799.SEN"SyntaxError: Unexpected token m in JSON at position 0

                                      das sah nämlich nach der DP ID aus, deswegen schrieb @paul53 auch sofort

                                      @paul53 sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:

                                      Blockly zeigen!

                                      1 Reply Last reply Reply Quote 0
                                      • paul53
                                        paul53 @Meckii last edited by

                                        @meckii sagte in: Das reiche ich gerne nach.

                                        Einfacher:

                                        Blockly_temp.JPG

                                        1 Reply Last reply Reply Quote 2
                                        • CPU6502
                                          CPU6502 @Meckii last edited by CPU6502

                                          @Meckii
                                          Das geht auch ohne Blockly:

                                          Einfach einen neuen Alias für dein Quellobjekt (“mqtt.0.tele.tasmota_729799.SENSOR") anlegen und dann im Alias eine Konvertierungsfunktion beim Lesen verwenden:

                                          JSON.parse(val).aktuelle_wirkleistung

                                          In deinem Beispiel ist nur der Attributname des verschachtelten JSON-Objekts merkwürdigerweise leer. Das sollte eigentlich nicht sein, daher wird das so wie von mir angegeben vermutlich nicht direkt funktionieren. Du musst zunächst in deiner Tasmota-Konfiguration dafür sorgen, dass hier ein Attributname vergeben wird (z.B. „Energie“). Dann kannst du den Wert mittels

                                          JSON.parse(val).Energie.aktuelle_wirkleistung

                                          extrahieren.

                                          Viele Grüße, Stefan

                                          paul53 mickym 2 Replies Last reply Reply Quote 0
                                          • paul53
                                            paul53 @CPU6502 last edited by

                                            @cpu6502 sagte: JSON.parse(val).aktuelle_wirkleistung

                                            JSON.parse(val)[''].aktuelle_wirkleistung
                                            
                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            709
                                            Online

                                            32.0k
                                            Users

                                            80.5k
                                            Topics

                                            1.3m
                                            Posts

                                            7
                                            24
                                            1257
                                            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