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 -> {Value: XX} im Wert

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    MQTT -> {Value: XX} im Wert

    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      Seeandfeel last edited by

      Hallo zusammen,

      jetzt brauche ich leider doch euer Hilfe bei folgendem Problem:

      Von meiner Heizung bekomme ich über ein Community Projekt (p4d -> Horchi) die Daten über MQTT nach IoBroker geliefert.
      Leider ist wohl irgendwo etwas falsch(?) konfiguriert, da die Werte zwar richtig angelegt werden aber im Feld "Wert" folgendes angelegt wird {"value": 61.5}. Das "value" erscheint leider in allen Feldern.

      Jetzt dachte ich mir, ich schicke mir die komplette JSON über MQTT und Parse hier einfach die Werte richtig. Leider ist das relativ neu für mich 😉 und ich komme nicht weiter.

      Folgende Daten habe ich:

      {"Heizung": {"Kesseltemperatur_0x0": {"value": 58.0}, "Status": {"value": "Heizen"}, "Abgastemperatur_0x1": {"value": 168.0}, "Betriebsmodus": {"value": "Automatik"}, "Boardtemperatur_0x2": {"value": 31.5}, "Uhrzeit": {"value": "Montag, 15. Feb. 2021 16:16:08"}, "Restsauerstoffgehalt_0x3": {"value": 9.1}, "Aussentemperatur_0x4": {"value": -0.5}, "Saugzugdrehzahl_0x7": {"value": 1954.0}, "Fuehler1_0x8": {"value": 79.0}, "LuftgeschwindigkeitinderAnsaugoeffnung_0xc": {"value": 1.41}, "Kesselstellgroesse_0x12": {"value": 100.0}, "Vorlauf-Isttemperatur_0x15": {"value": 56.0}, "Vorlauf-Solltemperatur_0x16": {"value": 53.0}, "Ansauglufttemperatur_0x60": {"value": 17.0}, "StromaufnahmederAustragschnecke_0x61": {"value": 0.01}, "FuellstandimPelletsbehaelter_0x71": {"value": 95.31}, "Einschub_0x74": {"value": 65.0}, "Sauerstoffregler_0x75": {"value": 65.0}, "Puffertemperaturoben_0x76": {"value": 52.5}, "PuffertemperaturMitte_0x77": {"value": 40.5}, "Puffertemperaturunten_0x78": {"value": 37.5}, "PufferpumpenAnsteuerung_0x8c": {"value": 52.0}, "Stromaufnahme24VDCPelletsmodul_0xa3": {"value": 0.274}, "BreitbandsondeHeizstrom_0xf3": {"value": 1.095}, "BreitbandsondeHeizungsSpannung_0xf4": {"value": 9.032}, "BreitbandsondeInnenwiderstand_0xf7": {"value": 299.0}, "Resetierbarerkg-Zaehler_0x111": {"value": 10.0}, "Resetierbarert-Zaehler_0x112": {"value": 4.0}}}
      

      Nach einigen lesen hier im Forum hab ich mal testweise so angefangen aber leider komme ich damit schon nicht weiter:

      var idJson = "mqtt.0.p4d2mqtt.sensor.P4.state";  // Datenpunkt-ID mit JSON-String
      var test = "javascript.0.testp4"; // Test DB
      
      function werteAuslesen(jsonStr) {
          var myJson = JSON.parse(jsonStr);
          var test = Heizung.Kesseltemperatur_0x0.value;
      }
      
      on({id:idJson,change:'ne'}, function (obj) {
          werteAuslesen(obj.state.val);
      });
      

      Das funktioniert aber schon nicht, weil:
      (2300) Error in callback: SyntaxError: Unexpected token in JSON at position 1366

      Stimm hier evtl. die JSON schon nicht? 1366 ist ja eine } der "Heizung"?

      Kann mir hier evtl. jmd. weiterhelfen?

      Danke und Grüße,

      Seeandfeel

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

        @seeandfeel

        function werteAuslesen(jsonStr) {
            var obj = JSON.parse(jsonStr).Heizung;
            var test = obj.Kesseltemperatur_0x0.value;
            log('Kesseltemperatur: ' + test);
        }
        
        S 1 Reply Last reply Reply Quote 0
        • S
          Seeandfeel @paul53 last edited by

          @paul53
          Vielen Dank für die schnelle Hilfe!

          Funktioniert aber leider noch nicht, ich bekomme vom mqtt Adapter und direkt gleich darauf folgende Fehler:

          javascript.0	2021-02-15 19:08:03.080	error	(2300) at processImmediate (internal/timers.js:439:21)
          javascript.0	2021-02-15 19:08:03.080	error	(2300) at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:5384:37)
          javascript.0	2021-02-15 19:08:03.079	error	(2300) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:472:25)
          javascript.0	2021-02-15 19:08:03.079	error	(2300) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1055:38)
          javascript.0	2021-02-15 19:08:03.079	error	(2300) at Object.<anonymous> (script.js.Parse.Parse_P4:11:5)
          javascript.0	2021-02-15 19:08:03.079	error	(2300) at werteAuslesen (script.js.Parse.Parse_P4:5:20)
          javascript.0	2021-02-15 19:08:03.078	error	(2300) at JSON.parse (<anonymous>:null:null)
          javascript.0	2021-02-15 19:08:03.077	error	(2300) Error in callback: SyntaxError: Unexpected token in JSON at position 1366
          mqtt.0	2021-02-15 19:08:03.070	error	(29487) Client [] Cannot parse {"Heizung": {"Kesseltemperatur_0x0": {"value": 65.5}, "Status": {"value": "Betriebsbereit"}, "Abgastemperatur_0x1": {"value": 64.0}, "Betriebsmodus": {"value": "Automati
          

          Ich verstehe "Unexpected token in JSON at position 1366" nicht. Die Klammern passen doch?

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

            @seeandfeel sagte: Die Klammern passen doch?

            Ja, wenn sie so kommen, wie im ersten Beitrag gezeigt. Prüfe es per log(obj.state.val).

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

              @paul53

              Die Daten hab ich 3x verglichen, sollten eigentlich gleich sein.

              Falls das so stimmt:

              var idJson = "mqtt.0.p4d2mqtt.sensor.P4.state";  // Datenpunkt-ID mit JSON-String
              var test = "javascript.0.testp4";
              
              function werteAuslesen(jsonStr) {
                  var obj = JSON.parse(jsonStr).Heizung;
                  var test = obj.Kesseltemperatur_0x0.value;
                  log(obj.state.val);
              }
              
              on({id:idJson,change:'ne'}, function (obj) {
                  werteAuslesen(obj.state.val);
              });
              

              Ergibt jetzt:
              (2300) Error in callback: SyntaxError: Unexpected token in JSON at position 1368
              -> nicht 67 sondern die Klammer bei 68. Ich verstehs nicht. 😞

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

                @seeandfeel sagte: Falls das so stimmt:

                Nein, so:

                var idJson = "mqtt.0.p4d2mqtt.sensor.P4.state";  // Datenpunkt-ID mit JSON-String
                var test = "javascript.0.testp4";
                 
                function werteAuslesen(jsonStr) {
                    var obj = JSON.parse(jsonStr).Heizung;
                    var test = obj.Kesseltemperatur_0x0.value;
                }
                 
                on({id:idJson,change:'ne'}, function (obj) {
                    log(obj.state.val);
                    werteAuslesen(obj.state.val);
                });
                

                So liefert das Log den kompletten JSON-String.

                @seeandfeel sagte in MQTT -> {Value: XX} im Wert:

                Unexpected token in JSON at position 1368

                Das ist das Ende des JSON. Kann da noch ein nicht sichtbares Sonderzeichen / Leerzeichen sein? Um das zu erkennen, füge im Log am Ende noch ein sichtbares Zeichen an:

                    log(obj.state.val + 'x');
                

                Versuche mal

                    werteAuslesen(obj.state.val.trim());
                
                S 1 Reply Last reply Reply Quote 0
                • S
                  Seeandfeel @paul53 last edited by

                  @paul53 sagte in MQTT -> {Value: XX} im Wert:

                  werteAuslesen(obj.state.val.trim());

                  Das mit dem "x" hat etwas weitergeholfen.. - im Debug hab ich ein Leerzeichen gesehen.

                  Wenn ich mir dann das MQTT Adapter Debug ansehe, findet sich folgendes:

                  Client [] Cannot parse {"Heizung": {"Kesseltemperatur_0x0": {"value": 71.0}, "Status": {"value": "Heizen"}, "Abgastemperatur_0x1": {"value": 187.0}, "Betriebsmodus": {"value": "Automatik"}, "Boardtemperatur_0x2": {"value": 38.0}, "Uhrzeit": {"value": "Dienstag, 16. Feb. 2021 11:06:33"}, "Restsauerstoffgehalt_0x3": {"value": 8.4}, "Aussentemperatur_0x4": {"value": 2.0}, "Saugzugdrehzahl_0x7": {"value": 1929.0}, "Fuehler1_0x8": {"value": 90.5}, "LuftgeschwindigkeitinderAnsaugoeffnung_0xc": {"value": 1.19}, "Kesselstellgroesse_0x12": {"value": 98.0}, "Vorlauf-Isttemperatur_0x15": {"value": 51.0}, "Vorlauf-Solltemperatur_0x16": {"value": 50.0}, "Ansauglufttemperatur_0x60": {"value": 33.0}, "StromaufnahmederAustragschnecke_0x61": {"value": 0.01}, "FuellstandimPelletsbehaelter_0x71": {"value": 82.64}, "Einschub_0x74": {"value": 59.0}, "Sauerstoffregler_0x75": {"value": 61.0}, "Puffertemperaturoben_0x76": {"value": 64.5}, "PuffertemperaturMitte_0x77": {"value": 60.0}, "Puffertemperaturunten_0x78": {"value": 51.5}, "PufferpumpenAnsteuerung_0x8c": {"value": 74.0}, "Stromaufnahme24VDCPelletsmodul_0xa3": {"value": 0.28}, "BreitbandsondeHeizstrom_0xf3": {"value": 1.085}, "BreitbandsondeHeizungsSpannung_0xf4": {"value": 9.047}, "BreitbandsondeInnenwiderstand_0xf7": {"value": 298.0}, "Resetierbarerkg-Zaehler_0x111": {"value": 50.0}, "Resetierbarert-Zaehler_0x112": {"value": 4.0}}}�
                  

                  2 Einträge später macht Iobroker daraus {"value": 4.0}}}� -> {"value": 4.0}}}\u0000" .

                  Ich hab das mal an den Entwickler weitergegeben, mal sehen ob er was findet.
                  Gibt es dazu evtl. einen Workaround?

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

                    @seeandfeel sagte: Gibt es dazu evtl. einen Workaround?

                    Hast Du es mal mit .trim() versucht?

                    werteAuslesen(obj.state.val.trim());
                    
                    S paul53 2 Replies Last reply Reply Quote 0
                    • S
                      Seeandfeel @paul53 last edited by

                      @paul53

                      Hatte ich auch probiert:

                      on({id:idJson,change:'ne'}, function (obj) {
                          log(obj.state.val);
                          werteAuslesen(obj.state.val.trim());
                      });
                      

                      Ergibt:

                      javascript.0	2021-02-16 11:52:38.276	error	(2300) at Object.<anonymous> (script.js.Parse.Parse_P4:11:5)
                      javascript.0	2021-02-16 11:52:38.276	error	(2300) at werteAuslesen (script.js.Parse.Parse_P4:5:20)
                      javascript.0	2021-02-16 11:52:38.275	error	(2300) at JSON.parse (<anonymous>:null:null)
                      javascript.0	2021-02-16 11:52:38.274	error	(2300) Error in callback: SyntaxError: Unexpected token in JSON at position 1366
                      

                      Ich hab jetzt gerade mal probiert (wohin? 🙂 ) sowas einzubauen:

                      json.replaceAll("\\u0000", "")
                      

                      oder gibt wohl auch ein:

                      str.replace
                      

                      Aber ich habe ehrlich gesagt wenig Ahnung von JAVA 😞 .

                      Gargano 1 Reply Last reply Reply Quote 0
                      • Gargano
                        Gargano @Seeandfeel last edited by Gargano

                        @seeandfeel

                        var x = obj.state.val;
                        x=x.replace('�','');
                        
                        S 1 Reply Last reply Reply Quote 0
                        • S
                          Seeandfeel @Gargano last edited by

                          @gargano

                          Auch dir gleich mal Danke @Gargano :

                          Um nichts falsch zu machen, hab das ganze jetzt so:

                          var idJson = "mqtt.0.p4d2mqtt.sensor.P4.state";  // Datenpunkt-ID mit JSON-String
                          var test = "javascript.0.testp4";
                          
                           
                          function werteAuslesen(jsonStr) {
                              var x = obj.state.val;
                              x=x.replace('�','');
                              var obj = JSON.parse(jsonStr).Heizung;
                              var test = obj.Kesseltemperatur_0x0.value;
                          }
                           
                          on({id:idJson,change:'ne'}, function (obj) {
                              log(obj.state.val);
                              werteAuslesen(obj.state.val);
                          });
                          

                          Json Parse Fehler "zum Ende" ist weg. Dafür jetzt:

                          javascript.0	2021-02-16 12:09:38.847	error	(2300) at Object.<anonymous> (script.js.Parse.Parse_P4:14:5)
                          javascript.0	2021-02-16 12:09:38.846	error	(2300) at werteAuslesen (script.js.Parse.Parse_P4:6:17)
                          javascript.0	2021-02-16 12:09:38.846	error	(2300) Error in callback: TypeError: Cannot read property 'state' of undefined
                          

                          Oh man.. 😞

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

                            @paul53 sagte: Workaround?

                            Verkürze mal den String um das letzte Zeichen:

                            var idJson = "mqtt.0.p4d2mqtt.sensor.P4.state";  // Datenpunkt-ID mit JSON-String
                            var test = "javascript.0.testp4";
                             
                            function werteAuslesen(jsonStr) {
                                var obj = JSON.parse(jsonStr).Heizung;
                                var test = obj.Kesseltemperatur_0x0.value;
                                log('Kesseltemperatur: ' + test + ' °C');
                            }
                            
                            on({id:idJson, change:'ne'}, function (obj) {
                                let str = obj.state.val;
                                let json = str.substr(0, str.length - 1);
                                werteAuslesen(json);
                            });
                            
                            S 1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 @Seeandfeel last edited by paul53

                              @seeandfeel sagte: Um nichts falsch zu machen, hab das ganze jetzt so:

                              So ist es falsch. Richtig:

                              var idJson = "mqtt.0.p4d2mqtt.sensor.P4.state";  // Datenpunkt-ID mit JSON-String
                              var test = "javascript.0.testp4";
                               
                              function werteAuslesen(jsonStr) {
                                  var obj = JSON.parse(jsonStr).Heizung;
                                  var test = obj.Kesseltemperatur_0x0.value;
                              }
                               
                              on({id:idJson,change:'ne'}, function (obj) {
                                  var json = obj.state.val.replace('�','');
                                  werteAuslesen(json);
                              });
                              
                              1 Reply Last reply Reply Quote 1
                              • S
                                Seeandfeel @paul53 last edited by

                                @paul53

                                Jetzttttt 😄 :

                                (2300) script.js.Parse.Parse_P4: Kesseltemperatur: 68 °C
                                

                                Super, echt Klasse!
                                Vielen Dank euch beiden, vor allem @paul53 .

                                Jetzt muss ichs nur noch schaffen das ganze in Objekte zu bringen. 😉 Mal sehen ob ich es hinbekomme..

                                Vielen Dank nochmal!

                                paul53 Gargano 2 Replies Last reply Reply Quote 0
                                • paul53
                                  paul53 @Seeandfeel last edited by

                                  @seeandfeel
                                  Mit welcher Methode funktioniert es jetzt? Verkürzen oder Ersetzen?

                                  1 Reply Last reply Reply Quote 0
                                  • Gargano
                                    Gargano @Seeandfeel last edited by Gargano

                                    @seeandfeel Paul war schneller, war grad Mittag essen.
                                    Zur Erklärung dieses Zeichens am Ende. Es handelt sich wohl hier um das String Ende Zeichen welches in C den Wert (hex) 0x0 hat. Fälschlicherweide wird wohl die Länge des Strings beim MQTT senden falsch berechnet und dieses Zeichen mitgesendet.

                                    1 Reply Last reply Reply Quote 0
                                    • S
                                      Seeandfeel last edited by Seeandfeel

                                      Oh, entschuldigt.. - vor lauter Freude die Lösung vergessen. 😉

                                      Funktioniert hat es jetzt mit:

                                       let json = str.substr(0, str.length - 1);
                                      

                                      Ersetzen hatte ich noch gar nicht probiert gehabt. Das hatte ich ganz übersehen.

                                      Das "var json = obj.state.val.replace('�','');" läuft auf:

                                      (2300) Error in callback: SyntaxError: Unexpected token in JSON at position 1364
                                      

                                      Vielen Dank auch für die Erklärung @Gargano ! Ich wollte nicht fragen bzw. euch noch mehr "belästigen" 😉 .
                                      Eigentlich versuchs ich ja echt selber zu lösen.. - aber bei JAVA setzt es (noch) bei mir aus. 😞

                                      Gernot Tauss 1 Reply Last reply Reply Quote 0
                                      • Gernot Tauss
                                        Gernot Tauss @Seeandfeel last edited by

                                        @seeandfeel Hi, könntest du mir das ganze Script schicken?

                                        lg

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

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        815
                                        Online

                                        31.7k
                                        Users

                                        79.8k
                                        Topics

                                        1.3m
                                        Posts

                                        4
                                        18
                                        1331
                                        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