Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. mqtt parsen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    mqtt parsen

    This topic has been deleted. Only users with topic management privileges can see it.
    • Thomas Braun
      Thomas Braun Most Active last edited by Thomas Braun

      Ich habe hier ein mqtt-Telegram das ich gerne in entsprechende Datenpunkte splitten würde:

      {
        "Time": "2023-08-09T20:41:37",
        "SML": {
          "total_bez": 4XXXX3.1,
          "total_bez_kwh": 4XXX.6,
          "total_ein": 0,
          "total_ein_kwh": 0,
          "netz_frequenz": 50.2,
          "aktuelle_wirkleistung": 161,
          "strom_l1": 0.1,
          "strom_l2": 1.34,
          "strom_l3": 0,
          "spannung_l1": 230.8,
          "spannung_l2": 230.8,
          "spannung_l3": 230.7,
          "delta_phi_I_U_L1": 0,
          "delta_phi_I_U_L2": -45,
          "delta_phi_I_U_L3": 0
        },
        "daily_consumption": 4XXXX73,
        "daily_feed": 0
      }
      

      ich hab mir dieses skript hier irgendwo ausgeborgt (Ich glaube von @paul53 ) 🙂

      const JSPath = '0_userdata.0'; // JS- Pfad
      const parsedStatesPath = JSPath + ".stromzaehler."; // Pfad fuer geparste States
      const idJSON = 'mqtt.0.tele.bitshake_smartmeter.SENSOR';
      
      on(idJSON, function (dp) {
          let JsonObj = JSON.parse(dp.state.val);
          Object.keys(JsonObj).forEach(function(key) {
              if(existsState(parsedStatesPath + key)) setState(parsedStatesPath + key, JsonObj[key], true);
              else createState(parsedStatesPath + key, JsonObj[key], {read: true, write: false, type: typeof JsonObj[key], name: key});
          });
      });
      

      Funktioniert grundsätzlich, allerdings wird die zweite Ebene nicht aufgesplittet:

      648f0d17-172b-4761-97ec-b385881caf1a-image.png

      Wie bekomme ich die 'SML'-Ebene aufgedröselt?

      mickym Quarkmax T 3 Replies Last reply Reply Quote 0
      • mickym
        mickym Most Active @Thomas Braun last edited by

        @thomas-braun Ich kann Dir nur meinen NodeRed Flow anbieten. 😉

        1 Reply Last reply Reply Quote 0
        • Quarkmax
          Quarkmax @Thomas Braun last edited by

          @thomas-braun
          ich habe das irgendwo im Forum gefunden und es funktioniert für mich mit der zweiten Ebene.

          // ############## user config
           
          // where the mqtt messages arrive
          const mqttDatenpunktObjectId = 'mqtt.0.linktap.up_cmd.xxxxxxxxxxxxxxx';
          // where the states should appear
          const userDataFolder = '0_userdata.0.Linktap.xxxxxxxxxxxxxx';
           
          // ############## 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);
          });
          
          

          Vielleicht hat @paul53 eine elegantere Lösung. Ich hoffe ja noch immer auf einen Adapter, wo man Ursprung- und ZielDatenpunkt eingibt und der erledigt alles .😊

          Thomas Braun 1 Reply Last reply Reply Quote 0
          • T
            ticaki Developer @Thomas Braun last edited by ticaki

            Ist aus einem meiner Scripte. Hab das gerade von unnötigem Code gesäubert, sollte laufen wenn ich nicht zuviel oder zuwenig gelöscht habe

            id ist der Datenpunkt ab dem gebaut werden soll
            result ist das das json

            setKeys(id, result)
            
            async function setKeys(id, result) {
                if (result === null) return
                if (typeof(result) === 'object') {
                    if (result.isArray) {
                        for (let a = 0; a<result.length; a++) {
                            setKeys(id+'.'+a, result[a])
                        }
                    } else {
                        for (let key in result) {
                            setKeys(id+'.'+key, result[key])
                        }
                    }
                } else {
                    if (existsState(id)) {
                        setState(id, result, true)
                    } else {
                        let common = {name:'no name', type:typeof(result), write:false, def:result}
                        try {
                            await createStateAsync(id, result,common)
                        } catch(e) {log(e)}
                    }
                }
                return Promise.resolve(true);
            }
            
            1 Reply Last reply Reply Quote 0
            • Thomas Braun
              Thomas Braun Most Active @Quarkmax last edited by

              @quarkmax

              Hab das Skript übernommen, funktioniert.

              @mickym @ticaki
              Danke für eure Vorschläge!

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

              Support us

              ioBroker
              Community Adapters
              Donate

              904
              Online

              31.8k
              Users

              80.0k
              Topics

              1.3m
              Posts

              4
              5
              261
              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