Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Json aus Rest Api URL von Solaranalge

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Json aus Rest Api URL von Solaranalge

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

      Hallo ich habe den tollen Adapter für Solarwatt, leider ist bei mir irgenwo der Wurm drin.
      Deshalb möchte ich gerne einige Werte per JavaScript abfragen.
      Ich habe das mit der Verschachtelung im Json in iobroker nicht verstanden.
      Kann mir da jemand weiter helfen?

      Das ist das JSON der Seite:

      [
          {
              "id": "xxxxxxx",
              "name": "PV-Anlage",
              "deviceClass": "com.kiwigrid.devices.pvplant.PVPlant",
              "powerACOut": 0
          },
          {
              "id": "urn:kiwigrid:location:xxxxxx",
              "name": "Standort 1",
              "deviceClass": "com.kiwigrid.devices.location.Location",
              "powerConsumed": 3445.4679999999985,
              "powerProduced": 0,
              "powerIn": 844,
              "powerOut": 0
          }
      ]
      

      Hier mein zusammengeklebtest JavaScript 🙂

      var url = 'http://192.168.xxx.xxx/rest/kiwigrid/eps/powerValues';
      var path = "solarwatt.";
      var idpowerACOut = path + "powerACOut";
      var idpowerConsumed = path + "powerConsumed";
      
      var request = require("request");
      var myJson = {};
      
      createState(idpowerACOut, 0, {
          name: 'powerACOut aus',
          desc: 'xxxx',
          type: 'number',
          role: 'value'
      });
      createState(idpowerConsumed, 0, {
          name: 'powerConsumed alles',
          desc: 'xxxx',
          type: 'number',
          role: 'value'
      });
      
      function parseJson(text) {
          if (text === "") return {};
          try {
              json = JSON.parse(text);
          } catch (ex) {
              json = {};
          }
          if(!json) json = {};
          return json;
      }
      
      function readJson(url, callback) {
          request(url, function (err, state, body){
              if (body) {
                  var json = parseJson(body);
                  callback(null, json);
              } else {
                  var error = "(" + err + ") ERROR bei Abfrage von: " + url;
                  log(error, "warn");  
                  callback(error, null);
              }
          });
      }
      
      function main() {
          readJson(url, function(err,json) {
              if(!err) {
              myJson = json;
                  log("powerACOut: " + myJson.powerACOut,"info");
                  log("powerConsumed: " + myJson.powerConsumed,"info");
                  setState(idpowerACOut ,parseInt(myJson.powerACOut));
                  setState(idpowerConsumed ,parseFloat(myJson.powerConsumed));
              } else {
              log("Error reading JSON from solarwatt. No data!","warn");
              myJson = {};
              }
      });
      }
      
      

      Im Log steht dann das und es kommen natürlich keine Werte an

      10:33:02.353	info	javascript.0 script.js.xxx.json91: powerACOut: undefined
      10:33:02.353	info	javascript.0 script.js.xxx.json91: powerConsumed: undefined
      

      Alles was im im Browser oder der JavaScript Editor funktioniert, will im iobroker nicht...

      [1]["powerConsumed"]
      [1].powerConsumed
      1.powerConsumed
      
      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @lutzer last edited by

        @lutzer
        JSON (String) muss erst in ein Objekt gewandelt werden (Zeile 49), um auf die Eigenschaften zugreifen zu können.

                myJson = JSON.parse(json);
        
        1 Reply Last reply Reply Quote 0
        • L
          lutzer last edited by lutzer

          @paul53 said in Json aus Rest Api URL von Solaranalge:

              myJson = JSON.parse(json);
          

          OK hab ich getausch, klappt leider noch nicht.

          Hier das Log

          11:08:05.526	error	javascript.0 script.js.xxx.json91: SyntaxError: Unexpected token o in JSON at position 1
          11:08:05.526	error	javascript.0 at script.js.xxx.json91:49:28
          11:08:05.526	error	javascript.0 at Request._callback (script.js.xxx.json91:37:13)
          

          Wenn ich folgendes verwende bekomme ich auch Daten:

          log("powerACOut: " + myJson[0].powerACOut,"info");
          an Stelle von
          log("powerACOut: " + myJson.powerACOut,"info");
          

          Das müsste es ja sein, steht auch kein Fehler in der Log (außer wenn ich jetzt " myJson = JSON.parse(json);" verwende.

          11:17:14.485	info	javascript.0 Start javascript script.js.xxx.json91
          11:17:14.485	info	javascript.0 script.js.xxx.json91: registered 0 subscriptions and 1 schedule
          11:17:15.058	info	javascript.0 script.js.xxx.json91: powerACOut: 1252.3125999999997
          11:17:15.058	info	javascript.0 script.js.xxx.json91: powerConsumed: 780
          
          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @lutzer last edited by paul53

            @lutzer sagte:

            steht auch kein Fehler in der Log (außer wenn ich jetzt " myJson = JSON.parse(json);" verwende.

            Dann ist es kein JSON, sondern bereits ein Objekt. Sehe gerade: Das Parsen passiert bereits in der Funktion readJson().

            Zeilen 52, 53 müssten dann so funktionieren:

                         setState(idpowerACOut, parseInt(myJson[0].powerACOut));
                         setState(idpowerConsumed, parseFloat(myJson[1].powerConsumed));
            
            1 Reply Last reply Reply Quote 1
            • L
              lutzer last edited by

              @paul53 said in Json aus Rest Api URL von Solaranalge:

              Ja genau so klappt es DANKE.

              Ich habe da noch einen wieteren Link der etwas mehr verschachtelt ist.
              Irgendwie komme ich da mit "[4]" nicht weiter:
              Ich möchte die "282" haben:

              {
                  "result": {
                       "items": [
                          {
                          "tagValues": {
                              "PowerIn": {
                              "tagName": "PowerIn",
                              "guid": "urn:solarwatt:myreserve:pm:xxxxxxxx",
                              "value": 282
                              },
              
                          log("PowerIn: " + myJson[4].PowerIn,"info");
                          setState(idDPowerIn ,parseInt(myJson[4].PowerIn));
              

              Der Pfad im Browser sagt: result.items[0].tagValues.PowerIn.value

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

                @lutzer sagte:

                Der Pfad im Browser sagt: result.items[0].tagValues.PowerIn.value

                Enthält myJson schon das Objekt oder JSON ? Für das Objekt sollte es so funktionieren:

                myJson.result.items[0].tagValues.PowerIn.value
                

                parseInt() ist nicht erforderlich, denn es ist bereits eine Zahl.

                1 Reply Last reply Reply Quote 0
                • L
                  lutzer last edited by lutzer

                  Alles Gut habe mich in der Funktion vertan.
                  ES geht genau so.
                  Vielen Dank!

                  Sehr cool das man den phat aus dem Browser nehmen kann.

                  1 Reply Last reply Reply Quote 0
                  • L
                    lutzer last edited by

                    Ich hab da heute Morgen ein neues Problem bekommen.
                    Diese Nacht wurde die Firmware vom Energymanager geupdatet und die Struktur der Json verändert.

                    Kann man das irgendwie anders abfangen, durch suchen oder ähnliches?

                    //alt:
                                setState(idDPowerSelfSupplied ,myJson.result.items[1].tagValues.PowerSelfSupplied.value);
                                log("PowerConsumedFromStorage: " + myJson.result.items[1].tagValues.PowerConsumedFromStorage.value,"info");
                    //neu:
                                setState(idDPowerSelfSupplied ,myJson.result.items[5].tagValues.PowerSelfSupplied.value);
                                log("PowerConsumedFromStorage: " + myJson.result.items[5].tagValues.PowerConsumedFromStorage.value,"info");
                    

                    Was unschön ist das manche Bezeichnungen sich etwas gleichen:

                    "StateOfCharge": //gesucht
                    "StateOfChargeReactivateDischarging": //nicht gesucht
                    "StateOfChargeMinimum": //nicht gesucht
                    "StateOfChargeShutDownLimit": //nicht gesucht
                    
                    paul53 1 Reply Last reply Reply Quote 0
                    • paul53
                      paul53 @lutzer last edited by paul53

                      @lutzer sagte:

                      abfangen, durch suchen oder ähnliches?

                      var arr = myJson.result.items;
                      
                      for(let i = 0; i < arr.length; i++) {
                          if(arr[i].tagValues) {
                              let tags = arr[i].tagValues;
                              if(tags.PowerSelfSupplied) {
                                  log(tags.PowerSelfSupplied.value);
                              }
                              if(tags.PowerConsumedFromStorage) {
                                  log(tags.PowerConsumedFromStorage.value);
                              }
                          }
                      }
                      
                      1 Reply Last reply Reply Quote 0
                      • L
                        lutzer last edited by lutzer

                        Könntest du mir bitte helfen wo ich die Schleife einbauen muss?
                        Ich denke ich habe es gefunden. Aber wenn du noch mal drüber schauen würdest wär ich dankbar.

                        Hier der aktuelle Code:

                        //...Teil der Funktion
                            readJson(urlDevices, function(err,json) {
                                if(!err) {       
                                    myJson = json;
                                var arr = myJson.result.items;
                                    for(let i = 0; i < arr.length; i++) {
                                        if(arr[i].tagValues) {
                                            let tags = arr[i].tagValues;
                                              if(tags.PowerIn) {
                                                log(tags.PowerIn.value);
                                                setState(idDPowerIn ,tags.PowerIn.value);
                                            }                  
                                            if(tags.PowerSelfSupplied) {
                                                log(tags.PowerSelfSupplied.value);
                                                setState(idDPowerSelfSupplied ,tags.PowerSelfSupplied.value);
                                            }
                        //...usw
                        
                        //der alte Code
                        var urlValues = 'http://192.168.xxx.xxx/rest/kiwigrid/eps/powerValues';
                        var urlDevices = 'http://192.168.xxx.xxx/rest/kiwigrid/wizard/devices';
                        var path = "solarwatt.";
                        
                        var request = require("request");
                        var myJson = {};
                        
                        //Values
                        var idpowerACOut = path + "powerACOut";
                        var idpowerConsumed = path + "powerConsumed";
                        var idpowerProduced = path + "powerProduced";
                        var idpowerIn = path + "powerIn";
                        var idpowerOut = path + "powerOut";
                        
                        createState(idpowerACOut, 0, { name: 'powerACOut aus', desc: 'xxxx', type: 'number', role: 'value'});
                        createState(idpowerConsumed, 0, { name: 'Gesamtverbrauch', desc: 'xxxx', type: 'number', role: 'value'});
                        createState(idpowerProduced, 0, { name: 'powerProduced', desc: 'xxxx', type: 'number', role: 'value'});
                        createState(idpowerIn, 0, { name: 'powerIn', desc: 'xxxx', type: 'number', role: 'value'});
                        createState(idpowerOut, 0, { name: 'powerOut', desc: 'xxxx', type: 'number', role: 'value'});
                        
                        //Devices
                        var idDPowerIn = path + "PowerInD";
                        var idDPowerSelfSupplied = path + "PowerSelfSupplied";
                        var idDPowerConsumedFromStorage = path + "PowerConsumedFromStorage";
                        var idDStateOfCharge = path + "StateOfCharge";
                        var idDPowerConsumedFromGrid = path + "PowerConsumedFromGrid";
                        var idDPowerBuffered = path + "PowerBuffered";
                        var idDPowerConsumedFromProducers = path + "PowerConsumedFromProducers";
                        
                        createState(idDPowerSelfSupplied, 0, { name: 'Eigenverbrauch', desc: 'xxxx', type: 'number', role: 'value' });
                        createState(idDPowerIn, 0, { name: 'Stromzukauf', desc: 'xxxx', type: 'number', role: 'value' });
                        createState(idDPowerConsumedFromStorage, 0, { name: 'Batterieversorgung', desc: 'xxxx', type: 'number', role: 'value' });
                        createState(idDStateOfCharge, 0, { name: 'Ladestand', desc: 'xxxx', type: 'number', role: 'value' });
                        createState(idDPowerConsumedFromGrid, 0, { name: 'Netzbezug', desc: 'xxxx', type: 'number', role: 'value' });
                        createState(idDPowerBuffered, 0, { name: 'Batterieaufladung', desc: 'xxxx', type: 'number', role: 'value' });
                        createState(idDPowerConsumedFromProducers, 0, { name: 'Eigenverbrauch', desc: 'xxxx', type: 'number', role: 'value' });
                        
                        
                        function parseJson(text) {
                            if (text === "") return {};
                            try { json = JSON.parse(text); } 
                            catch (ex) { json = {};}
                            if(!json) json = {};
                            return json; }
                        
                        function readJson(url, callback) {
                            request(url, function (err, state, body){
                                if (body) {
                                    var json = parseJson(body);
                                    callback(null, json);
                                } else { var error = "(" + err + ") ERROR bei Abfrage von: " + url; log(error, "warn"); callback(error, null);}
                                    });}
                        
                        
                        function main() {
                            readJson(urlValues, function(err,json) {
                                if(!err) {        
                                     myJson = json;
                                    log("powerACOut: " + myJson[0].powerACOut,"info");
                                    log("powerConsumed: " + myJson[1].powerConsumed,"info");
                                    log("powerProduced: " + myJson[1].powerProduced,"info");
                                    log("powerIn: " + myJson[1].powerIn,"info");
                                    log("powerOut: " + myJson[1].powerOut,"info");
                                    setState(idpowerACOut ,parseInt(myJson[0].powerACOut));
                                    setState(idpowerConsumed ,parseInt(myJson[1].powerConsumed));
                                    setState(idpowerProduced ,parseInt(myJson[1].powerProduced));
                                    setState(idpowerIn ,parseInt(myJson[1].powerIn));
                                    setState(idpowerOut ,parseInt(myJson[1].powerOut));
                                } else {
                                log("Error reading JSON from solarwatt. No data!","warn");
                                myJson = {};
                                }
                        });
                            readJson(urlDevices, function(err,json) {
                                if(!err) {       
                                    myJson = json;
                                    log("PowerIn: " + myJson.result.items[2].tagValues.PowerIn.value,"info");
                                    setState(idDPowerIn ,myJson.result.items[2].tagValues.PowerIn.value);
                                    log("PowerSelfSupplied: " + myJson.result.items[5].tagValues.PowerSelfSupplied.value,"info");
                                    setState(idDPowerSelfSupplied ,myJson.result.items[5].tagValues.PowerSelfSupplied.value);
                                    log("PowerConsumedFromStorage: " + myJson.result.items[5].tagValues.PowerConsumedFromStorage.value,"info");
                                    setState(idDPowerConsumedFromStorage ,myJson.result.items[5].tagValues.PowerConsumedFromStorage.value);
                                    log("StateOfCharge: " + myJson.result.items[10].tagValues.StateOfCharge.value,"info");
                                    setState(idDStateOfCharge ,myJson.result.items[10].tagValues.StateOfCharge.value);
                                    log("PowerConsumedFromGrid: " + myJson.result.items[5].tagValues.PowerConsumedFromGrid.value,"info");
                                    setState(idDPowerConsumedFromGrid ,myJson.result.items[5].tagValues.PowerConsumedFromGrid.value);
                                    log("PowerBuffered: " + myJson.result.items[5].tagValues.PowerBuffered.value,"info");
                                    setState(idDPowerBuffered ,myJson.result.items[5].tagValues.PowerBuffered.value);
                                    log("PowerConsumedFromProducers: " + myJson.result.items[5].tagValues.PowerConsumedFromProducers.value,"info");
                                    setState(idDPowerConsumedFromProducers ,myJson.result.items[5].tagValues.PowerConsumedFromProducers.value);
                                } else {
                                log("Error reading JSON from solarwatt. No data!","warn");
                                myJson = {};
                                }
                        });
                        }
                        
                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        1.1k
                        Online

                        31.7k
                        Users

                        79.7k
                        Topics

                        1.3m
                        Posts

                        3
                        10
                        1687
                        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