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.
    • 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
                                          • D
                                            disko @Thomas Braun last edited by

                                            @thomas-braun Hallo und danke für dieses Skript, Datenpunkte angepasst und es läuft
                                            Gruß Dirk

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            398
                                            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