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 string 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 string Parsen

    This topic has been deleted. Only users with topic management privileges can see it.
    • paul53
      paul53 @root_ last edited by

      @root_ sagte:

      wenn "DpId":105 erkannt wird, soll von "DpIdData":"00000064" der Wert (hier "00000064" = Temperatur in hex ) erkannt werden und von hex to dec konvertiert und danach in einen Userdatenpunkt "Wasserkocher Temperatur" eingetragen werden.

      let tuya = JSON.parse(json).TuyaReceived;
      let dpid = tuya.DpId;
      let val = parseInt(tuya.DpIdData, 16);
      if(dpid == 105) setState(Wasserkocher.Temperatur, val, true);
      if(dpid == 106) setState(Wasserkocher.Status, val, true);
      
      1 Reply Last reply Reply Quote 1
      • R
        root_ last edited by root_

        Da ich in js ein noob bin muss ich noch mal nachfragen.
        Der Datenpunkt den ich parsen möchte ist:

        mqtt.0.tele.Wasserkocher.RESULT

        die Datenpunkte die geschrieben werden sollen heissen:

        0_userdata.0.Kueche.Wasserkocher.105_Temp
        0_userdata.0.Kueche.Wasserkocher.106_state

        Wie muss das script komplett aussehen? Bin sonst nur blockly user 🙄

        paul53 1 Reply Last reply Reply Quote 0
        • paul53
          paul53 @root_ last edited by

          @root_ sagte:

          mqtt.0.tele.Wasserkocher.RESULT
          die Datenpunkte die geschrieben werden sollen heissen:
          0_userdata.0.Kueche.Wasserkocher.105_Temp
          0_userdata.0.Kueche.Wasserkocher.106_state

          on('mqtt.0.tele.Wasserkocher.RESULT', function(dp) {
             let tuya = JSON.parse(dp.state.val).TuyaReceived;
             let dpid = tuya.DpId;
             let val = parseInt(tuya.DpIdData, 16);
             if(dpid == 105) setState('0_userdata.0.Kueche.Wasserkocher.105_Temp', val, true);
             if(dpid == 106) setState('0_userdata.0.Kueche.Wasserkocher.106_state', val, true);
          });
          
          1 Reply Last reply Reply Quote 0
          • R
            root_ last edited by

            Mega. Danke dir!

            1 Reply Last reply Reply Quote 0
            • R
              root_ last edited by

              jetzt muss ich noch mal nerven.
              Irgendwie hat sich der string geändert (evtl liegt an der Tasmota 8.1.0.10)

              {"TuyaReceived":{"Data":"55AA030700056A040001017E","Cmnd":7,"CmndData":"6A04000101","DpId":106,"DpIdType":4,"DpIdData":"01"}}
              JETZT:
              {"TuyaReceived":{"Data":"55AA030700056A040001017E","Cmnd":7,"CmndData":"6A04000101","DpType4Id106":1,"106":{"DpId":106,"DpIdType":4,"DpIdData":"01"}}}
              
              {"TuyaReceived":{"Data":"55AA030700086902000400000064E4","Cmnd":7,"CmndData":"6902000400000064","DpId":105,"DpIdType":2,"DpIdData":"00000064"}}
              JETZT:
              {"TuyaReceived":{"Data":"55AA03070008690200040000001797","Cmnd":7,"CmndData":"6902000400000017","DpType2Id105":23,"105":{"DpId":105,"DpIdType":2,"DpIdData":"00000064"}}}
              

              jetzt funktioniert das parsing nicht mehr

              paul53 1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @root_ last edited by

                @root_ sagte:

                jetzt funktioniert das parsing nicht mehr

                on('mqtt.0.tele.Wasserkocher.RESULT', function(dp) {
                   let tuya = JSON.parse(dp.state.val).TuyaReceived;
                   if(tuya['105']) {
                      let val = parseInt(tuya['105'].DpIdData, 16);
                      setState('0_userdata.0.Kueche.Wasserkocher.105_Temp', val, true);
                   } else if(tuya['106']) {
                      let val = parseInt(tuya['106'].DpIdData);
                      setState('0_userdata.0.Kueche.Wasserkocher.106_state', val, true);
                   }
                });
                
                M 2 Replies Last reply Reply Quote 0
                • R
                  root_ last edited by

                  Super. Jetzt funktioniert der Wasserkocher 1a cloudfrei mit ioBroker.

                  Vielen Dank für deine tolle und schnelle Hilfe!

                  1 Reply Last reply Reply Quote 0
                  • M
                    manrum1 @paul53 last edited by manrum1

                    @paul53
                    Hallo, darf ich Dich um Hilfe bitten: Ich baue gerade auf Basis von Tasmota an einer Strommessung habe folgenden String, soweit läuft schon alles wunderbar. Per MQTT erhalte ich folgenden String:

                    {"Time":"2020-05-25T18:33:31","ENERGY":{"TotalStartTime":"2020-05-16T15:20:01","Total":14.129,"Yesterday":1.935,"Today":12.194,"Period":0,"Power":[100,301,145]," ":[102,324,231],"ReactivePower":[19,120,180],"Factor":[0.98,0.93,0.63],"Frequency":[50,50,50],"Voltage":[234,234,234],"Current":[0.436,1.386,0.986]}}

                    Dieser repräsentiert die Werte, die von der Messtelle erhalte:
                    eef296c4-1a1e-4e65-b76f-3cb510b60adc-grafik.png

                    Mit u.a. Beispiel schaffe ich es auch einiges zu Parsen und in eigene Datenpunkte zu speichern. Was ich nicht schaffe ist folgendes:

                    1. ich bekomme nur ganzzahlige Werte, wie bekomme ich die Nachkommastellen (also z.B. für Energy_Today erhalte ich 8 statt 8,752)?
                    2. Wie parse ich die Werte für die jeweilige Phasen, die heutige Abfrage (s.u.) liefert nur den ersten Wert? Also z.B. für Power erhalte ich nur 14, wie parse ich die 162 und die 142?

                    Wäre super, wenn Du mich unterstützen könntest.

                    paul53 1 Reply Last reply Reply Quote 0
                    • M
                      manrum1 @paul53 last edited by

                      on('mqtt.0.tele.pzem.SENSOR', function(dp) {
                          let strom = JSON.parse(dp.state.val).ENERGY;
                          if(strom['Total']) {
                              let val = parseInt(strom['Total']);
                              setState('0_userdata.0.Visualisierung.Strom.Energy_Total', val, true);
                          } if(strom['Yesterday']) {
                              let val = parseInt(strom['Yesterday']);
                              setState('0_userdata.0.Visualisierung.Strom.Energy_Yesterday', val, true);
                          } if(strom['Today']) {
                              let val = parseInt(strom['Today']);
                              setState('0_userdata.0.Visualisierung.Strom.Energy_Today', val, true);
                          } if(strom['Period']) {
                              let val = parseInt(strom['Period']);
                              setState('0_userdata.0.Visualisierung.Strom.Period', val, true);
                          } if(strom['Power']) {
                              let val = parseInt(strom['Power']);
                              setState('0_userdata.0.Visualisierung.Strom.Power', val, true);
                          } if(strom['ApparentPower']) {
                              let val = parseInt(strom['ApparentPower']);
                              setState('0_userdata.0.Visualisierung.Strom.ApparentPower', val, true);
                          }
                        });
                      
                      1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 @manrum1 last edited by

                        @manrum1 sagte:

                        ich bekomme nur ganzzahlige Werte

                        Lasse parseInt() weg, denn das Objekt enthält bereits Zahlen.

                        @manrum1 sagte in MQTT string Parsen:

                        Wie parse ich die Werte für die jeweilige Phasen,

                        Power und die folgenden Werte im Objekt sind Arrays (3 Phasen).

                                let val = strom['Power'][0]; // Phase 1
                        
                        M 1 Reply Last reply Reply Quote 0
                        • M
                          manrum1 @paul53 last edited by manrum1

                          @paul53 said in MQTT string Parsen:

                              let val = strom['Power'][0]; // Phase 1
                          

                          Hallo Paul, ich bin begeistert, danke für die schnelle Hilfe. Hab das Script noch nicht komplett, aber es funktioniert soweit. Was könnte ich noch optimieren?

                          on('mqtt.0.tele.pzem.SENSOR', function(dp) {
                              let strom = JSON.parse(dp.state.val).ENERGY;
                              if(strom['Total']) {
                                  let val = strom['Total'];
                                  setState('0_userdata.0.Visualisierung.Strom.Energy_Total', val, true);
                              } if(strom['Yesterday']) {
                                  let val = strom['Yesterday'];
                                  setState('0_userdata.0.Visualisierung.Strom.Energy_Yesterday', val, true);
                              } if(strom['Today']) {
                                  let val = strom['Today'];
                                  setState('0_userdata.0.Visualisierung.Strom.Energy_Today', val, true);
                              } if(strom['Period']) {
                                  let val = strom['Period'];
                                  setState('0_userdata.0.Visualisierung.Strom.Period', val, true);
                              } if(strom['Power']) {
                                  let val = strom['Power'][0];
                                  setState('0_userdata.0.Visualisierung.Strom.Power_Ph1', val, true);
                              } if(strom['Power']) {
                                  let val = strom['Power'][1];
                                  setState('0_userdata.0.Visualisierung.Strom.Power_Ph2', val, true);
                              } if(strom['Power']) {
                                  let val = strom['Power'][2];
                                  setState('0_userdata.0.Visualisierung.Strom.Power_Ph3', val, true);
                              } if(strom['ApparentPower']) {
                                  let val = strom['ApparentPower'][0];
                                  setState('0_userdata.0.Visualisierung.Strom.ApparentPower_Ph1', val, true);
                              } if(strom['ApparentPower']) {
                                  let val = strom['ApparentPower'][1];
                                  setState('0_userdata.0.Visualisierung.Strom.ApparentPower_Ph2', val, true);
                              } if(strom['ApparentPower']) {
                                  let val = strom['ApparentPower'][2];
                                  setState('0_userdata.0.Visualisierung.Strom.ApparentPower_Ph3', val, true);
                              }
                            });
                          
                          1 Reply Last reply Reply Quote 0
                          • M
                            Maniac2002 last edited by

                            Hello,

                            i have a problem and can not sole it.
                            Maybe someone can help me.

                            I have the following MQTT-String and like to parse alle Information of it.

                            {"StatusSNS":{"Time":"2022-08-22T01:03:00","ANALOG":{"A0":1024},"AM2301":{"Temperature":25.7,"Humidity":46.7,"DewPoint":13.4},"TempUnit":"C"}}

                            please can someone provide me a running JS-Script for IoBroker.

                            Thanks in advance and best regards
                            Maniac2002

                            Asgothian 1 Reply Last reply Reply Quote 0
                            • Asgothian
                              Asgothian Developer @Maniac2002 last edited by

                              @maniac2002

                              const mqttStr = {"StatusSNS":{"Time":"2022-08-22T01:03:00","ANALOG":{"A0":1024},"AM2301":{"Temperature":25.7,"Humidity":46.7,"DewPoint":13.4},"TempUnit":"C"}};
                              const mqttObj = JSON.parse(mqttStr)
                              

                              Now you can access the respective properties from the object. The following properties should exist:

                              mqttObj.StatusSNS - Object
                              mqttObj.StatusSNS.Time - String
                              mqttObj.StatusSNS.Analog - Object
                              mqttObj.StatusSNS.Analog.A0 - number
                              mqttObj.StatusSNS.AM2301 - Object
                              mqttObj.StatusSNS.AM2301.Temperature - Number
                              mqttObj.StatusSNS.AM2301.Humidity - Number
                              mqttObj.StatusSNS.AM2301.DewPoint - Number
                              mqttObj.StatusSNS.TempUnit - String
                              

                              A.

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              825
                              Online

                              31.9k
                              Users

                              80.1k
                              Topics

                              1.3m
                              Posts

                              5
                              14
                              3140
                              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