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.
    • 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
                                          • mickym
                                            mickym Most Active @CPU6502 last edited by

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

                                            @Meckii
                                            Das geht auch ohne Blockly:

                                            Ja oder mit meinem Node-red Flow, der zerlegt jedes JSON in einzelne Datenpunkte.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            462
                                            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