Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. ioBroker Allgemein
  4. Huawei Sun2000 & ioBroker via JS script funktioniert

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.2k

Huawei Sun2000 & ioBroker via JS script funktioniert

Geplant Angeheftet Gesperrt Verschoben ioBroker Allgemein
481 Beiträge 62 Kommentatoren 121.3k Aufrufe 63 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • B badsnoopy667

    @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.

    J Offline
    J Offline
    juggi1962
    schrieb am zuletzt editiert von
    #86

    @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 Antwort Letzte Antwort
    0
    • J juggi1962

      @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 Offline
      B Offline
      badsnoopy667
      schrieb am zuletzt editiert von
      #87

      @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 Antwort Letzte Antwort
      0
      • J juggi1962

        @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

        Alex WarkentinA Offline
        Alex WarkentinA Offline
        Alex Warkentin
        schrieb am zuletzt editiert von
        #88

        @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 Antwort Letzte Antwort
        0
        • Alex WarkentinA Alex Warkentin

          @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 Offline
          J Offline
          juggi1962
          schrieb am zuletzt editiert von
          #89

          @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 WarkentinA 1 Antwort Letzte Antwort
          0
          • J juggi1962

            @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 WarkentinA Offline
            Alex WarkentinA Offline
            Alex Warkentin
            schrieb am zuletzt editiert von
            #90

            @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 Antwort Letzte Antwort
            0
            • Alex WarkentinA Alex Warkentin

              @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 Offline
              J Offline
              juggi1962
              schrieb am zuletzt editiert von juggi1962
              #91

              @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 WarkentinA 1 Antwort Letzte Antwort
              0
              • J 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 WarkentinA Offline
                Alex WarkentinA Offline
                Alex Warkentin
                schrieb am zuletzt editiert von
                #92

                @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 Antwort Letzte Antwort
                0
                • Alex WarkentinA Alex Warkentin

                  @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 Offline
                  J Offline
                  juggi1962
                  schrieb am zuletzt editiert von
                  #93

                  @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

                  baumiliciousnessssB 1 Antwort Letzte Antwort
                  0
                  • J juggi1962

                    @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

                    baumiliciousnessssB Offline
                    baumiliciousnessssB Offline
                    baumiliciousnessss
                    schrieb am zuletzt editiert von
                    #94

                    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 Antwort Letzte Antwort
                    0
                    • baumiliciousnessssB baumiliciousnessss

                      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 Offline
                      J Offline
                      juggi1962
                      schrieb am zuletzt editiert von juggi1962
                      #95

                      @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

                      AtifanA 1 Antwort Letzte Antwort
                      0
                      • Alex WarkentinA Alex Warkentin

                        @atari
                        Das Abfrageintervall kannst du in der letzten Zeile des Scripts in ms einstellen. Dein Problem liegt wohl aber weniger am Intervall (dann kommt zwischendurch eine Warnung, dass das Gerät beschäftigt ist), sondern, dass das Script beim Verlust der Modbus-Verbindung diese nicht wieder automatisch aufbaut.

                        A Offline
                        A Offline
                        ATARI
                        schrieb am zuletzt editiert von
                        #96

                        @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.

                        Raspberry Pi 5B (ioB via pi OS_lite(64bit) | Synology NAS (ioB via Docker)

                        1 Antwort Letzte Antwort
                        0
                        • Alex WarkentinA Offline
                          Alex WarkentinA Offline
                          Alex Warkentin
                          schrieb am zuletzt editiert von
                          #97

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

                          1 Antwort Letzte Antwort
                          0
                          • T Thomas42

                            Erst mal vielen Dank für das Script, hat fast sofort funtioniert.
                            Ich musste nur die IDs raten, bei meiner nagelneuen Anlage mit 2 KTLs und dem Powermeter und ohne Batterien bin ich hier gelandet:

                            const ModBusIDs = [1, 2];
                            const PowerMeterID = 0; 
                            

                            Powermeter läuft wunderbar.
                            Das Problem, daß die Werte nur einmal geschrieben wurden habe ich mit einem Workaround hier gelöst:

                            function forcesetState(objectname, value, options) {
                                if(!existsState(objectname)) {
                                    createState(objectname, value, options);   
                                    console.log("createstate " +  objectname + " to value " + value);     
                                }
                                //Workaround 
                                setState(objectname, value);
                            }  
                            
                            

                            also das setstate aus der else-clause genommen, denn das !existsState scheint nicht sauber zu funktionieren.

                            Ach so, noch eine gute Nachricht:
                            Der Installateur kann den Modbus (inwischen?) remote aktivieren, da muss keiner vor Ort sein.
                            Hat mich eine Mail an meinen Solateur gekostet und zwei Stunden später war alles aktiv.

                            severendisS Offline
                            severendisS Offline
                            severendis
                            schrieb am zuletzt editiert von
                            #98

                            @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 Antwort Letzte Antwort
                            0
                            • O Offline
                              O Offline
                              OliWit82
                              schrieb am zuletzt editiert von
                              #99

                              Hallo zusammen.

                              Vielen Dank das Script läuft super.

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

                              Danke

                              1 Antwort Letzte Antwort
                              0
                              • O Offline
                                O Offline
                                OliWit82
                                schrieb am zuletzt editiert von
                                #100

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

                                IMG_3604.jpeg

                                B 1 Antwort Letzte Antwort
                                0
                                • O OliWit82

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

                                  IMG_3604.jpeg

                                  B Offline
                                  B Offline
                                  badsnoopy667
                                  schrieb am zuletzt editiert von badsnoopy667
                                  #101

                                  @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 Antwort Letzte Antwort
                                  0
                                  • B 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 Offline
                                    O Offline
                                    OliWit82
                                    schrieb am zuletzt editiert von
                                    #102

                                    @badsnoopy667

                                    Danke.

                                    Gibt es da vielleicht schon ein fertiges blockly?

                                    B 1 Antwort Letzte Antwort
                                    0
                                    • O OliWit82

                                      @badsnoopy667

                                      Danke.

                                      Gibt es da vielleicht schon ein fertiges blockly?

                                      B Offline
                                      B Offline
                                      badsnoopy667
                                      schrieb am zuletzt editiert von
                                      #103

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

                                      1 Antwort Letzte Antwort
                                      0
                                      • J 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

                                        AtifanA Offline
                                        AtifanA Offline
                                        Atifan
                                        schrieb am zuletzt editiert von
                                        #104

                                        @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 Antwort Letzte Antwort
                                        0
                                        • Alex WarkentinA Offline
                                          Alex WarkentinA Offline
                                          Alex Warkentin
                                          schrieb am zuletzt editiert von
                                          #105

                                          Du solltest dann das Ursprungs-Script von Kachel aus dem ersten Post nehmen und beide ggf. kombinieren.

                                          X 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

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

                                          220

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe