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 last edited by Meckii

      Hallo,
      ich versuche gerade die Daten von meinem Stromzähler mittels einem Tasmota IR-Auslesekopf und MQTT in ioBroker zu bekommen.

      Was bis jetzt funktioniert:
      Tasmota sendet Wirkleistung und Zählerstand an MQTT.
      Die Daten bekomme ich mittels MQTT Adapter in ioBroker.

      Es wird ein Objekt "mqtt.0.tele.tasmota_729799.SENSOR" angelegt.
      Der inhalt ist wie folgt:
      {"Time":"2023-12-10T13:53:24","":{"aktuelle_wirkleistung":98,"zählerstand_tarif_1":12495.8,"zählerstand_tarif_2":0.0"}}

      Nun versuche ich mittels Blockly das zu Parsen und neue Objekte "Strom.Bezug.Zaehlerstand" und "Strom.Bezug.Wirkleistung" anzulgen.

      Lleider bekomme ich das nicht vernünftig zerlegt.
      Kann mit bitte jemand helfen?Screenshot 2023-12-10 135923.png

      Homoran CPU6502 2 Replies 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:

        Nun versuche ich mittels Blockly das zu Parsen und neue Objekte "Strom.Bezug.Zaehlerstand" und "Strom.Bezug.Wirkleistung" anzulgen.

        der Block schwebt frei im Raum.

        Was willst du damit erreichen?

        M 1 Reply Last reply Reply Quote 0
        • 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
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            673
                                            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