Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Huawei Sun2000 & ioBroker via JS script funktioniert

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    Huawei Sun2000 & ioBroker via JS script funktioniert

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

      @badsnoopy667
      kannst du mir vielleicht sagen, was der Unterschid zwischen
      AktivePower und InputPower ist?
      Was von beiden kommt bei mir im Zählerkasten an?

      1 Reply Last reply Reply Quote 0
      • J
        juggi1962 @badsnoopy667 last edited by

        @badsnoopy667 sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

        @juggi1962
        Ja, das sollten die beiden Zeilen sein. Die brauchst Du nur, wenn du die beiden Register abfragen willst. Aber wie gesagt: Da steht meiner Meinung nach nix wirklich wichtiges drin. Wenn es also nicht klappt, würde ich die einfach nicht abfragen und gut ist.

        Hmmmmmmmmmmm das ausklammern hat nichts gebracht die Fehlermeldungen kommen trotzdem

        javascript.0
        2023-03-13 13:18:07.967	warn	script.js.Neu.PV_Anlage.Modbus_Huawei_Sun2000_neu: Error received reading address 32000 from id: 1 with error: undefined
        
        2023-03-13 13:17:04.965	warn	script.js.Neu.PV_Anlage.Modbus_Huawei_Sun2000_neu: Error received reading address 37100 from id: 1 with error: undefined
        
        
        2023-03-13 13:16:01.958	warn	script.js.Neu.PV_Anlage.Modbus_Huawei_Sun2000_neu: Error received reading address 32000 from id: 1 with error: undefined
        

        Was nun ?? Gruß Jürgen

        B 1 Reply Last reply Reply Quote 0
        • B
          badsnoopy667 @juggi1962 last edited by

          @juggi1962
          Ja, ich glaube da war ich etwas zu schnell.
          Ich glaube diese Zeile hier muss auch angepasst werden, weiß aber nicht genau wie:

          const registerSpacesToReadContinuously = [[37100, 114], [32000, 116]];
          
          1 Reply Last reply Reply Quote 0
          • Alex Warkentin
            Alex Warkentin @juggi1962 last edited by

            @juggi1962 said in Huawei Sun2000 & ioBroker via JS script funktioniert:

            @alex-warkentin
            Danke, hab das gerade gemacht und werde es heute beobachten.
            Wenn ich weiterhin lästig sein darf geb ich dir falls was daher kommt Bescheid.
            Gruß Jürgen.

            So nun sind die ersten Fehlermeldungen gekommen und zwar

            Error received reading address 37100 from id: 1 with error: 6
            Error received reading address 32000 from id: 1 with error: 6
            

            Gruß Jürgen

            Error 6 ist verkraftbar. Kommt bei mir auch zwischendurch mal vor. Bedeutet, dass der Client busy ist. Du könntest vielleicht das Abfrageintervall erhöhen.

            Die undefined Fehler, die du später gepostet hast, sind sie mit der letzten Änderung (nur errorcode) erfolgt, oder hast du es wieder rückgängig gemacht?

            J 1 Reply Last reply Reply Quote 0
            • J
              juggi1962 @Alex Warkentin last edited by

              @alex-warkentin sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

              @juggi1962 said in Huawei Sun2000 & ioBroker via JS script funktioniert:

              @alex-warkentin
              Danke, hab das gerade gemacht und werde es heute beobachten.
              Wenn ich weiterhin lästig sein darf geb ich dir falls was daher kommt Bescheid.
              Gruß Jürgen.

              So nun sind die ersten Fehlermeldungen gekommen und zwar

              Error received reading address 37100 from id: 1 with error: 6
              Error received reading address 32000 from id: 1 with error: 6
              

              Gruß Jürgen

              Error 6 ist verkraftbar. Kommt bei mir auch zwischendurch mal vor. Bedeutet, dass der Client busy ist. Du könntest vielleicht das Abfrageintervall erhöhen.

              Die undefined Fehler, die du später gepostet hast, sind sie mit der letzten Änderung (nur errorcode) erfolgt, oder hast du es wieder rückgängig gemacht?

              @alex-warkentin
              ich hab es zwischenzeitlich wieder rückgängig gemacht

              Alex Warkentin 1 Reply Last reply Reply Quote 0
              • Alex Warkentin
                Alex Warkentin @juggi1962 last edited by

                @juggi1962 said in Huawei Sun2000 & ioBroker via JS script funktioniert:

                @alex-warkentin sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

                @juggi1962 said in Huawei Sun2000 & ioBroker via JS script funktioniert:

                @alex-warkentin

                Error 6 ist verkraftbar. Kommt bei mir auch zwischendurch mal vor. Bedeutet, dass der Client busy ist. Du könntest vielleicht das Abfrageintervall erhöhen.

                Die undefined Fehler, die du später gepostet hast, sind sie mit der letzten Änderung (nur errorcode) erfolgt, oder hast du es wieder rückgängig gemacht?

                @alex-warkentin
                ich hab es zwischenzeitlich wieder rückgängig gemacht

                Du solltest das mit der Änderung laufen lassen, damit du die Fehlercodes bekommst. Wie gesagt, 6 kannst du erstmal ignorieren.

                Das mit dem Auskommentieren der Arrays macht keinen Sinn. Dann rufst du nichts mehr ab.

                J 1 Reply Last reply Reply Quote 0
                • J
                  juggi1962 @Alex Warkentin last edited by juggi1962

                  @alex-warkentin sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

                  @juggi1962 said in Huawei Sun2000 & ioBroker via JS script funktioniert:

                  @alex-warkentin sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

                  @juggi1962 said in Huawei Sun2000 & ioBroker via JS script funktioniert:

                  @alex-warkentin

                  Error 6 ist verkraftbar. Kommt bei mir auch zwischendurch mal vor. Bedeutet, dass der Client busy ist. Du könntest vielleicht das Abfrageintervall erhöhen.

                  Die undefined Fehler, die du später gepostet hast, sind sie mit der letzten Änderung (nur errorcode) erfolgt, oder hast du es wieder rückgängig gemacht?

                  @alex-warkentin
                  ich hab es zwischenzeitlich wieder rückgängig gemacht

                  Du solltest das mit der Änderung laufen lassen, damit du die Fehlercodes bekommst. Wie gesagt, 6 kannst du erstmal ignorieren.

                  Das mit dem Auskommentieren der Arrays macht keinen Sinn. Dann rufst du nichts mehr ab.

                  Okay, hab es wieder umgestellt und werde es weiter beobachten.
                  Danke noch mal für deine Bemühungen und Hilfe.
                  Ach ja, kannst du mir vielleicht noch sagen, was der Unterschid zwischen
                  AktivePower und InputPower ist?
                  Was von beiden kommt bei mir im Zählerkasten an?
                  Schönen Abend, Gruß Jürgen

                  Alex Warkentin 1 Reply Last reply Reply Quote 0
                  • Alex Warkentin
                    Alex Warkentin @juggi1962 last edited by

                    @juggi1962
                    Ich nutze eigentlich nur die Infos von Smart Meter. Die active power dort zeigt dir den aktuellen Überschuss oder Bezug. Nagel mich daher nicht darauf fest, aber ich denke Active Power ist das was der WR aktuell in liefert und Input Power müsste das sein, was von den Modulen in den WR geht

                    J 1 Reply Last reply Reply Quote 0
                    • J
                      juggi1962 @Alex Warkentin last edited by

                      @alex-warkentin sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

                      @juggi1962
                      Ich nutze eigentlich nur die Infos von Smart Meter. Die active power dort zeigt dir den aktuellen Überschuss oder Bezug. Nagel mich daher nicht darauf fest, aber ich denke Active Power ist das was der WR aktuell in liefert und Input Power müsste das sein, was von den Modulen in den WR geht

                      Okay, Danke

                      baumiliciousnessss 1 Reply Last reply Reply Quote 0
                      • baumiliciousnessss
                        baumiliciousnessss @juggi1962 last edited by

                        Hallo zusammen,
                        gerade ist der SUN2000 in Betrieb gegangen mit 10kwh und 11kwp
                        Was ist denn der aktuelle Stand hier ? hat es jemand am Laufen?

                        J 1 Reply Last reply Reply Quote 0
                        • J
                          juggi1962 @baumiliciousnessss last edited by juggi1962

                          @baumiliciousnessss
                          Ja, ich habe das Skript von @Alex-Warkentin und das funktioniert jetzt.
                          Er hat das Original Skript ein wenig abgespeckt und den Batterie Teil rausgenommen da er und ich keine Haben.

                          
                          
                          // License: Beerware! Do what ever you like with this, but I'm not liable for anything that you do with it.
                          
                          // If you like this code, feel free to buy me a beer ...
                          
                          // Have fun with it! der Kachel
                          
                          // @ts-ignore
                          
                          var modbusRTU = require("modbus-serial");
                          
                          var client = new modbusRTU();
                          
                           
                          
                          var modbusErrorMessages = [
                          
                              "Unknown error",
                          
                              "Illegal function (device does not support this read/write function)",
                          
                              "Illegal data address (register not supported by device)",
                          
                              "Illegal data value (value cannot be written to this register)",
                          
                              "Slave device failure (device reports internal error)",
                          
                              "Acknowledge (requested data will be available later)",
                          
                              // "Slave device busy (retry request again later)"
                          
                          ];
                          
                           
                          
                          // Enter your inverter modbus IP and port here:
                          
                          const modbusHost = "xxx.xxx.x.x";
                          
                          const modbusPort = 502;
                          
                          // Enter the Modbus-IDs of your Sun2000 inverters here:
                          
                          const modbusID = [1];
                          
                          // On which Modbus-ID can we reach the power meter? (via Sun2000!)
                          
                          const powerMeterID = 0;
                          
                           
                          
                          // Connect to modbus client
                          
                          ConnectModbus();
                          
                           
                          
                          // These register spaces need to be read:
                          
                          const registerSpacesToReadContinuously = [[37100, 114],[32000, 116]];
                          
                          var registerSpacesToReadContinuouslyPtr = 0;
                          
                           
                          
                          var globalDataBuffer = new Array(1);
                          
                          globalDataBuffer[0] = new Array(50000); // not optimized....
                          
                           
                          
                          // ---------------------------------------------------------------
                          
                          // Some helper functions:
                          
                          function ReadUnsignedInt16(array) {
                          
                              var value = array[0];    
                          
                              return value;
                          
                          }
                          
                           
                          
                          function ReadUnsignedInt32(array) {
                          
                              var value = array[0] * 256 * 256 + array[1];    
                          
                              return value;
                          
                          }
                          
                           
                          
                          function ReadSignedInt16(array) {
                          
                              var value = 0;
                          
                              if (array[0] > 32767)
                          
                                  value = array[0] - 65535; 
                          
                              else
                          
                                  value = array[0];
                          
                           
                          
                              return value;
                          
                          }
                          
                          function ReadSignedInt32(array) {
                          
                              var value = 0;
                          
                              for (var i = 0; i < 2; i++) {
                          
                                  value = (value << 16) | array[i];
                          
                              }
                          
                              return value;
                          
                          }
                          
                          function GetU16(dataarray, index) {
                          
                              var value = ReadUnsignedInt16(dataarray.slice(index, index+1));
                          
                              return value;
                          
                          }
                          
                           
                          
                          function GetU32(dataarray, index) {
                          
                              var value = ReadUnsignedInt32(dataarray.slice(index, index+2));
                          
                              return value;
                          
                          }
                          
                           
                          
                          function GetI16(dataarray, index) {
                          
                              var value = ReadSignedInt16(dataarray.slice(index, index+1));
                          
                              return value;
                          
                          }
                          
                           
                          
                          function GetI32(dataarray, index) {
                          
                              var value = ReadSignedInt32(dataarray.slice(index, index+2));
                          
                              return value;
                          
                          }
                          
                           
                          
                          function GetString(dataarray, index, length) {
                          
                              var shortarray = dataarray.slice(index, index+length);
                          
                              var bytearray = [];
                          
                              for(var i = 0; i < length; i++) {
                          
                                  bytearray.push(dataarray[index+i] >> 8);
                          
                                  bytearray.push(dataarray[index+i] & 0xff);
                          
                              }       
                          
                              var value =  String.fromCharCode.apply(null, bytearray);    
                          
                              return value;
                          
                          }
                          
                           
                          
                          function GetZeroTerminatedString(dataarray, index, length) {
                          
                              var shortarray = dataarray.slice(index, index+length);
                          
                              var bytearray = [];
                          
                              for(var i = 0; i < length; i++) {
                          
                                  bytearray.push(dataarray[index+i] >> 8);
                          
                                  bytearray.push(dataarray[index+i] & 0xff);
                          
                              }       
                          
                              var value =  String.fromCharCode.apply(null, bytearray);    
                          
                              var value2 = new String(value).trim();
                          
                              return value2;
                          
                          }
                          
                           
                          
                          // Funktion zum Herstellen einer Modbus-Verbindung
                          
                          function ConnectModbus() {
                          
                              console.log("Init connection to: " + modbusHost +":" + modbusPort);
                          
                              // set requests parameters
                          
                              client.setTimeout (10000);
                          
                              // try to connect
                          
                              client.connectTCP (modbusHost, { port: modbusPort })
                          
                                  .then(function()
                          
                                  {
                          
                                      console.log("Connected, wait for reading...");
                          
                                  })
                          
                                  .catch(function(e)
                          
                                  {
                          
                                      console.log(e);
                          
                                  });
                          
                          }
                          
                           
                          
                          // Funktion zum Anlegen und Beschreiben eines Datenpunkts
                          
                          function ForceSetState(objectname, value, options) {
                          
                              if(!existsState("javascript.0." + objectname))      createState(objectname, value, options);
                          
                              else                                                setState(objectname, value);
                          
                          }  
                          
                          // ---------------------------------------------------------------
                          
                          // Functions to map registers into ioBreaker objects:
                          
                          function ProcessPowerMeterStatus() {       
                          
                              ForceSetState("Solarpower.Huawei.Meter.Status",                     GetU16(globalDataBuffer[powerMeterID], 37100),          {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Meter.VoltageL1",                  GetI32(globalDataBuffer[powerMeterID], 37101) / 10,     {name: "", unit: "V"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.VoltageL2",                  GetI32(globalDataBuffer[powerMeterID], 37103) / 10,     {name: "", unit: "V"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.VoltageL3",                  GetI32(globalDataBuffer[powerMeterID], 37105) / 10,     {name: "", unit: "V"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.CurrentL1",                  GetI32(globalDataBuffer[powerMeterID], 37107) / 100,    {name: "", unit: "A"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.CurrentL2",                  GetI32(globalDataBuffer[powerMeterID], 37109) / 100,    {name: "", unit: "A"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.CurrentL3",                  GetI32(globalDataBuffer[powerMeterID], 37111) / 100,    {name: "", unit: "A"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.ActivePower",                GetI32(globalDataBuffer[powerMeterID], 37113) / 1,      {name: "", unit: "W"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.ReactivePower",              GetI32(globalDataBuffer[powerMeterID], 37115) / 1,      {name: "", unit: "Var"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.PowerFactor",                GetI16(globalDataBuffer[powerMeterID], 37117) / 1000,   {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Meter.GridFrequency",              GetI16(globalDataBuffer[powerMeterID], 37118) / 100,    {name: "", unit: "Hz"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.PositiveActiveEnergy",       GetI32(globalDataBuffer[powerMeterID], 37119) / 100,    {name: "", unit: "kWh"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.ReverseActiveEnergy",        GetI32(globalDataBuffer[powerMeterID], 37121) / 100,    {name: "", unit: "kWh"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.AccumulatedReactivePower",   GetI32(globalDataBuffer[powerMeterID], 37123) / 100,    {name: "", unit: "kVarh"});
                          
                              //ForceSetState("Solarpower.Huawei.Meter.MeterType",                  GetU16(globalDataBuffer[powerMeterID], 37125),          {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Meter.VoltageL1-L2",               GetI32(globalDataBuffer[powerMeterID], 37126) / 10,     {name: "", unit: "V"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.VoltageL2-L3",               GetI32(globalDataBuffer[powerMeterID], 37128) / 10,     {name: "", unit: "V"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.VoltageL3-L1",               GetI32(globalDataBuffer[powerMeterID], 37130) / 10,     {name: "", unit: "V"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.ActivePowerL1",              GetI32(globalDataBuffer[powerMeterID], 37132) / 1,      {name: "", unit: "W"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.ActivePowerL2",              GetI32(globalDataBuffer[powerMeterID], 37134) / 1,      {name: "", unit: "W"});
                          
                              ForceSetState("Solarpower.Huawei.Meter.ActivePowerL3",              GetI32(globalDataBuffer[powerMeterID], 37136) / 1,      {name: "", unit: "W"});
                          
                              //ForceSetState("Solarpower.Huawei.Meter.MeterModel",                 GetU16(globalDataBuffer[powerMeterID], 37138),          {name: "", unit: ""});
                          
                          }
                          
                           
                          
                          function ProcessInverterStatus(id) {
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".State1",                   GetU16(globalDataBuffer[id-1], 32000),          {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".State2",                   GetU16(globalDataBuffer[id-1], 32002),          {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".State3",                   GetU32(globalDataBuffer[id-1], 32003),          {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".Alarm1",                   GetU16(globalDataBuffer[id-1], 32008),          {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".Alarm2",                   GetU16(globalDataBuffer[id-1], 32009),          {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".Alarm3",                   GetU16(globalDataBuffer[id-1], 32010),          {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.1_Voltage",         GetI16(globalDataBuffer[id-1], 32016) / 10,     {name: "", unit: "V"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.1_Current",         GetI16(globalDataBuffer[id-1], 32017) / 100,    {name: "", unit: "A"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.2_Voltage",         GetI16(globalDataBuffer[id-1], 32018) / 10,     {name: "", unit: "V"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.2_Current",         GetI16(globalDataBuffer[id-1], 32019) / 100,    {name: "", unit: "A"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.3_Voltage",         GetI16(globalDataBuffer[id-1], 32020) / 10,     {name: "", unit: "V"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.3_Current",         GetI16(globalDataBuffer[id-1], 32021) / 100,    {name: "", unit: "A"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.4_Voltage",         GetI16(globalDataBuffer[id-1], 32022) / 10,     {name: "", unit: "V"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.4_Current",         GetI16(globalDataBuffer[id-1], 32023) / 100,    {name: "", unit: "A"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".InputPower",               GetI32(globalDataBuffer[id-1], 32064) / 1000,   {name: "", unit: "kW"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L1-L2_Voltage",       GetU16(globalDataBuffer[id-1], 32066) / 10,     {name: "", unit: "V"});      
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L2-L3_Voltage",       GetU16(globalDataBuffer[id-1], 32067) / 10,     {name: "", unit: "V"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L3-L1_Voltage",       GetU16(globalDataBuffer[id-1], 32068) / 10,     {name: "", unit: "V"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L1_Voltage",          GetU16(globalDataBuffer[id-1], 32069) / 10,     {name: "", unit: "V"});                              
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L2_Voltage",          GetU16(globalDataBuffer[id-1], 32070) / 10,     {name: "", unit: "V"});                                                  
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L3_Voltage",          GetU16(globalDataBuffer[id-1], 32071) / 10,     {name: "", unit: "V"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L1_Current",          GetI32(globalDataBuffer[id-1], 32072) / 1000,   {name: "", unit: "A"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L2_Current",          GetI32(globalDataBuffer[id-1], 32074) / 1000,   {name: "", unit: "A"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L3_Current",          GetI32(globalDataBuffer[id-1], 32076) / 1000,   {name: "", unit: "A"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".PeakActivePowerDay",       GetI32(globalDataBuffer[id-1], 32078) / 1000,   {name: "", unit: "kW"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".ActivePower",              GetI32(globalDataBuffer[id-1], 32080) / 1000,   {name: "", unit: "kW"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".ReactivePower",            GetI32(globalDataBuffer[id-1], 32082) / 1000,   {name: "", unit: "kVar"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".PowerFactor",              GetI16(globalDataBuffer[id-1], 32084) / 1000,   {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".GridFrequency",            GetU16(globalDataBuffer[id-1], 32085) / 100,    {name: "", unit: "Hz"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".Efficiency",               GetU16(globalDataBuffer[id-1], 32086) / 100,    {name: "", unit: "%"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".InternalTemperature",      GetI16(globalDataBuffer[id-1], 32087) / 10,     {name: "", unit: "°C"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".InsulationResistance",     GetU16(globalDataBuffer[id-1], 32088) / 1000,   {name: "", unit: "MOhm"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".DeviceStatus",             GetU16(globalDataBuffer[id-1], 32089),          {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".FaultCode",                GetU16(globalDataBuffer[id-1], 32090),          {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".StartupTime",              String(new Date(GetU32(globalDataBuffer[id-1], 32091)*1000)),          {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".ShutdownTime",             String(new Date(GetU32(globalDataBuffer[id-1], 32093)*1000)),          {name: "", unit: ""});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".AccomulatedEnergyYield",   GetU32(globalDataBuffer[id-1], 32106) / 100,          {name: "", unit: "kWh"});
                          
                              ForceSetState("Solarpower.Huawei.Inverter." + id + ".DailyEnergyYield",         GetU32(globalDataBuffer[id-1], 32114) / 100,          {name: "", unit: "kWh"});
                          
                          }
                          
                           
                          
                          
                          
                          function ReadRegisterSpace(id, address, length) {
                          
                              client.setID(modbusID[id-1]);
                          
                              client.readHoldingRegisters(address, length, function(err, data) {
                          
                                  if (err) {
                          
                                      if (err.modbusCode == null) {
                          
                                          console.warn("Lost connection to client. Trying to reconnect...");
                          
                                          ConnectModbus();
                          
                                      } 
                          
                                      else console.warn("Error received reading address " + address + " from id: " + modbusID[id-1] + " with error: " + err.modbusCode); 
                          
                                  }
                          
                                  else
                          
                                  {   
                          
                                      console.debug("Read data from id/address " + modbusID[id-1] + "/" + address + "\nData is: " + data.data);
                          
                                      for(var i = 0; i < length; i++)  {
                          
                                          globalDataBuffer[id-1][address+i] = data.data[i];
                          
                                      } 
                          
                                  }
                          
                              });
                          
                          }
                          
                           
                          
                          function ProcessData() {
                          
                              //console.log("Processing new data...");
                          
                              for(var i = 1; i <= modbusID.length; i++) {
                          
                                  ProcessInverterStatus(i);
                          
                              }    
                          
                              ProcessPowerMeterStatus();
                          
                              //console.log("Processing done!");
                          
                          }
                          
                           
                          
                           
                          
                          // -------------------------------------------------------------------
                          
                          // This is the main function triggering a  read via modbus-tcp every two seconds.
                          
                          // Processing of data is triggered as soon as one complete set of registers is copied.
                          
                          var triggerprocessing = 0; 
                          
                          var currentinverter = 1;
                          
                           
                          
                           
                          
                          setInterval(function() {
                          
                              if(triggerprocessing == 1) {
                          
                                  triggerprocessing = 0;
                          
                                  ProcessData();        
                          
                              }      
                          
                             
                          
                              //console.log("Triggering read of inverter " + currentinverter + " at address " + registerSpacesToReadContinuously[registerSpacesToReadContinuouslyPtr][0] + " with length " +  registerSpacesToReadContinuously[registerSpacesToReadContinuouslyPtr][1]);
                          
                              ReadRegisterSpace(currentinverter, registerSpacesToReadContinuously[registerSpacesToReadContinuouslyPtr][0], registerSpacesToReadContinuously[registerSpacesToReadContinuouslyPtr][1]); 
                          
                              registerSpacesToReadContinuouslyPtr++;               
                          
                              if(registerSpacesToReadContinuouslyPtr >= registerSpacesToReadContinuously.length) {
                          
                                  registerSpacesToReadContinuouslyPtr = 0;
                          
                                  currentinverter++
                          
                                  if(currentinverter > modbusID.length){
                          
                                      currentinverter = 1;  
                          
                                      triggerprocessing = 1;                    
                          
                                  }
                          
                              }     
                          
                          }, 4000);
                          
                          

                          Die Fehler die bei mir gekommen sind, sind jetzt fast weg, seit ich die Abfragezeit auf 4000 ms geändert habe.
                          Ich hoffe ich konnte helfen, Gruß Jürgen

                          Atifan 1 Reply Last reply Reply Quote 0
                          • A
                            ATARI @Alex Warkentin last edited by

                            @alex-warkentin
                            Mir ging es nicht um den eigentlichen Abfrageintervall, mit dem habe ich schon experimentiert.
                            Mein bestes Ergebnis habe ich bei 3333ms erhalten, hierbei treten nur sehr sporadisch Fehlermeldungen
                            wegen "...Busy..." auf und ich erhalte dennoch ca. 2 mal pro Minute neue Daten.

                            1 Reply Last reply Reply Quote 0
                            • Alex Warkentin
                              Alex Warkentin last edited by

                              Funktioniert das Script bei euch noch? Seit heute bekomme ich fast bei jedem Abruf die Fehlermeldung, dass der Port nicht geöffnet ist.

                              1 Reply Last reply Reply Quote 0
                              • severendis
                                severendis @Thomas42 last edited by

                                @thomas42

                                Hallo Thomas!

                                Danke für die Beschreibung, mit der ich das Script zum laufen bekommen habe.
                                Aber etwas ist bei Dir scheinbar anders.
                                Du schreibts, das du 2 WR hast und die mit der Modbus ID 1 und 2 ansteuerst.
                                Hast Du dann an jedem WR einen Dongle dran?

                                Bei mir hängen 2 WR im Verbund an einem Dongle.
                                Ich habe somit nur eine Modbus Adresse (die 1)

                                Bisher arbeite ich über NodeRed (was mir zu langsam und speicherintensiv ist). Da kann ich die Register von beiden WR abfragen.
                                Hierfür gibt es eine "Unit-Id"
                                So frage ich dort z.B. mit
                                32064 Unit-Id 1 die PV Input Power des ersten WR ab
                                32064 Unit-Id 2 die PV Input Power des zweiten WR ab

                                Das kann ich aber in diesem Script nicht finden und somit nur einen WR auslesen.

                                Wie sind die WR bei Dir angeschlossen?

                                1 Reply Last reply Reply Quote 0
                                • O
                                  OliWit82 last edited by

                                  Hallo zusammen.

                                  Vielen Dank das Script läuft super.

                                  Hat vielleicht jemand die Adresse für die Last vom Haus?

                                  Danke

                                  1 Reply Last reply Reply Quote 0
                                  • O
                                    OliWit82 last edited by

                                    Kann man die Werte abfragen?
                                    Oder muss man dich durch ein Script selber errechnen?

                                    IMG_3604.jpeg

                                    B 1 Reply Last reply Reply Quote 0
                                    • B
                                      badsnoopy667 @OliWit82 last edited by badsnoopy667

                                      @oliwit82
                                      Die Werte kann man nicht direkt abfragen und müssen berechnet werden.

                                      Beispiel

                                      Oh, sehe gerade, mein Script ist gar nicht für die kWh Werte. Damit berechne ich erstmal Verbrauch, Bezug, etc. Aber diese Werte kann man dann ja aufsummieren über den Tag.

                                      O 1 Reply Last reply Reply Quote 0
                                      • O
                                        OliWit82 @badsnoopy667 last edited by

                                        @badsnoopy667

                                        Danke.

                                        Gibt es da vielleicht schon ein fertiges blockly?

                                        B 1 Reply Last reply Reply Quote 0
                                        • B
                                          badsnoopy667 @OliWit82 last edited by

                                          @oliwit82
                                          Das sollte sich mit dem sourceanalytix Adapter am einfachsten realisieren lassen.

                                          1 Reply Last reply Reply Quote 0
                                          • Atifan
                                            Atifan @juggi1962 last edited by

                                            @juggi1962 sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:

                                            @baumiliciousnessss
                                            Ja, ich habe das Skript von @Alex-Warkentin und das funktioniert jetzt.
                                            Er hat das Original Skript ein wenig abgespeckt und den Batterie Teil rausgenommen da er und ich keine Haben.

                                            
                                            
                                            // License: Beerware! Do what ever you like with this, but I'm not liable for anything that you do with it.
                                            
                                            // If you like this code, feel free to buy me a beer ...
                                            
                                            // Have fun with it! der Kachel
                                            
                                            // @ts-ignore
                                            
                                            var modbusRTU = require("modbus-serial");
                                            
                                            var client = new modbusRTU();
                                            
                                             
                                            
                                            var modbusErrorMessages = [
                                            
                                                "Unknown error",
                                            
                                                "Illegal function (device does not support this read/write function)",
                                            
                                                "Illegal data address (register not supported by device)",
                                            
                                                "Illegal data value (value cannot be written to this register)",
                                            
                                                "Slave device failure (device reports internal error)",
                                            
                                                "Acknowledge (requested data will be available later)",
                                            
                                                // "Slave device busy (retry request again later)"
                                            
                                            ];
                                            
                                             
                                            
                                            // Enter your inverter modbus IP and port here:
                                            
                                            const modbusHost = "xxx.xxx.x.x";
                                            
                                            const modbusPort = 502;
                                            
                                            // Enter the Modbus-IDs of your Sun2000 inverters here:
                                            
                                            const modbusID = [1];
                                            
                                            // On which Modbus-ID can we reach the power meter? (via Sun2000!)
                                            
                                            const powerMeterID = 0;
                                            
                                             
                                            
                                            // Connect to modbus client
                                            
                                            ConnectModbus();
                                            
                                             
                                            
                                            // These register spaces need to be read:
                                            
                                            const registerSpacesToReadContinuously = [[37100, 114],[32000, 116]];
                                            
                                            var registerSpacesToReadContinuouslyPtr = 0;
                                            
                                             
                                            
                                            var globalDataBuffer = new Array(1);
                                            
                                            globalDataBuffer[0] = new Array(50000); // not optimized....
                                            
                                             
                                            
                                            // ---------------------------------------------------------------
                                            
                                            // Some helper functions:
                                            
                                            function ReadUnsignedInt16(array) {
                                            
                                                var value = array[0];    
                                            
                                                return value;
                                            
                                            }
                                            
                                             
                                            
                                            function ReadUnsignedInt32(array) {
                                            
                                                var value = array[0] * 256 * 256 + array[1];    
                                            
                                                return value;
                                            
                                            }
                                            
                                             
                                            
                                            function ReadSignedInt16(array) {
                                            
                                                var value = 0;
                                            
                                                if (array[0] > 32767)
                                            
                                                    value = array[0] - 65535; 
                                            
                                                else
                                            
                                                    value = array[0];
                                            
                                             
                                            
                                                return value;
                                            
                                            }
                                            
                                            function ReadSignedInt32(array) {
                                            
                                                var value = 0;
                                            
                                                for (var i = 0; i < 2; i++) {
                                            
                                                    value = (value << 16) | array[i];
                                            
                                                }
                                            
                                                return value;
                                            
                                            }
                                            
                                            function GetU16(dataarray, index) {
                                            
                                                var value = ReadUnsignedInt16(dataarray.slice(index, index+1));
                                            
                                                return value;
                                            
                                            }
                                            
                                             
                                            
                                            function GetU32(dataarray, index) {
                                            
                                                var value = ReadUnsignedInt32(dataarray.slice(index, index+2));
                                            
                                                return value;
                                            
                                            }
                                            
                                             
                                            
                                            function GetI16(dataarray, index) {
                                            
                                                var value = ReadSignedInt16(dataarray.slice(index, index+1));
                                            
                                                return value;
                                            
                                            }
                                            
                                             
                                            
                                            function GetI32(dataarray, index) {
                                            
                                                var value = ReadSignedInt32(dataarray.slice(index, index+2));
                                            
                                                return value;
                                            
                                            }
                                            
                                             
                                            
                                            function GetString(dataarray, index, length) {
                                            
                                                var shortarray = dataarray.slice(index, index+length);
                                            
                                                var bytearray = [];
                                            
                                                for(var i = 0; i < length; i++) {
                                            
                                                    bytearray.push(dataarray[index+i] >> 8);
                                            
                                                    bytearray.push(dataarray[index+i] & 0xff);
                                            
                                                }       
                                            
                                                var value =  String.fromCharCode.apply(null, bytearray);    
                                            
                                                return value;
                                            
                                            }
                                            
                                             
                                            
                                            function GetZeroTerminatedString(dataarray, index, length) {
                                            
                                                var shortarray = dataarray.slice(index, index+length);
                                            
                                                var bytearray = [];
                                            
                                                for(var i = 0; i < length; i++) {
                                            
                                                    bytearray.push(dataarray[index+i] >> 8);
                                            
                                                    bytearray.push(dataarray[index+i] & 0xff);
                                            
                                                }       
                                            
                                                var value =  String.fromCharCode.apply(null, bytearray);    
                                            
                                                var value2 = new String(value).trim();
                                            
                                                return value2;
                                            
                                            }
                                            
                                             
                                            
                                            // Funktion zum Herstellen einer Modbus-Verbindung
                                            
                                            function ConnectModbus() {
                                            
                                                console.log("Init connection to: " + modbusHost +":" + modbusPort);
                                            
                                                // set requests parameters
                                            
                                                client.setTimeout (10000);
                                            
                                                // try to connect
                                            
                                                client.connectTCP (modbusHost, { port: modbusPort })
                                            
                                                    .then(function()
                                            
                                                    {
                                            
                                                        console.log("Connected, wait for reading...");
                                            
                                                    })
                                            
                                                    .catch(function(e)
                                            
                                                    {
                                            
                                                        console.log(e);
                                            
                                                    });
                                            
                                            }
                                            
                                             
                                            
                                            // Funktion zum Anlegen und Beschreiben eines Datenpunkts
                                            
                                            function ForceSetState(objectname, value, options) {
                                            
                                                if(!existsState("javascript.0." + objectname))      createState(objectname, value, options);
                                            
                                                else                                                setState(objectname, value);
                                            
                                            }  
                                            
                                            // ---------------------------------------------------------------
                                            
                                            // Functions to map registers into ioBreaker objects:
                                            
                                            function ProcessPowerMeterStatus() {       
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.Status",                     GetU16(globalDataBuffer[powerMeterID], 37100),          {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.VoltageL1",                  GetI32(globalDataBuffer[powerMeterID], 37101) / 10,     {name: "", unit: "V"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.VoltageL2",                  GetI32(globalDataBuffer[powerMeterID], 37103) / 10,     {name: "", unit: "V"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.VoltageL3",                  GetI32(globalDataBuffer[powerMeterID], 37105) / 10,     {name: "", unit: "V"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.CurrentL1",                  GetI32(globalDataBuffer[powerMeterID], 37107) / 100,    {name: "", unit: "A"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.CurrentL2",                  GetI32(globalDataBuffer[powerMeterID], 37109) / 100,    {name: "", unit: "A"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.CurrentL3",                  GetI32(globalDataBuffer[powerMeterID], 37111) / 100,    {name: "", unit: "A"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.ActivePower",                GetI32(globalDataBuffer[powerMeterID], 37113) / 1,      {name: "", unit: "W"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.ReactivePower",              GetI32(globalDataBuffer[powerMeterID], 37115) / 1,      {name: "", unit: "Var"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.PowerFactor",                GetI16(globalDataBuffer[powerMeterID], 37117) / 1000,   {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.GridFrequency",              GetI16(globalDataBuffer[powerMeterID], 37118) / 100,    {name: "", unit: "Hz"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.PositiveActiveEnergy",       GetI32(globalDataBuffer[powerMeterID], 37119) / 100,    {name: "", unit: "kWh"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.ReverseActiveEnergy",        GetI32(globalDataBuffer[powerMeterID], 37121) / 100,    {name: "", unit: "kWh"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.AccumulatedReactivePower",   GetI32(globalDataBuffer[powerMeterID], 37123) / 100,    {name: "", unit: "kVarh"});
                                            
                                                //ForceSetState("Solarpower.Huawei.Meter.MeterType",                  GetU16(globalDataBuffer[powerMeterID], 37125),          {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.VoltageL1-L2",               GetI32(globalDataBuffer[powerMeterID], 37126) / 10,     {name: "", unit: "V"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.VoltageL2-L3",               GetI32(globalDataBuffer[powerMeterID], 37128) / 10,     {name: "", unit: "V"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.VoltageL3-L1",               GetI32(globalDataBuffer[powerMeterID], 37130) / 10,     {name: "", unit: "V"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.ActivePowerL1",              GetI32(globalDataBuffer[powerMeterID], 37132) / 1,      {name: "", unit: "W"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.ActivePowerL2",              GetI32(globalDataBuffer[powerMeterID], 37134) / 1,      {name: "", unit: "W"});
                                            
                                                ForceSetState("Solarpower.Huawei.Meter.ActivePowerL3",              GetI32(globalDataBuffer[powerMeterID], 37136) / 1,      {name: "", unit: "W"});
                                            
                                                //ForceSetState("Solarpower.Huawei.Meter.MeterModel",                 GetU16(globalDataBuffer[powerMeterID], 37138),          {name: "", unit: ""});
                                            
                                            }
                                            
                                             
                                            
                                            function ProcessInverterStatus(id) {
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".State1",                   GetU16(globalDataBuffer[id-1], 32000),          {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".State2",                   GetU16(globalDataBuffer[id-1], 32002),          {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".State3",                   GetU32(globalDataBuffer[id-1], 32003),          {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".Alarm1",                   GetU16(globalDataBuffer[id-1], 32008),          {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".Alarm2",                   GetU16(globalDataBuffer[id-1], 32009),          {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".Alarm3",                   GetU16(globalDataBuffer[id-1], 32010),          {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.1_Voltage",         GetI16(globalDataBuffer[id-1], 32016) / 10,     {name: "", unit: "V"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.1_Current",         GetI16(globalDataBuffer[id-1], 32017) / 100,    {name: "", unit: "A"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.2_Voltage",         GetI16(globalDataBuffer[id-1], 32018) / 10,     {name: "", unit: "V"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.2_Current",         GetI16(globalDataBuffer[id-1], 32019) / 100,    {name: "", unit: "A"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.3_Voltage",         GetI16(globalDataBuffer[id-1], 32020) / 10,     {name: "", unit: "V"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.3_Current",         GetI16(globalDataBuffer[id-1], 32021) / 100,    {name: "", unit: "A"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.4_Voltage",         GetI16(globalDataBuffer[id-1], 32022) / 10,     {name: "", unit: "V"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".String.4_Current",         GetI16(globalDataBuffer[id-1], 32023) / 100,    {name: "", unit: "A"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".InputPower",               GetI32(globalDataBuffer[id-1], 32064) / 1000,   {name: "", unit: "kW"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L1-L2_Voltage",       GetU16(globalDataBuffer[id-1], 32066) / 10,     {name: "", unit: "V"});      
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L2-L3_Voltage",       GetU16(globalDataBuffer[id-1], 32067) / 10,     {name: "", unit: "V"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L3-L1_Voltage",       GetU16(globalDataBuffer[id-1], 32068) / 10,     {name: "", unit: "V"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L1_Voltage",          GetU16(globalDataBuffer[id-1], 32069) / 10,     {name: "", unit: "V"});                              
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L2_Voltage",          GetU16(globalDataBuffer[id-1], 32070) / 10,     {name: "", unit: "V"});                                                  
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L3_Voltage",          GetU16(globalDataBuffer[id-1], 32071) / 10,     {name: "", unit: "V"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L1_Current",          GetI32(globalDataBuffer[id-1], 32072) / 1000,   {name: "", unit: "A"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L2_Current",          GetI32(globalDataBuffer[id-1], 32074) / 1000,   {name: "", unit: "A"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".Grid.L3_Current",          GetI32(globalDataBuffer[id-1], 32076) / 1000,   {name: "", unit: "A"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".PeakActivePowerDay",       GetI32(globalDataBuffer[id-1], 32078) / 1000,   {name: "", unit: "kW"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".ActivePower",              GetI32(globalDataBuffer[id-1], 32080) / 1000,   {name: "", unit: "kW"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".ReactivePower",            GetI32(globalDataBuffer[id-1], 32082) / 1000,   {name: "", unit: "kVar"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".PowerFactor",              GetI16(globalDataBuffer[id-1], 32084) / 1000,   {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".GridFrequency",            GetU16(globalDataBuffer[id-1], 32085) / 100,    {name: "", unit: "Hz"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".Efficiency",               GetU16(globalDataBuffer[id-1], 32086) / 100,    {name: "", unit: "%"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".InternalTemperature",      GetI16(globalDataBuffer[id-1], 32087) / 10,     {name: "", unit: "°C"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".InsulationResistance",     GetU16(globalDataBuffer[id-1], 32088) / 1000,   {name: "", unit: "MOhm"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".DeviceStatus",             GetU16(globalDataBuffer[id-1], 32089),          {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".FaultCode",                GetU16(globalDataBuffer[id-1], 32090),          {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".StartupTime",              String(new Date(GetU32(globalDataBuffer[id-1], 32091)*1000)),          {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".ShutdownTime",             String(new Date(GetU32(globalDataBuffer[id-1], 32093)*1000)),          {name: "", unit: ""});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".AccomulatedEnergyYield",   GetU32(globalDataBuffer[id-1], 32106) / 100,          {name: "", unit: "kWh"});
                                            
                                                ForceSetState("Solarpower.Huawei.Inverter." + id + ".DailyEnergyYield",         GetU32(globalDataBuffer[id-1], 32114) / 100,          {name: "", unit: "kWh"});
                                            
                                            }
                                            
                                             
                                            
                                            
                                            
                                            function ReadRegisterSpace(id, address, length) {
                                            
                                                client.setID(modbusID[id-1]);
                                            
                                                client.readHoldingRegisters(address, length, function(err, data) {
                                            
                                                    if (err) {
                                            
                                                        if (err.modbusCode == null) {
                                            
                                                            console.warn("Lost connection to client. Trying to reconnect...");
                                            
                                                            ConnectModbus();
                                            
                                                        } 
                                            
                                                        else console.warn("Error received reading address " + address + " from id: " + modbusID[id-1] + " with error: " + err.modbusCode); 
                                            
                                                    }
                                            
                                                    else
                                            
                                                    {   
                                            
                                                        console.debug("Read data from id/address " + modbusID[id-1] + "/" + address + "\nData is: " + data.data);
                                            
                                                        for(var i = 0; i < length; i++)  {
                                            
                                                            globalDataBuffer[id-1][address+i] = data.data[i];
                                            
                                                        } 
                                            
                                                    }
                                            
                                                });
                                            
                                            }
                                            
                                             
                                            
                                            function ProcessData() {
                                            
                                                //console.log("Processing new data...");
                                            
                                                for(var i = 1; i <= modbusID.length; i++) {
                                            
                                                    ProcessInverterStatus(i);
                                            
                                                }    
                                            
                                                ProcessPowerMeterStatus();
                                            
                                                //console.log("Processing done!");
                                            
                                            }
                                            
                                             
                                            
                                             
                                            
                                            // -------------------------------------------------------------------
                                            
                                            // This is the main function triggering a  read via modbus-tcp every two seconds.
                                            
                                            // Processing of data is triggered as soon as one complete set of registers is copied.
                                            
                                            var triggerprocessing = 0; 
                                            
                                            var currentinverter = 1;
                                            
                                             
                                            
                                             
                                            
                                            setInterval(function() {
                                            
                                                if(triggerprocessing == 1) {
                                            
                                                    triggerprocessing = 0;
                                            
                                                    ProcessData();        
                                            
                                                }      
                                            
                                               
                                            
                                                //console.log("Triggering read of inverter " + currentinverter + " at address " + registerSpacesToReadContinuously[registerSpacesToReadContinuouslyPtr][0] + " with length " +  registerSpacesToReadContinuously[registerSpacesToReadContinuouslyPtr][1]);
                                            
                                                ReadRegisterSpace(currentinverter, registerSpacesToReadContinuously[registerSpacesToReadContinuouslyPtr][0], registerSpacesToReadContinuously[registerSpacesToReadContinuouslyPtr][1]); 
                                            
                                                registerSpacesToReadContinuouslyPtr++;               
                                            
                                                if(registerSpacesToReadContinuouslyPtr >= registerSpacesToReadContinuously.length) {
                                            
                                                    registerSpacesToReadContinuouslyPtr = 0;
                                            
                                                    currentinverter++
                                            
                                                    if(currentinverter > modbusID.length){
                                            
                                                        currentinverter = 1;  
                                            
                                                        triggerprocessing = 1;                    
                                            
                                                    }
                                            
                                                }     
                                            
                                            }, 4000);
                                            
                                            

                                            Die Fehler die bei mir gekommen sind, sind jetzt fast weg, seit ich die Abfragezeit auf 4000 ms geändert habe.
                                            Ich hoffe ich konnte helfen, Gruß Jürgen

                                            Hallo, habe auch diese Skript genommen und funktioniert bei mir auch.
                                            Nur habe ich noch eine LUNA2000 Batterie mit 10kWh und würde die gerne mit einbinden.
                                            Kann mir einer sagen was ich noch mit einfügen muss, damit der Speicher mit drin ist?
                                            Danke!

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            1.0k
                                            Online

                                            31.6k
                                            Users

                                            79.5k
                                            Topics

                                            1.3m
                                            Posts

                                            59
                                            471
                                            80590
                                            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