Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Werte einzeln aus JSON extrahieren für Anfänger

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] Werte einzeln aus JSON extrahieren für Anfänger

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

      Hallo,

      ich habe leider noch nie so richtig mit Json gearbeitet bzw. das was ich bisher hatte habe ich immer mit Hilfe herausarbeiten können.

      Auch jetzt habe ich ein Problem das ich irgendwie lösen möchte, jedoch keinen richtigen Ansatz dafür finde.

      Ich bekomme aus meiner Heizung über den MQTT Adapter die Anlagenwerte als JSON String.

      Die sehen so aus:

      {"wWSelTemp":"60","wWActivated":"on","wWCurTmp":"61.0","wWHeat":"off","curFlowTemp":"40.4","retTemp":"40.4","burnGas":"on","heatPmp":"on","fanWork":"on","ignWork":"on","wWCirc":"off","selBurnPow":"100","curBurnPow":"0","sysPress":"1.0","boilTemp":"40.9","pumpMod":"55"}
      

      Jetzt möchte ich die gerne zerlegen und einzelne Datenpunkte erstellen die ich dann in VIS darstellen kann.

      Leider habe ich keine Ahnung wie ich das Umsetzen könnte.

      Ich habe zwar verstanden das ich das irgendwie mit "parse" machen kann, aber das war auch schon alles was mir dazu vorgekommen ist.

      Ich habe mal ein "Gerüst" erstellt, aber komme nicht weiter:

      
      var json = "mqtt.0.home.boiler.boiler_data"/*BoilerDaten*/;
      var Vorl = "javascript.0.Heizung.Vorlauf"/*Vorlauf*/;
      var Rueckl = "javascript.0.Heizung.Ruecklauf"/*Ruecklauf*/;
      var WWist = "javascript.0.Heizung.WarmwasserIst"/*Warmwasser Ist*/;
      var WWsoll = "javascript.0.Heizung.WarmwasserSoll"/*Warmwasser Soll*/;
      var Druck = "javascript.0.Heizung.Systemdruck"/*Systemdruck*/;
      var WWAn = "javascript.0.Heizung.WarmwasserAn"/*Warmwasser aktiv*/;
      
      obj = JSON.parse(json);
      
        var Vorl = obj.curFlowTemp;
        var Rueckl = obj.retTemp;
        var WWIst = obj.wWCurTmp;
        var WWsoll = obj.wWSelTemp;
        var Druck = obj.sysPress;
        var WWAn = obj.wWActivated;
      
         setState(Vorl,curFlowTemp);
         setState(Rueckl,retTemp);
         setState(WWIst,wWCurTmp);
         setState(WWsoll,wWSelTemp);
         setState(Druck,sysPress);
         setState(WWAn,wWActivated);
      
      

      Gibt es vielleicht jemanden der mir hier behilflich sein kann?

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

        
        var json = "mqtt.0.home.boiler.boiler_data"/*BoilerDaten*/;
        var Vorl = "javascript.0.Heizung.Vorlauf"/*Vorlauf*/;
        var Rueckl = "javascript.0.Heizung.Ruecklauf"/*Ruecklauf*/;
        var WWist = "javascript.0.Heizung.WarmwasserIst"/*Warmwasser Ist*/;
        var WWsoll = "javascript.0.Heizung.WarmwasserSoll"/*Warmwasser Soll*/;
        var Druck = "javascript.0.Heizung.Systemdruck"/*Systemdruck*/;
        var WWAn = "javascript.0.Heizung.WarmwasserAn"/*Warmwasser aktiv*/;
        
           var obj = JSON.parse(getState(json).val);
           setState(Vorl, parseFloat(obj.curFlowTemp));
           setState(Rueckl, parseFloat(obj.retTemp));
           setState(WWIst, parseFloat(obj.wWCurTmp));
           setState(WWsoll, parseFloat(obj.wWSelTemp));
           setState(Druck, parseFloat(obj.sysPress));
           setState(WWAn, obj.wWActivated);
        
        

        So werden die Werte nur einmal bei Skriptstart gesetzt, denn es fehlt ein Trigger.

        1 Reply Last reply Reply Quote 0
        • Chaot
          Chaot last edited by

          Ich habe das jetzt mal so versucht:

          on({id: 'mqtt.0.home.boiler.boiler_data', change: "any"}, function (obj) {
          
          var json = "mqtt.0.home.boiler.boiler_data"/*BoilerDaten*/;
          var Vorl = "javascript.0.Heizung.Vorlauf"/*Vorlauf*/;
          var Rueckl = "javascript.0.Heizung.Ruecklauf"/*Ruecklauf*/;
          var WWist = "javascript.0.Heizung.WarmwasserIst"/*Warmwasser Ist*/;
          var WWsoll = "javascript.0.Heizung.WarmwasserSoll"/*Warmwasser Soll*/;
          var Druck = "javascript.0.Heizung.Systemdruck"/*Systemdruck*/;
          var WWAn = "javascript.0.Heizung.WarmwasserAn"/*Warmwasser aktiv*/;
          
          try {obj = JSON.parse(getState('mqtt.0.home.boiler.boiler_data').val);
                 } catch (e) {
                         console.error('Cannot parse: ' + getState('mqtt.0.home.boiler.boiler_data').val);
                         return;
                  }
          
          Vorl = obj.curFlowTemp;
          Rueckl = obj.retTemp;
          WWIst = obj.wWCurTmp;
          WWsoll = obj.wWSelTemp;
          Druck = obj.sysPress;
          WWAn = obj.wWActivated;
          
             setState(Vorl,curFlowTemp);
             setState(Rueckl,retTemp);
             setState(WWIst,wWCurTmp);
             setState(WWsoll,wWSelTemp);
             setState(Druck,sysPress);
             setState(WWAn,wWActivated);
          
              });
          
          

          Aber es werden weder beim ersten och beim zweiten script die Werte gesetzt.

          Ich habe aber auch keinen Fehler im Log.

          1 Reply Last reply Reply Quote 0
          • Chaot
            Chaot last edited by

            Sorry,

            ich bin betriebsblind.

            Ich danke für dein Script.

            Beim Versuch habe ich jetzt einen Fehler erhalten:

            javascript.0	2018-10-17 23:39:50.942	error	at ContextifyScript.Script.runInContext (vm.js:59:29)
            javascript.0	2018-10-17 23:39:50.942	error	at script.js.Heizung.Versuch5:14:13
            javascript.0	2018-10-17 23:39:50.942	error	ReferenceError: WWIst is not defined
            javascript.0	2018-10-17 23:39:50.942	error	^
            javascript.0	2018-10-17 23:39:50.942	error	setState(WWIst, parseFloat(obj.wWCurTmp));
            javascript.0	2018-10-17 23:39:50.942	error	script.js.Heizung.Versuch5: script.js.Heizung.Versuch5:14
            
            1 Reply Last reply Reply Quote 0
            • paul53
              paul53 last edited by

              @Chaot:

              Beim Versuch habe ich jetzt einen Fehler erhalten:

              javascript.0	2018-10-17 23:39:50.942	error	setState(WWIst, parseFloat(obj.wWCurTmp));
              
              ```` `  
              

              Grund: Groß-/Kleinschreibung:

              var WWist = "javascript.0.Heizung.WarmwasserIst"/*Warmwasser Ist*/;
              
              
              1 Reply Last reply Reply Quote 0
              • Chaot
                Chaot last edited by

                Jaa,

                DAAAAANKE!

                Ich habe das jetzt ohne Fehler am laufen und es scheinen auch die Daten geschreiben zu werden.

                Habe ich den Trigger richtig gesetzt?

                Es soll nur bei einer Änderung aktualisiert werden:

                 on({id: 'mqtt.0.home.boiler.boiler_data', change: "any"}, function (obj) {
                
                var json = "mqtt.0.home.boiler.boiler_data"/*BoilerDaten*/;
                var Vorl = "javascript.0.Heizung.Vorlauf"/*Vorlauf*/;
                var Rueckl = "javascript.0.Heizung.Ruecklauf"/*Ruecklauf*/;
                var WWist = "javascript.0.Heizung.WarmwasserIst"/*Warmwasser Ist*/;
                var WWsoll = "javascript.0.Heizung.WarmwasserSoll"/*Warmwasser Soll*/;
                var Druck = "javascript.0.Heizung.Systemdruck"/*Systemdruck*/;
                var WWAn = "javascript.0.Heizung.WarmwasserAn"/*Warmwasser aktiv*/;
                
                   var obj1 = JSON.parse(getState(json).val);
                   setState(Vorl, parseFloat(obj.curFlowTemp));
                   setState(Rueckl, parseFloat(obj.retTemp));
                   setState(WWist, parseFloat(obj.wWCurTmp));
                   setState(WWsoll, parseFloat(obj.wWSelTemp));
                   setState(Druck, parseFloat(obj.sysPress));
                   setState(WWAn, obj.wWActivated);
                 });
                
                

                Die Daten kommen sonst im 10 Sekunden Takt.

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

                  Die IDs besser außerhalb des Triggers definieren und auf Änderung triggern:

                  var json = "mqtt.0.home.boiler.boiler_data"/*BoilerDaten*/;
                  var Vorl = "javascript.0.Heizung.Vorlauf"/*Vorlauf*/;
                  var Rueckl = "javascript.0.Heizung.Ruecklauf"/*Ruecklauf*/;
                  var WWist = "javascript.0.Heizung.WarmwasserIst"/*Warmwasser Ist*/;
                  var WWsoll = "javascript.0.Heizung.WarmwasserSoll"/*Warmwasser Soll*/;
                  var Druck = "javascript.0.Heizung.Systemdruck"/*Systemdruck*/;
                  var WWAn = "javascript.0.Heizung.WarmwasserAn"/*Warmwasser aktiv*/;
                  
                  on(json, function(dp) {
                     var obj = JSON.parse(dp.state.val);
                     setState(Vorl, parseFloat(obj.curFlowTemp));
                     setState(Rueckl, parseFloat(obj.retTemp));
                     setState(WWist, parseFloat(obj.wWCurTmp));
                     setState(WWsoll, parseFloat(obj.wWSelTemp));
                     setState(Druck, parseFloat(obj.sysPress));
                     setState(WWAn, obj.wWActivated);
                  });
                  
                  
                  1 Reply Last reply Reply Quote 0
                  • Chaot
                    Chaot last edited by

                    Danke schön.

                    Das funktioniert perfekt und ich bin wirklich glücklich das Forum hier zu haben mit solchen Spitzenleuten.

                    1 Reply Last reply Reply Quote 0
                    • B
                      Beowolf last edited by

                      Ich habe das gleiche Problem hier.

                      Das ist der Datenpunkt

                      mqtt.1.tele.Sonoff.SENSOR
                      

                      Das steht im Datenpunkt

                      {"Time":"2024-08-28T12:49:04","BME280":{"Temperature":26.1,"Humidity":48.1,"DewPoint":14.2,"Pressure":1011.2},"PressureUnit":"hPa","TempUnit":"C"}
                      

                      Das ist mein Skript

                      on({id: 'mqtt.1.tele.Sonoff.SENSOR', change: "any"}, function (obj) {
                      
                      var json = "mqtt.1.tele.Sonoff.SENSOR"/*Werbefenster*/;
                      var Temperature = "javascript.0.Werbekasten.Temperatur"/*Temperatur*/;
                      var Humidity = "javascript.0.Werbekasten.Luftfeuchte"/*Luftfeuchte*/;
                      var DewPoint = "javascript.0.Werbekasten.Taupunkt"/*Taupunkt*/;
                      var Pressure = "javascript.0.Werbekasten.Luftdruck"/*Luftdruck*/;
                       
                      on(json, function(dp) {
                         var obj = JSON.parse(dp.state.val);
                         setState(Temperature, parseFloat(obj.Temperature));
                         setState(Humidity, parseFloat(obj.Humidity));
                         setState(DewPoint, parseFloat(obj.DewPoint));
                         setState(Pressure, parseFloat(obj.Pressure));
                      });
                      

                      Als Fehlermeldung kommt das

                      28.8.2024, 13:54:09.343	[info ]: javascript.0 (23058) Stopping script script.js.common.Werbekasten
                      28.8.2024, 13:54:09.387	[info ]: javascript.0 (23058) Start JavaScript script.js.common.Werbekasten (Javascript/js)
                      28.8.2024, 13:54:09.387	[error]: javascript.0 (23058) script.js.common.Werbekasten compile failed: at script.js.common.Werbekasten:21
                      

                      Die Fehlermeldung sagt mir nicht viel. Datenpunkte werden auch nicht gefüllt.

                      Was mache ich da falsch?

                      Danke

                      haus-automatisierung paul53 2 Replies Last reply Reply Quote 0
                      • haus-automatisierung
                        haus-automatisierung Developer Most Active @Beowolf last edited by haus-automatisierung

                        @beowolf sagte in [gelöst] Werte einzeln aus JSON extrahieren für Anfänger:

                        Die Fehlermeldung sagt mir nicht viel.

                        Die sagt in diesem Fall aus, dass Du offene Klammern hast welche nicht geschlossen werden (die erste Zeile ist Quatsch).

                        @beowolf sagte in [gelöst] Werte einzeln aus JSON extrahieren für Anfänger:

                        Was mache ich da falsch?

                        Du hast eine Eben im Objekt vergessen. So formatiert sieht man es besser:

                        {
                            "Time": "2024-08-28T12:49:04",
                            "BME280": {
                                "Temperature": 26.1,
                                "Humidity": 48.1,
                                "DewPoint": 14.2,
                                "Pressure": 1011.2
                            },
                            "PressureUnit": "hPa",
                            "TempUnit": "C"
                        }
                        

                        So. parseFloat brauchst Du nicht (ist ja kein String und alles schon im richtigen Format).

                        const jsonObjId = 'mqtt.1.tele.Sonoff.SENSOR';
                        
                        const temperatureObjId = 'javascript.0.Werbekasten.Temperatur';
                        const humidityObjId = 'javascript.0.Werbekasten.Luftfeuchte';
                        const dewPointObjId = 'javascript.0.Werbekasten.Taupunkt';
                        const pressureObjId = 'javascript.0.Werbekasten.Luftdruck';
                        
                        on({ id: jsonObjId, change: 'ne' }, (dp) => {
                           const obj = JSON.parse(dp.state.val);
                        
                           setState(temperatureObjId, obj.BME280.Temperature);
                           setState(humidityObjId, obj.BME280.Humidity);
                           setState(dewPointObjId, obj.BME280.DewPoint);
                           setState(Pressure, obj.BME280.Pressure);
                        });
                        
                        1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 @Beowolf last edited by paul53

                          @beowolf sagte: Das ist mein Skript

                          Zeile 1 ist zu viel. "BME280" fehlt. Wandlung nach Zahl ist nicht nötig.

                          const idJson = "mqtt.1.tele.Sonoff.SENSOR"/*Werbefenster*/;
                          const idTemperature = "javascript.0.Werbekasten.Temperatur"/*Temperatur*/;
                          const idHumidity = "javascript.0.Werbekasten.Luftfeuchte"/*Luftfeuchte*/;
                          const idDewPoint = "javascript.0.Werbekasten.Taupunkt"/*Taupunkt*/;
                          const idPressure = "javascript.0.Werbekasten.Luftdruck"/*Luftdruck*/;
                           
                          on(idJson, function(dp) {
                             const obj = JSON.parse(dp.state.val).BME280;
                             setState(idTemperature, obj.Temperature, true);
                             setState(idHumidity, obj.Humidity, true);
                             setState(idDewPoint, obj.DewPoint, true);
                             setState(idPressure, obj.Pressure, true);
                          });
                          

                          Eigene Datenpunkte erstelle besser unter "0_userdata.0" (gab es 2018 noch nicht).

                          B 1 Reply Last reply Reply Quote 1
                          • B
                            Beowolf @paul53 last edited by

                            @paul53

                            Vielen Dank jetzt sind die Werte da.

                            Das mit "0_userdata.0" mache ich noch. Ich wollte nicht so viel verändern. 😊

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

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            642
                            Online

                            31.7k
                            Users

                            79.7k
                            Topics

                            1.3m
                            Posts

                            4
                            12
                            2080
                            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