Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. R4

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    R
    • Profile
    • Following 0
    • Followers 1
    • Topics 0
    • Posts 50
    • Best 2
    • Groups 1

    R4

    @R4

    Starter

    2
    Reputation
    8
    Profile views
    50
    Posts
    1
    Followers
    0
    Following
    Joined Last Online

    R4 Follow
    Starter

    Best posts made by R4

    • RE: Huawei Sun2000 & ioBroker via JS script funktioniert

      @mrlee

      hab das Script inzwischen ganz schön umgebaut.
      Zum Thema Priorisierung ist das hier wesentlich:

      // These register spaces need to be read:
      const RegisterSpacesToReadContinuously = [[32000, 116], // read often: Inverter.ActivePower: 32080, Inverter.InputPower: 32064
                                                [37100, 114], // read often: Meter.ActivePower: 37113
                                                [37700, 100], // read often: Inverter.Battery.SOC: 37760, Inverter.Battery.ChargeAndDischargePower: 37765
                                                [47075, 10],  // read often: MaximumChargingPower,...
                                                [37000, 68],  // Batterystack,... --> read rarely
                                                [37800, 100], // Batterystack --> read rarely
                                                [38200, 100], // Batterystack --> read rarely
                                                [38300, 100], // Batterystack --> read rarely
                                                [38400, 100], // Batterystack --> read rarely
                                                [30000, 81]   // ProcessDeviceInfo() --> read rarely
      //                                          [35300, 40] // Inverter.ActiveAdjustement.* --> no use
                                                ]; 
                                                
      var RegisterSpacesToReadContinuouslyPtr = 0;
      const RegisterSpacesToReadPrioLoops = 56; // number of fast read cycles before full read cycle (~ every 15 mins at 4s cycle time)
      const RegisterSpacesToReadFast = 4; // number of registers to be read fast
      var RegisterSpacesToReadPrioLoopCount = 0;
      

      Dazu kommen noch für meine Schreibarbeiten ins Register 47075 (mehr brauche ich derzeit nicht):

      var triggerWriteProcessing = false; // write instead of read a register
      var batteryChargePower = 0; // value to be written into register 47075
      

      Die werden im Ablauf gesetzt durch on() oder durch zeitliche Ereignisse...

      Dann die Intervall-Funktion:

      setInterval(function()
      // -------------------
      // This is the main function triggering a read or a write via modbus-tcp every xx seconds (see value below in ms)
      // Processing of data is triggered as soon as one complete set of registers is copied
      // with 4 seconds, new values are displyed every 16/40 seconds
      {
          var RegisterSpacesToReadContinuouslyLength;
      
          if (triggerprocessing == 1)
          {
              ProcessData();
              triggerprocessing = 0;        
          }      
          
          if (triggerWriteProcessing == false) // read register (either read or write in one interval)
          {
              console.debug("Triggering read of inverter at address " +
                  RegisterSpacesToReadContinuously[RegisterSpacesToReadContinuouslyPtr][0] +
                  " with length " +  RegisterSpacesToReadContinuously[RegisterSpacesToReadContinuouslyPtr][1]);
      
              readRegisterSpace(RegisterSpacesToReadContinuously[RegisterSpacesToReadContinuouslyPtr][0], RegisterSpacesToReadContinuously[RegisterSpacesToReadContinuouslyPtr][1]); 
              RegisterSpacesToReadContinuouslyPtr++;               
              if (RegisterSpacesToReadPrioLoopCount == 0) RegisterSpacesToReadContinuouslyLength = RegisterSpacesToReadContinuously.length;
                  else RegisterSpacesToReadContinuouslyLength = RegisterSpacesToReadFast; // number of registers to be read
              if (RegisterSpacesToReadContinuouslyPtr >= RegisterSpacesToReadContinuouslyLength)
              {
                  RegisterSpacesToReadContinuouslyPtr = 0;
                  RegisterSpacesToReadPrioLoopCount++;
                  if (RegisterSpacesToReadPrioLoopCount >= RegisterSpacesToReadPrioLoops) RegisterSpacesToReadPrioLoopCount = 0;
                  triggerprocessing = 1; // everything was read, now set the datapoints
              }
          }
          else // triggerWriteProcessing == true --> write register
          {
              client.writeRegisters(47075, [0, batteryChargePower]); // write the value 0, xxx to registers starting at address 47075
              triggerWriteProcessing = false;
          }
      }, 4000);
      

      Hinweis - statt

      // get SOC of first battery stack and combine to one string
          var BatOverview = "";
          for(var j = 1; j <= BatteryUnits[0][0]; j++)
          { 
              if (j > 1) BatOverview += ", ";
              BatOverview += getState("javascript.0.Solarpower.Huawei.Inverter.1.Batterystack.1.Battery" + j + ".BatterySOC").val + "%";
          }
          setState("javascript.0.Solarpower.Derived.BatteryOverview", BatOverview);
      

      hab ich, weil nur 5kWh Batterie:

      // get SOC of all batteries and combine to one string (only one battery here...)
          var BatOverview = getState("javascript.0.Solarpower.Huawei.Inverter.Battery.SOC").val; 
          setState("javascript.0.Solarpower.Derived.BatteryOverview", BatOverview);
      

      das spart Registerbereiche - Inverter.1.Batterystack.1.Battery.* wird bei mir ja nur noch alle 15 Minuten aktualisiert. Selbiges für YieldToday, IsBatteryLoading.
      (und ja, den DP Derived.BatteryOverview könnte ich mir sparen indem ich gleich Inverter.Battery.SOC verwende...)
      BatOverview und der DP Derived.BatteryOverview sind bei mir auch kein String, sondern 'ne Zahl, weil ich damit weiterrechne.

      posted in ioBroker Allgemein
      R
      R4
    • RE: Huawei Sun2000 & ioBroker via JS script funktioniert

      @bishop
      Hab ich auch so ✔

      posted in ioBroker Allgemein
      R
      R4

    Latest posts made by R4

    • RE: Huawei Sun2000 & ioBroker via JS script funktioniert

      @bishop
      Probier's aus.
      Als ich angefangen hab gab es das noch nicht. Das Script habe ich inzwischen um ein paar Sachen erweitert, die nichts mit PV zu tun haben, und ist bei mir nun die "zentrale" HA-Lösung (mache nicht viel, das bisschen Programmieren ist für mich leicht).

      posted in ioBroker Allgemein
      R
      R4
    • RE: Huawei Sun2000 & ioBroker via JS script funktioniert

      @bishop
      Hab ich auch so ✔

      posted in ioBroker Allgemein
      R
      R4
    • RE: Huawei Sun2000 & ioBroker via JS script funktioniert

      @palantin
      An welchem WR ist denn der Powermeter angeschlossen?
      Schon mal "1" getestet?

      posted in ioBroker Allgemein
      R
      R4
    • RE: Huawei Sun2000 & ioBroker via JS script funktioniert

      @bahnuhr
      Außer einem "schöneren" Log hast du damit aber nichts gewonnen:
      Die Daten (alle) werden dann nur noch alle 10*RegFast Sekunden, also 50s bei Standardwerten, statt alle 25s aktualisiert.
      Die Fehlermeldung wird wohl dennoch hin und wieder auftauchen, und so musst du eben auf diesen Teil der Daten 100s warten, statt 50s bei der ursprünglichen Einstellung.
      Huawei ist hier ein bisschen (arg) langsam, damit muss man offenbar leben *). Den Fehler kann man aber ignorieren, du hast dann lediglich kurzzeitig ein wenig veraltete Daten.

      *) Mit Aufwand zu umgehen

      posted in ioBroker Allgemein
      R
      R4
    • RE: Huawei Sun2000 & ioBroker via JS script funktioniert

      @bahnuhr
      Die Zahl am Ende der Funktion setInterval() - also die Intervalldauer - erhöhen hilft die Anzahl dieser Meldungen zu verringern.

      (Die Fehlermeldung kommt bei mir mit 4000ms auch immer wieder, macht aber nix, da wird dann halt mal ein Registerbereich nicht aktualisiert.)

      posted in ioBroker Allgemein
      R
      R4
    • RE: Huawei Sun2000 & ioBroker via JS script funktioniert

      @rainereglinsky
      Dein
      schedule("59 23 * * *", function () {...}
      tut nicht. Lässt du das Script tagelang durchlaufen? Hast du was rausgelöscht?

      posted in ioBroker Allgemein
      R
      R4
    • RE: Huawei Sun2000 & ioBroker via JS script funktioniert

      @axel-koeneke
      du meinst das hier?

      posted in ioBroker Allgemein
      R
      R4
    • RE: Huawei Sun2000 & ioBroker via JS script funktioniert

      @heinzie
      Du könntest versuchen in der Funktion readRegisterSpace() den auskommentierten Bereich zu aktivieren, also:

      function readRegisterSpace(id, address, length)
      //---------------------------------------------
       {
          client.setID(ModBusIDs[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: " + ModBusIDs[id-1] + " with error: " + modbusErrorMessages[err.modbusCode]);            
              }
              else
              {   //console.debug("Read data from id/address " + ModBusIDs[id-1] + "/" + address + "\nData is: " + data.data);
                  for (var i = 0; i < length; i++) Buffer[id-1][address + i - BufOffset] = data.data[i];
              }
          });
      }
      
      posted in ioBroker Allgemein
      R
      R4
    • RE: Huawei Sun2000 & ioBroker via JS script funktioniert

      @chris_b
      Zeile 3 "modidfied"
      ... ne, ich schau es mir mal kritisch an 😉

      posted in ioBroker Allgemein
      R
      R4
    • RE: Huawei Sun2000 & ioBroker via JS script funktioniert

      @hussi
      Chris_B hat dir praktisch schon mal darauf geantwortet

      posted in ioBroker Allgemein
      R
      R4
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo