Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. mqtt parsen

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    7
    1
    67

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.4k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.3k

mqtt parsen

Geplant Angeheftet Gesperrt Verschoben JavaScript
5 Beiträge 4 Kommentatoren 375 Aufrufe 4 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • Thomas BraunT Online
    Thomas BraunT Online
    Thomas Braun
    Most Active
    schrieb am zuletzt editiert von Thomas Braun
    #1

    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?

    Linux-Werkzeugkasten:
    https://forum.iobroker.net/topic/42952/der-kleine-iobroker-linux-werkzeugkasten
    NodeJS Fixer Skript:
    https://forum.iobroker.net/topic/68035/iob-node-fix-skript
    iob_diag: curl -sLf -o diag.sh https://iobroker.net/diag.sh && bash diag.sh

    mickymM QuarkmaxQ T 3 Antworten Letzte Antwort
    0
    • Thomas BraunT 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?

      mickymM Offline
      mickymM Offline
      mickym
      Most Active
      schrieb am zuletzt editiert von
      #2

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

      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

      1 Antwort Letzte Antwort
      0
      • Thomas BraunT 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?

        QuarkmaxQ Offline
        QuarkmaxQ Offline
        Quarkmax
        schrieb am zuletzt editiert von
        #3

        @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 .:blush:

        Thomas BraunT 1 Antwort Letzte Antwort
        0
        • Thomas BraunT 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?

          T Nicht stören
          T Nicht stören
          ticaki
          schrieb am zuletzt editiert von ticaki
          #4

          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);
          }
          

          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

          Spenden

          1 Antwort Letzte Antwort
          0
          • QuarkmaxQ Quarkmax

            @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 .:blush:

            Thomas BraunT Online
            Thomas BraunT Online
            Thomas Braun
            Most Active
            schrieb am zuletzt editiert von
            #5

            @quarkmax

            Hab das Skript übernommen, funktioniert.

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

            Linux-Werkzeugkasten:
            https://forum.iobroker.net/topic/42952/der-kleine-iobroker-linux-werkzeugkasten
            NodeJS Fixer Skript:
            https://forum.iobroker.net/topic/68035/iob-node-fix-skript
            iob_diag: curl -sLf -o diag.sh https://iobroker.net/diag.sh && bash diag.sh

            1 Antwort Letzte Antwort
            0
            Antworten
            • In einem neuen Thema antworten
            Anmelden zum Antworten
            • Älteste zuerst
            • Neuste zuerst
            • Meiste Stimmen


            Support us

            ioBroker
            Community Adapters
            Donate

            518

            Online

            32.5k

            Benutzer

            81.7k

            Themen

            1.3m

            Beiträge
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
            ioBroker Community 2014-2025
            logo
            • Anmelden

            • Du hast noch kein Konto? Registrieren

            • Anmelden oder registrieren, um zu suchen
            • Erster Beitrag
              Letzter Beitrag
            0
            • Home
            • Aktuell
            • Tags
            • Ungelesen 0
            • Kategorien
            • Unreplied
            • Beliebt
            • GitHub
            • Docu
            • Hilfe