Skip to content
  • 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
  1. ioBroker Community Home
  2. Deutsch
  3. Hardware
  4. Fronius Symo Gen24: minSOC einstellen

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

Fronius Symo Gen24: minSOC einstellen

Geplant Angeheftet Gesperrt Verschoben Hardware
26 Beiträge 10 Kommentatoren 6.4k Aufrufe 11 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.
  • L legro

    @nkleber sagte in Fronius Symo Gen24: minSOC einstellen:

    @samverner Über die Solar API geht das nicht. Das geht nur über den Modbus adapter. Das habe ich bei mir so implementiert z.b. auch das charge from grid wird damit gesteuert...

    Verrätst du uns auch, welche Holding-Register dazu zu verwenden sind?

    Mit viel Fleiß und Mühe habe ich mittlerweile alle Modbus-Register editiert. Bei den vielen Registern sehe ich jedoch den Wald vor lauter Bäumen nicht mehr.

    nkleberN Offline
    nkleberN Offline
    nkleber
    schrieb am zuletzt editiert von
    #5

    @legro Anbei meine config (TSV) für den GEN24 mit dem BYD Speicher und Smartmeter. FroniusGen24BydSmartmeter.txt

    Für MINSOC ist es der Parameter MinRsvPct. Über "StorCtl_Mod" kannst du auch aktiv eine Ladung / Entladung steuern. Das ist aber etwas speziell. Hoffe das hilft dir bzw. auch anderen...

    Hier mein Javascript code für das erzwungene laden:
    setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod'/Activate hold/discharge/charge storage control mode Bitfield value bit 0: DISCHARGE bit 1: CHARGE/,2,false); /* Activate charging and discharging limits*/
    setState('modbus.1.holdingRegisters.1.40365_OutWRte'/Percent of max charge rate For force charging it must a negativ value/,-100,false); /* Charge with maximum possible power*/
    //setState('modbus.1.holdingRegisters.1.40365_InWRte',0,false); /* Prevent discharging in that period */

    L 1 Antwort Letzte Antwort
    1
    • nkleberN nkleber

      @legro Anbei meine config (TSV) für den GEN24 mit dem BYD Speicher und Smartmeter. FroniusGen24BydSmartmeter.txt

      Für MINSOC ist es der Parameter MinRsvPct. Über "StorCtl_Mod" kannst du auch aktiv eine Ladung / Entladung steuern. Das ist aber etwas speziell. Hoffe das hilft dir bzw. auch anderen...

      Hier mein Javascript code für das erzwungene laden:
      setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod'/Activate hold/discharge/charge storage control mode Bitfield value bit 0: DISCHARGE bit 1: CHARGE/,2,false); /* Activate charging and discharging limits*/
      setState('modbus.1.holdingRegisters.1.40365_OutWRte'/Percent of max charge rate For force charging it must a negativ value/,-100,false); /* Charge with maximum possible power*/
      //setState('modbus.1.holdingRegisters.1.40365_InWRte',0,false); /* Prevent discharging in that period */

      L Abwesend
      L Abwesend
      legro
      schrieb am zuletzt editiert von legro
      #6

      @nkleber

      Vielen Dank für deine Hilfe. Du hast mir vermutlich Stunden Arbeit und Grübeln erspart. 😉

      Die Modbus-Register hätte ich gerne früher gehabt. In mühevoller Fleißarbeit habe ich offenbar dieselbe qualvolle Arbeit ebenfalls aufgebracht. Dafür habe ich es umso leichter beim Skripten.

      Nach über vier Jahren Leidenszeit unter Qivicon/MSH vor den Telekomikern zu ioBroker geflüchtet.
      Raspberry Pi 4 mit 8GB + ArgonOneM.2 + 120GB SSD + Coordinator CC26X2R1 + ioBroker + piVCCU3

      nkleberN 1 Antwort Letzte Antwort
      0
      • L legro

        @nkleber

        Vielen Dank für deine Hilfe. Du hast mir vermutlich Stunden Arbeit und Grübeln erspart. 😉

        Die Modbus-Register hätte ich gerne früher gehabt. In mühevoller Fleißarbeit habe ich offenbar dieselbe qualvolle Arbeit ebenfalls aufgebracht. Dafür habe ich es umso leichter beim Skripten.

        nkleberN Offline
        nkleberN Offline
        nkleber
        schrieb am zuletzt editiert von
        #7

        @legro hier das ganze script. Musst halt schauen was für dich sinnvoll ist :). Denn hier wird auch der Speicher in gewissen situationen blockiert ausser die Wärmepunpe läuft (großer verbraucher)

        var maxChargeSetpoint = 100; // maximum charge state for charge from grid
        var maxDischargeSetpoint = 60; // maximum charge state for stop discharge
        var bChargeFromGrid = false; // allow to charge the battery from grid
        var minChargeSetpoint = 10;
        
        /*
        allow to discharge. This runs the whole year to ensure that once a day the state is correct set to 5%
        */
        var allowDischarge = schedule('0 6 * * *', function () {
            log("Allow discharge scheduler started!",'debug');
            setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',minChargeSetpoint,false)
            setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod',0,false) /* Change to normal operation */
            log("Minimum charging state is set to " + minChargeSetpoint + "% and discharge allowed",'info')
        });
        
        function allowDischargeWP(isStart){
            var min_set = getState('modbus.1.holdingRegisters.1.40360_MinRsvPct').val;
            var curChargeState = getState('modbus.1.holdingRegisters.1.40361_ChaState').val;
            var storMode = getState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod').val;
            log("min_set = " + min_set + ", curChargeState = " + curChargeState + ", storMode = " + storMode,'info')
            if(storMode > 0 || min_set == minChargeSetpoint || ((curChargeState < minChargeSetpoint+5) && isStart)){
                //log("min_set = " + min_set + ", curChargeState = " + curChargeState + ", storMode = " + storMode)
                log("Start / Stop des Speichers ist nicht erlaubt!",'info');
                return;
            }
            
            if(isStart){
                setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',minChargeSetpoint+1,false); // make sure to set it to 6% and not 5% for above check
                log("Speicher ist freigegeben!",'info');
            }else if(min_set < curChargeState){
                setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',curChargeState,false)
                log("Speicher ist blockiert!",'info');
            }else if(min_set == curChargeState){ // in this case the storage is empty. So change to normal operation
                setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',minChargeSetpoint,false)
                log("Speicher ist leer, umstellung auf Normalbetrieb erfolgt!",'info');
            }
        }
        
        on({ id: 'javascript.0.Pool.bWaermepumpeBoilerbetrieb', change: 'gt'}, function(obj) {
            log("Wärmepumpe Boilerbetrieb hat gestartet",'info');
            allowDischargeWP(true);
        });
        on({ id: 'javascript.0.Pool.bWaermepumpeBoilerbetrieb', change: 'lt'}, function(obj) {
            log("Wärmepumpe Boilerbetrieb hat gestoppt",'info');
            allowDischargeWP(false);
        });
        on({ id: 'javascript.0.Pool.bWaermepumpeHeizbetrieb', change: 'gt'}, function(obj) {
            log("Wärmepumpe Heizbetrieb hat gestartet",'info');
            allowDischargeWP(true);
        });
        on({ id: 'javascript.0.Pool.bWaermepumpeHeizbetrieb', change: 'lt'}, function(obj) {
            log("Wärmepumpe Heizbetrieb hat gestoppt",'info');
            allowDischargeWP(false);
        });
        
        
        var chargeFromGrid = schedule('*/15 3-5 * 1,2,11,12 *', function () { /* Aktivieren des Speicher ladens mit Nachstrom */
            if (!bChargeFromGrid) { // do not execute later code if chargeFromGrid is disabled
                return;
            }
            var curChargeState = getState('modbus.1.holdingRegisters.1.40361_ChaState').val;
            
            // check if it is needed and time to start charging
            var curDate = new Date();
            var deltaTime = 5.5 - (curDate.getHours() + curDate.getMinutes()/60); // assuming we need to finish charging at 5:30
            var neededTime = (maxChargeSetpoint - curChargeState)/40; // Assuming we are charging 40% per hour
            if(curChargeState > (maxChargeSetpoint-10) ||  neededTime < deltaTime){ // do nothing because it is either not neeed to charge or too early
                log("Charging from grid not started because not needed or too early!",'debug');
                return
            }
            // really execute the charging
            setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod'/*Activate hold/discharge/charge storage control mode  Bitfield value bit 0: DISCHARGE bit 1: CHARGE*/,2,false); /* Activate charging and discharging limits*/
            setState('modbus.1.holdingRegisters.1.40365_OutWRte'/*Percent of max charge rate  For force charging it must a negativ value*/,-100,false); /* Charge with maximum possible power*/
            //setState('modbus.1.holdingRegisters.1.40365_InWRte',0,false); /* Prevent discharging in that period */
            log("Charging from grid is started!",'info')
        });
        
        var fullyCharged = schedule('*/5 3-5 * 1,2,11,12 *', function () { /* Stoppen des Speicher ladens mit Nachstrom */
            log("Check if battery is charged to requested state, if yes -> stop!",'debug');
            var curChargeState = getState('modbus.1.holdingRegisters.1.40361_ChaState').val;
            var curChargeCurrent = Number(getState('modbus.1.holdingRegisters.1.40322_3_DCA'/*DC Current*/).val);
            var curOperationState = getState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod').val
            if(curOperationState > 0){
                log("Current charge current is " + curChargeCurrent + " A, charging state = " + curChargeState + " %",'info')
            }
            if(curOperationState > 0 && curChargeState >= maxChargeSetpoint){
                setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',curChargeState,false)
                setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod',0,false) /* Change to normal operation */
                log("Charging is finished, minimum charging state is set to " + curChargeState + "%",'info')
            }
        });
        
        var stopDischarge = schedule('*/15 16-20 * 1,2,3,10,11,12 *', function () {
            log("Stop discharge scheduler started!",'debug');
            var curChargeState = getState('modbus.1.holdingRegisters.1.40361_ChaState').val;
            var curDischargePower = getState('modbus.0.holdingRegisters.16432_AverageDischargePower').val;
            if(curChargeState <= maxDischargeSetpoint && getState('modbus.1.holdingRegisters.1.40360_MinRsvPct').val <= 6 && curDischargePower < 600){
                setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',Math.max(curChargeState-1,5),false)
                log("Minimum charging state is set to " + Math.max(curChargeState-1,5) + "%",'info')
            }
        });
        
        // clear scheduler if script stopped
        onStop(function () {
            log("Script stopped!",'info');
            // stop the scheduler
            clearSchedule(allowDischarge);
            clearSchedule(stopDischarge);
            clearSchedule(chargeFromGrid);
            clearSchedule(fullyCharged);
        }, 1000 /*ms*/);
        
        Pedder007P 2 Antworten Letzte Antwort
        1
        • nkleberN nkleber

          @legro hier das ganze script. Musst halt schauen was für dich sinnvoll ist :). Denn hier wird auch der Speicher in gewissen situationen blockiert ausser die Wärmepunpe läuft (großer verbraucher)

          var maxChargeSetpoint = 100; // maximum charge state for charge from grid
          var maxDischargeSetpoint = 60; // maximum charge state for stop discharge
          var bChargeFromGrid = false; // allow to charge the battery from grid
          var minChargeSetpoint = 10;
          
          /*
          allow to discharge. This runs the whole year to ensure that once a day the state is correct set to 5%
          */
          var allowDischarge = schedule('0 6 * * *', function () {
              log("Allow discharge scheduler started!",'debug');
              setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',minChargeSetpoint,false)
              setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod',0,false) /* Change to normal operation */
              log("Minimum charging state is set to " + minChargeSetpoint + "% and discharge allowed",'info')
          });
          
          function allowDischargeWP(isStart){
              var min_set = getState('modbus.1.holdingRegisters.1.40360_MinRsvPct').val;
              var curChargeState = getState('modbus.1.holdingRegisters.1.40361_ChaState').val;
              var storMode = getState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod').val;
              log("min_set = " + min_set + ", curChargeState = " + curChargeState + ", storMode = " + storMode,'info')
              if(storMode > 0 || min_set == minChargeSetpoint || ((curChargeState < minChargeSetpoint+5) && isStart)){
                  //log("min_set = " + min_set + ", curChargeState = " + curChargeState + ", storMode = " + storMode)
                  log("Start / Stop des Speichers ist nicht erlaubt!",'info');
                  return;
              }
              
              if(isStart){
                  setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',minChargeSetpoint+1,false); // make sure to set it to 6% and not 5% for above check
                  log("Speicher ist freigegeben!",'info');
              }else if(min_set < curChargeState){
                  setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',curChargeState,false)
                  log("Speicher ist blockiert!",'info');
              }else if(min_set == curChargeState){ // in this case the storage is empty. So change to normal operation
                  setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',minChargeSetpoint,false)
                  log("Speicher ist leer, umstellung auf Normalbetrieb erfolgt!",'info');
              }
          }
          
          on({ id: 'javascript.0.Pool.bWaermepumpeBoilerbetrieb', change: 'gt'}, function(obj) {
              log("Wärmepumpe Boilerbetrieb hat gestartet",'info');
              allowDischargeWP(true);
          });
          on({ id: 'javascript.0.Pool.bWaermepumpeBoilerbetrieb', change: 'lt'}, function(obj) {
              log("Wärmepumpe Boilerbetrieb hat gestoppt",'info');
              allowDischargeWP(false);
          });
          on({ id: 'javascript.0.Pool.bWaermepumpeHeizbetrieb', change: 'gt'}, function(obj) {
              log("Wärmepumpe Heizbetrieb hat gestartet",'info');
              allowDischargeWP(true);
          });
          on({ id: 'javascript.0.Pool.bWaermepumpeHeizbetrieb', change: 'lt'}, function(obj) {
              log("Wärmepumpe Heizbetrieb hat gestoppt",'info');
              allowDischargeWP(false);
          });
          
          
          var chargeFromGrid = schedule('*/15 3-5 * 1,2,11,12 *', function () { /* Aktivieren des Speicher ladens mit Nachstrom */
              if (!bChargeFromGrid) { // do not execute later code if chargeFromGrid is disabled
                  return;
              }
              var curChargeState = getState('modbus.1.holdingRegisters.1.40361_ChaState').val;
              
              // check if it is needed and time to start charging
              var curDate = new Date();
              var deltaTime = 5.5 - (curDate.getHours() + curDate.getMinutes()/60); // assuming we need to finish charging at 5:30
              var neededTime = (maxChargeSetpoint - curChargeState)/40; // Assuming we are charging 40% per hour
              if(curChargeState > (maxChargeSetpoint-10) ||  neededTime < deltaTime){ // do nothing because it is either not neeed to charge or too early
                  log("Charging from grid not started because not needed or too early!",'debug');
                  return
              }
              // really execute the charging
              setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod'/*Activate hold/discharge/charge storage control mode  Bitfield value bit 0: DISCHARGE bit 1: CHARGE*/,2,false); /* Activate charging and discharging limits*/
              setState('modbus.1.holdingRegisters.1.40365_OutWRte'/*Percent of max charge rate  For force charging it must a negativ value*/,-100,false); /* Charge with maximum possible power*/
              //setState('modbus.1.holdingRegisters.1.40365_InWRte',0,false); /* Prevent discharging in that period */
              log("Charging from grid is started!",'info')
          });
          
          var fullyCharged = schedule('*/5 3-5 * 1,2,11,12 *', function () { /* Stoppen des Speicher ladens mit Nachstrom */
              log("Check if battery is charged to requested state, if yes -> stop!",'debug');
              var curChargeState = getState('modbus.1.holdingRegisters.1.40361_ChaState').val;
              var curChargeCurrent = Number(getState('modbus.1.holdingRegisters.1.40322_3_DCA'/*DC Current*/).val);
              var curOperationState = getState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod').val
              if(curOperationState > 0){
                  log("Current charge current is " + curChargeCurrent + " A, charging state = " + curChargeState + " %",'info')
              }
              if(curOperationState > 0 && curChargeState >= maxChargeSetpoint){
                  setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',curChargeState,false)
                  setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod',0,false) /* Change to normal operation */
                  log("Charging is finished, minimum charging state is set to " + curChargeState + "%",'info')
              }
          });
          
          var stopDischarge = schedule('*/15 16-20 * 1,2,3,10,11,12 *', function () {
              log("Stop discharge scheduler started!",'debug');
              var curChargeState = getState('modbus.1.holdingRegisters.1.40361_ChaState').val;
              var curDischargePower = getState('modbus.0.holdingRegisters.16432_AverageDischargePower').val;
              if(curChargeState <= maxDischargeSetpoint && getState('modbus.1.holdingRegisters.1.40360_MinRsvPct').val <= 6 && curDischargePower < 600){
                  setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',Math.max(curChargeState-1,5),false)
                  log("Minimum charging state is set to " + Math.max(curChargeState-1,5) + "%",'info')
              }
          });
          
          // clear scheduler if script stopped
          onStop(function () {
              log("Script stopped!",'info');
              // stop the scheduler
              clearSchedule(allowDischarge);
              clearSchedule(stopDischarge);
              clearSchedule(chargeFromGrid);
              clearSchedule(fullyCharged);
          }, 1000 /*ms*/);
          
          Pedder007P Offline
          Pedder007P Offline
          Pedder007
          schrieb am zuletzt editiert von Pedder007
          #8

          Hallo zusammen @nkleber und @legro.
          Ich hatte gestern Abend bereits in einem anderen Thread bzgl. nicht funktionierender Nutzung von Modbus Datenpunkten um Hilfe gefragt.
          Nun habe ich aber heute Morgen noch diesen Thread hier entdeckt, welcher meine Frage evtl. doch nochmal etwas genereller werden lässt.
          Wenn ich die beiden TSV Dateien (anderer Thread von @legro und hier von @nkleber) vergleiche, stelle ich dabei fest, dass ihr wohl unterschiedliche Registeradressen benutzt, was evtl. am Ende mein Problem erklären könnte.

          Zwei Beispiele:
          TSV von @legro
          40358_InOutWRte_RvrtTms
          40360_ChaGriSet

          wogegen in TSV von @nkleber
          40358_StorCtl_Mod
          40360_MinRsvPct

          Ich habe einen Symo GEN24 8.0 (in Kombi mit Smartmeter und auch BYD), welche TSV sollte denn da passen?
          Bei der von @legro sahen die Werte die sich das Adapter gezogen hat, immerhin schlüssig zu den Bezeichnungen aus.

          Aber evtl. habe ich das Ganze Thema um das Holding-Register herum und im Zusammenspiel mit den daraus entstehenden Datenpunkten ja auch noch gar nicht richtig verstanden?

          Wäre toll wenn da einer einen Tipp für mich hätte 🙂

          Pedder
          All @Proxmox/Bookworm auf HP Elitedesk 800 G4; Zigbee: ZigStar (LAN), ~110Devices
          Unifi, Motioneye/3Reolinks, PiHole, Bosch 7800i via BBQKees/EMS-ESP, Fronius/BYD 11kWp via Modbus

          Pedder007P 1 Antwort Letzte Antwort
          0
          • Pedder007P Pedder007

            Hallo zusammen @nkleber und @legro.
            Ich hatte gestern Abend bereits in einem anderen Thread bzgl. nicht funktionierender Nutzung von Modbus Datenpunkten um Hilfe gefragt.
            Nun habe ich aber heute Morgen noch diesen Thread hier entdeckt, welcher meine Frage evtl. doch nochmal etwas genereller werden lässt.
            Wenn ich die beiden TSV Dateien (anderer Thread von @legro und hier von @nkleber) vergleiche, stelle ich dabei fest, dass ihr wohl unterschiedliche Registeradressen benutzt, was evtl. am Ende mein Problem erklären könnte.

            Zwei Beispiele:
            TSV von @legro
            40358_InOutWRte_RvrtTms
            40360_ChaGriSet

            wogegen in TSV von @nkleber
            40358_StorCtl_Mod
            40360_MinRsvPct

            Ich habe einen Symo GEN24 8.0 (in Kombi mit Smartmeter und auch BYD), welche TSV sollte denn da passen?
            Bei der von @legro sahen die Werte die sich das Adapter gezogen hat, immerhin schlüssig zu den Bezeichnungen aus.

            Aber evtl. habe ich das Ganze Thema um das Holding-Register herum und im Zusammenspiel mit den daraus entstehenden Datenpunkten ja auch noch gar nicht richtig verstanden?

            Wäre toll wenn da einer einen Tipp für mich hätte 🙂

            Pedder007P Offline
            Pedder007P Offline
            Pedder007
            schrieb am zuletzt editiert von
            #9

            So, meine Güte, was man da alles zu recherchieren hat 😉

            Ich hab's nun. Verwenden kann ich wohl die TSV von @legro.
            Um den Wert dann aber auch wirklich in der Maschine gültig zu setzen, muss man ja noch den 40348_StorCtl_Mod entsprechend parametrisieren. Das habe ich dann noch irgendwo in einem weiteren Fronius PDF gefunden, dann aber auch gesehen, dass das ja auch in @nkleber's Script so steht - wobei ich 'Null' Javascript kann 😉

            Falls ihr Euch schon einen Kopf gemacht hattet, auf jeden Fall trotzdem Danke 🙂

            Pedder
            All @Proxmox/Bookworm auf HP Elitedesk 800 G4; Zigbee: ZigStar (LAN), ~110Devices
            Unifi, Motioneye/3Reolinks, PiHole, Bosch 7800i via BBQKees/EMS-ESP, Fronius/BYD 11kWp via Modbus

            1 Antwort Letzte Antwort
            0
            • nkleberN nkleber

              @legro hier das ganze script. Musst halt schauen was für dich sinnvoll ist :). Denn hier wird auch der Speicher in gewissen situationen blockiert ausser die Wärmepunpe läuft (großer verbraucher)

              var maxChargeSetpoint = 100; // maximum charge state for charge from grid
              var maxDischargeSetpoint = 60; // maximum charge state for stop discharge
              var bChargeFromGrid = false; // allow to charge the battery from grid
              var minChargeSetpoint = 10;
              
              /*
              allow to discharge. This runs the whole year to ensure that once a day the state is correct set to 5%
              */
              var allowDischarge = schedule('0 6 * * *', function () {
                  log("Allow discharge scheduler started!",'debug');
                  setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',minChargeSetpoint,false)
                  setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod',0,false) /* Change to normal operation */
                  log("Minimum charging state is set to " + minChargeSetpoint + "% and discharge allowed",'info')
              });
              
              function allowDischargeWP(isStart){
                  var min_set = getState('modbus.1.holdingRegisters.1.40360_MinRsvPct').val;
                  var curChargeState = getState('modbus.1.holdingRegisters.1.40361_ChaState').val;
                  var storMode = getState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod').val;
                  log("min_set = " + min_set + ", curChargeState = " + curChargeState + ", storMode = " + storMode,'info')
                  if(storMode > 0 || min_set == minChargeSetpoint || ((curChargeState < minChargeSetpoint+5) && isStart)){
                      //log("min_set = " + min_set + ", curChargeState = " + curChargeState + ", storMode = " + storMode)
                      log("Start / Stop des Speichers ist nicht erlaubt!",'info');
                      return;
                  }
                  
                  if(isStart){
                      setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',minChargeSetpoint+1,false); // make sure to set it to 6% and not 5% for above check
                      log("Speicher ist freigegeben!",'info');
                  }else if(min_set < curChargeState){
                      setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',curChargeState,false)
                      log("Speicher ist blockiert!",'info');
                  }else if(min_set == curChargeState){ // in this case the storage is empty. So change to normal operation
                      setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',minChargeSetpoint,false)
                      log("Speicher ist leer, umstellung auf Normalbetrieb erfolgt!",'info');
                  }
              }
              
              on({ id: 'javascript.0.Pool.bWaermepumpeBoilerbetrieb', change: 'gt'}, function(obj) {
                  log("Wärmepumpe Boilerbetrieb hat gestartet",'info');
                  allowDischargeWP(true);
              });
              on({ id: 'javascript.0.Pool.bWaermepumpeBoilerbetrieb', change: 'lt'}, function(obj) {
                  log("Wärmepumpe Boilerbetrieb hat gestoppt",'info');
                  allowDischargeWP(false);
              });
              on({ id: 'javascript.0.Pool.bWaermepumpeHeizbetrieb', change: 'gt'}, function(obj) {
                  log("Wärmepumpe Heizbetrieb hat gestartet",'info');
                  allowDischargeWP(true);
              });
              on({ id: 'javascript.0.Pool.bWaermepumpeHeizbetrieb', change: 'lt'}, function(obj) {
                  log("Wärmepumpe Heizbetrieb hat gestoppt",'info');
                  allowDischargeWP(false);
              });
              
              
              var chargeFromGrid = schedule('*/15 3-5 * 1,2,11,12 *', function () { /* Aktivieren des Speicher ladens mit Nachstrom */
                  if (!bChargeFromGrid) { // do not execute later code if chargeFromGrid is disabled
                      return;
                  }
                  var curChargeState = getState('modbus.1.holdingRegisters.1.40361_ChaState').val;
                  
                  // check if it is needed and time to start charging
                  var curDate = new Date();
                  var deltaTime = 5.5 - (curDate.getHours() + curDate.getMinutes()/60); // assuming we need to finish charging at 5:30
                  var neededTime = (maxChargeSetpoint - curChargeState)/40; // Assuming we are charging 40% per hour
                  if(curChargeState > (maxChargeSetpoint-10) ||  neededTime < deltaTime){ // do nothing because it is either not neeed to charge or too early
                      log("Charging from grid not started because not needed or too early!",'debug');
                      return
                  }
                  // really execute the charging
                  setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod'/*Activate hold/discharge/charge storage control mode  Bitfield value bit 0: DISCHARGE bit 1: CHARGE*/,2,false); /* Activate charging and discharging limits*/
                  setState('modbus.1.holdingRegisters.1.40365_OutWRte'/*Percent of max charge rate  For force charging it must a negativ value*/,-100,false); /* Charge with maximum possible power*/
                  //setState('modbus.1.holdingRegisters.1.40365_InWRte',0,false); /* Prevent discharging in that period */
                  log("Charging from grid is started!",'info')
              });
              
              var fullyCharged = schedule('*/5 3-5 * 1,2,11,12 *', function () { /* Stoppen des Speicher ladens mit Nachstrom */
                  log("Check if battery is charged to requested state, if yes -> stop!",'debug');
                  var curChargeState = getState('modbus.1.holdingRegisters.1.40361_ChaState').val;
                  var curChargeCurrent = Number(getState('modbus.1.holdingRegisters.1.40322_3_DCA'/*DC Current*/).val);
                  var curOperationState = getState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod').val
                  if(curOperationState > 0){
                      log("Current charge current is " + curChargeCurrent + " A, charging state = " + curChargeState + " %",'info')
                  }
                  if(curOperationState > 0 && curChargeState >= maxChargeSetpoint){
                      setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',curChargeState,false)
                      setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod',0,false) /* Change to normal operation */
                      log("Charging is finished, minimum charging state is set to " + curChargeState + "%",'info')
                  }
              });
              
              var stopDischarge = schedule('*/15 16-20 * 1,2,3,10,11,12 *', function () {
                  log("Stop discharge scheduler started!",'debug');
                  var curChargeState = getState('modbus.1.holdingRegisters.1.40361_ChaState').val;
                  var curDischargePower = getState('modbus.0.holdingRegisters.16432_AverageDischargePower').val;
                  if(curChargeState <= maxDischargeSetpoint && getState('modbus.1.holdingRegisters.1.40360_MinRsvPct').val <= 6 && curDischargePower < 600){
                      setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',Math.max(curChargeState-1,5),false)
                      log("Minimum charging state is set to " + Math.max(curChargeState-1,5) + "%",'info')
                  }
              });
              
              // clear scheduler if script stopped
              onStop(function () {
                  log("Script stopped!",'info');
                  // stop the scheduler
                  clearSchedule(allowDischarge);
                  clearSchedule(stopDischarge);
                  clearSchedule(chargeFromGrid);
                  clearSchedule(fullyCharged);
              }, 1000 /*ms*/);
              
              Pedder007P Offline
              Pedder007P Offline
              Pedder007
              schrieb am zuletzt editiert von
              #10

              @nkleber u @legro hallo nochmal 🙂

              Ich habe mir jetzt per Blockly 2 kleine Scripte gebaut, welche mir die Batterie, über den Tag, jeweils in den (aus meiner Sicht) richtigen Modus (also laden, entladen , hold) setzt, bzw. nachts die Batterie vor Tiefentladung schützt.

              Da (aus meiner Sicht) die beiden Register/Datenfelder:
              modbus.2.holdingRegisters.1.40355_OutWRte
              modbus.2.holdingRegisters.1.40356_InWRte
              aber anders gesetzt werden müssen, als ich das aus der Fronius Modbus Docu verstehe, musste ich mir echt eine kleine Tabelle anlegen, wo ich dann so lange getestet habe, bis die Kombis aus den beiden und
              modbus.2.holdingRegisters.1.40348_StorCtl_Mod
              am Ende das gewünschte Ergebnis erzielt haben.

              Was ich aber noch nicht verstehe, falls von Euch hier doch nochmal einer etwas Zeit haben sollte, wie man:
              modbus.2.holdingRegisters.1.40350_MinRsvPct
              so setzt, dass der Wert auch tatsächlich vom WR berücksichtigt wird.
              Ich hatte dazu auch beide Zustände über die solar.web App (auto + manuell) getestet, aber egal was und wie ich das Eintrage, der Wert den ich über MinRsvPct setze, scheint nicht zu interessieren.
              Für den Moment habe ich das über ein Script abgefangen, welches die Batterie bei 10% einfach in den 'hold' Modus setzt, aber anders wäre natürlich eleganter 😉

              Pedder
              All @Proxmox/Bookworm auf HP Elitedesk 800 G4; Zigbee: ZigStar (LAN), ~110Devices
              Unifi, Motioneye/3Reolinks, PiHole, Bosch 7800i via BBQKees/EMS-ESP, Fronius/BYD 11kWp via Modbus

              nkleberN 1 Antwort Letzte Antwort
              0
              • Pedder007P Pedder007

                @nkleber u @legro hallo nochmal 🙂

                Ich habe mir jetzt per Blockly 2 kleine Scripte gebaut, welche mir die Batterie, über den Tag, jeweils in den (aus meiner Sicht) richtigen Modus (also laden, entladen , hold) setzt, bzw. nachts die Batterie vor Tiefentladung schützt.

                Da (aus meiner Sicht) die beiden Register/Datenfelder:
                modbus.2.holdingRegisters.1.40355_OutWRte
                modbus.2.holdingRegisters.1.40356_InWRte
                aber anders gesetzt werden müssen, als ich das aus der Fronius Modbus Docu verstehe, musste ich mir echt eine kleine Tabelle anlegen, wo ich dann so lange getestet habe, bis die Kombis aus den beiden und
                modbus.2.holdingRegisters.1.40348_StorCtl_Mod
                am Ende das gewünschte Ergebnis erzielt haben.

                Was ich aber noch nicht verstehe, falls von Euch hier doch nochmal einer etwas Zeit haben sollte, wie man:
                modbus.2.holdingRegisters.1.40350_MinRsvPct
                so setzt, dass der Wert auch tatsächlich vom WR berücksichtigt wird.
                Ich hatte dazu auch beide Zustände über die solar.web App (auto + manuell) getestet, aber egal was und wie ich das Eintrage, der Wert den ich über MinRsvPct setze, scheint nicht zu interessieren.
                Für den Moment habe ich das über ein Script abgefangen, welches die Batterie bei 10% einfach in den 'hold' Modus setzt, aber anders wäre natürlich eleganter 😉

                nkleberN Offline
                nkleberN Offline
                nkleber
                schrieb am zuletzt editiert von nkleber
                #11

                @pedder007 Wie du in meinem Script sehen kannst, geht das ganz einfach und ohne Umwege. Wenn der Storage control mode 0 ist, ist laden und entladen erlaubt und die Grenzen werden immer übernommen. Ich vermute du setzt den state mit Acknowledged=true was bedeutet dass der Wert vom Adapter nicht an den WR geschickt wird. Das gilt generell für diese art von Adapter...

                setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',minChargeSetpoint,false)
                setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod',0,false) /* Change to normal operation */
                

                Btw. ich glaub jetzt hab ich verstanden was den Problem ist. Du versuchts die Daten die beim GEN24 in der configuration eingestellt sind für minSOC mit den Daten auf Modbus zu mappen. Das wird nicht gehen da diese nicht auf Modbus übertragen werden. Egal was du da einstellst, du wirst den Wert nicht auf Modbus finden. D.h. du musst sicherstellen dass die Grenzen die dort eingestellt sind weiter sind wie jene die du dynamisch anpassen willst. In meinem fall habe ich minSOC auf 5% aber auf Modbus fahre ich mit 10%.

                Pedder007P 2 Antworten Letzte Antwort
                0
                • nkleberN nkleber

                  @pedder007 Wie du in meinem Script sehen kannst, geht das ganz einfach und ohne Umwege. Wenn der Storage control mode 0 ist, ist laden und entladen erlaubt und die Grenzen werden immer übernommen. Ich vermute du setzt den state mit Acknowledged=true was bedeutet dass der Wert vom Adapter nicht an den WR geschickt wird. Das gilt generell für diese art von Adapter...

                  setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',minChargeSetpoint,false)
                  setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod',0,false) /* Change to normal operation */
                  

                  Btw. ich glaub jetzt hab ich verstanden was den Problem ist. Du versuchts die Daten die beim GEN24 in der configuration eingestellt sind für minSOC mit den Daten auf Modbus zu mappen. Das wird nicht gehen da diese nicht auf Modbus übertragen werden. Egal was du da einstellst, du wirst den Wert nicht auf Modbus finden. D.h. du musst sicherstellen dass die Grenzen die dort eingestellt sind weiter sind wie jene die du dynamisch anpassen willst. In meinem fall habe ich minSOC auf 5% aber auf Modbus fahre ich mit 10%.

                  Pedder007P Offline
                  Pedder007P Offline
                  Pedder007
                  schrieb am zuletzt editiert von Pedder007
                  #12

                  @nkleber hallo und danke für Deine Rückmeldung!
                  Ich hatte die Zeilen in Deinem Script gesehen, aber es könnte tatsächlich möglich sein, das ich beim setzen von MinRsvPct evtl. nicht im Mode 0 war. Das muss ich nochmal prüfen.
                  Getestet hatte ich das bisher direkt auf dem Datenpunkt im Objektbaum und dabei allerdings auch nicht den Haken gesetzt - das sollte dann ja entsprechend ohne ‚Ack‘ sein.

                  Bzgl. der Einstellung in der App, da hatte ich es via Modbus bei, in der App, eingestellten 5% versucht (manuell als auch bei auto, wo ja dann auch 5% drin stehen).
                  Allerdings dachte ich bisher tatsächlich, das sich die Werte gegenseitig ‚synchronisieren‘, danke auch für den Hinweis!

                  Ich werde das dann also die Tage nochmal im Mode 0 probieren.

                  Danke Dir 😊

                  Pedder
                  All @Proxmox/Bookworm auf HP Elitedesk 800 G4; Zigbee: ZigStar (LAN), ~110Devices
                  Unifi, Motioneye/3Reolinks, PiHole, Bosch 7800i via BBQKees/EMS-ESP, Fronius/BYD 11kWp via Modbus

                  1 Antwort Letzte Antwort
                  0
                  • nkleberN nkleber

                    @pedder007 Wie du in meinem Script sehen kannst, geht das ganz einfach und ohne Umwege. Wenn der Storage control mode 0 ist, ist laden und entladen erlaubt und die Grenzen werden immer übernommen. Ich vermute du setzt den state mit Acknowledged=true was bedeutet dass der Wert vom Adapter nicht an den WR geschickt wird. Das gilt generell für diese art von Adapter...

                    setState('modbus.1.holdingRegisters.1.40360_MinRsvPct',minChargeSetpoint,false)
                    setState('modbus.1.holdingRegisters.1.40358_StorCtl_Mod',0,false) /* Change to normal operation */
                    

                    Btw. ich glaub jetzt hab ich verstanden was den Problem ist. Du versuchts die Daten die beim GEN24 in der configuration eingestellt sind für minSOC mit den Daten auf Modbus zu mappen. Das wird nicht gehen da diese nicht auf Modbus übertragen werden. Egal was du da einstellst, du wirst den Wert nicht auf Modbus finden. D.h. du musst sicherstellen dass die Grenzen die dort eingestellt sind weiter sind wie jene die du dynamisch anpassen willst. In meinem fall habe ich minSOC auf 5% aber auf Modbus fahre ich mit 10%.

                    Pedder007P Offline
                    Pedder007P Offline
                    Pedder007
                    schrieb am zuletzt editiert von Pedder007
                    #13

                    @nkleber sagte in Fronius Symo Gen24: minSOC einstellen:

                    t eingestellt sind weiter sind wie jene die du dynamisch anpassen willst. In meinem fall habe ich minSOC auf 5% aber auf Modbus fahre ich mit 10%.

                    Leider funktioniert das bei mir nicht.
                    Ich habe nun die App auf 10% eingestellt:
                    13999287-5057-426d-9d6b-ea626b395a3e-image.png
                    Auf den Modbus DP habe ich dann entsprechend nachjustiert:
                    a09509a0-64c3-46b2-beaa-c20d5aded9f1-image.png
                    Danach müsste der Wechselrichter/Akku ja eigentlich in die Zwangsladung gehen, tut er aber nicht 😞
                    8032e805-88ed-47b6-ade2-08d85118184e-image.png

                    Wenn ich dagegen über die App dann auf minimal 15% einstelle (erster Screenshoot), geht er sofort in die Zwangsladung.

                    Hast Du da evtl. noch eine andere Idee?

                    Pedder
                    All @Proxmox/Bookworm auf HP Elitedesk 800 G4; Zigbee: ZigStar (LAN), ~110Devices
                    Unifi, Motioneye/3Reolinks, PiHole, Bosch 7800i via BBQKees/EMS-ESP, Fronius/BYD 11kWp via Modbus

                    ste_gleiS 1 Antwort Letzte Antwort
                    0
                    • Pedder007P Pedder007

                      @nkleber sagte in Fronius Symo Gen24: minSOC einstellen:

                      t eingestellt sind weiter sind wie jene die du dynamisch anpassen willst. In meinem fall habe ich minSOC auf 5% aber auf Modbus fahre ich mit 10%.

                      Leider funktioniert das bei mir nicht.
                      Ich habe nun die App auf 10% eingestellt:
                      13999287-5057-426d-9d6b-ea626b395a3e-image.png
                      Auf den Modbus DP habe ich dann entsprechend nachjustiert:
                      a09509a0-64c3-46b2-beaa-c20d5aded9f1-image.png
                      Danach müsste der Wechselrichter/Akku ja eigentlich in die Zwangsladung gehen, tut er aber nicht 😞
                      8032e805-88ed-47b6-ade2-08d85118184e-image.png

                      Wenn ich dagegen über die App dann auf minimal 15% einstelle (erster Screenshoot), geht er sofort in die Zwangsladung.

                      Hast Du da evtl. noch eine andere Idee?

                      ste_gleiS Offline
                      ste_gleiS Offline
                      ste_glei
                      schrieb am zuletzt editiert von
                      #14

                      Auf den Modbus DP habe ich dann entsprechend nachjustiert:

                      Versuche den gewünsten %Wert x100 einzugeben.

                      so wie bei meinem Screenshot 11% = 1100 dann sollte es funktionieren

                      bd48150b-0982-41c5-bec9-3bcb4d3958a3-image.png

                      Pedder007P 1 Antwort Letzte Antwort
                      1
                      • ste_gleiS ste_glei

                        Auf den Modbus DP habe ich dann entsprechend nachjustiert:

                        Versuche den gewünsten %Wert x100 einzugeben.

                        so wie bei meinem Screenshot 11% = 1100 dann sollte es funktionieren

                        bd48150b-0982-41c5-bec9-3bcb4d3958a3-image.png

                        Pedder007P Offline
                        Pedder007P Offline
                        Pedder007
                        schrieb am zuletzt editiert von Pedder007
                        #15

                        @ste_glei sagte in Fronius Symo Gen24: minSOC einstellen:

                        Versuche den gewünsten %Wert x100 einzugeben.

                        Oh Mann, dass war's 👍 Da muss man erstmal drauf kommen, wenn da ja am DP als Einheit '%' dran steht 🙄
                        1000 Dank @ste_glei

                        Da scheint der 'StorCtl_Mod' auch egal zu sein, zumindest funktioniert das nicht nur bei '0', sondern auch bei '2'.

                        Pedder
                        All @Proxmox/Bookworm auf HP Elitedesk 800 G4; Zigbee: ZigStar (LAN), ~110Devices
                        Unifi, Motioneye/3Reolinks, PiHole, Bosch 7800i via BBQKees/EMS-ESP, Fronius/BYD 11kWp via Modbus

                        nkleberN 1 Antwort Letzte Antwort
                        0
                        • Pedder007P Pedder007

                          @ste_glei sagte in Fronius Symo Gen24: minSOC einstellen:

                          Versuche den gewünsten %Wert x100 einzugeben.

                          Oh Mann, dass war's 👍 Da muss man erstmal drauf kommen, wenn da ja am DP als Einheit '%' dran steht 🙄
                          1000 Dank @ste_glei

                          Da scheint der 'StorCtl_Mod' auch egal zu sein, zumindest funktioniert das nicht nur bei '0', sondern auch bei '2'.

                          nkleberN Offline
                          nkleberN Offline
                          nkleber
                          schrieb am zuletzt editiert von
                          #16

                          @pedder007 In diesem Fall passt aber bei euch die Konfiguration nicht. Wenn die Konfiguration korrekt ist, dann wird beim Modbus entsprechend einfach der Prozentwert eingegeben...

                          "common": {
                          "name": "Setpoint for minimum reserve for storage as a percentage of the nominal maximum storage.",
                          "role": "value",
                          "type": "number",
                          "read": true,
                          "write": true,
                          "def": 0,
                          "unit": "% WChaMax"
                          },
                          "native": {
                          "regType": "holdingRegs",
                          "address": 40360,
                          "deviceId": 1,
                          "type": "uint16be",
                          "len": 1,
                          "offset": 0,
                          "factor": 0.01,
                          "poll": true
                          },

                          Pedder007P 1 Antwort Letzte Antwort
                          0
                          • nkleberN nkleber

                            @pedder007 In diesem Fall passt aber bei euch die Konfiguration nicht. Wenn die Konfiguration korrekt ist, dann wird beim Modbus entsprechend einfach der Prozentwert eingegeben...

                            "common": {
                            "name": "Setpoint for minimum reserve for storage as a percentage of the nominal maximum storage.",
                            "role": "value",
                            "type": "number",
                            "read": true,
                            "write": true,
                            "def": 0,
                            "unit": "% WChaMax"
                            },
                            "native": {
                            "regType": "holdingRegs",
                            "address": 40360,
                            "deviceId": 1,
                            "type": "uint16be",
                            "len": 1,
                            "offset": 0,
                            "factor": 0.01,
                            "poll": true
                            },

                            Pedder007P Offline
                            Pedder007P Offline
                            Pedder007
                            schrieb am zuletzt editiert von
                            #17

                            @nkleber sagte in Fronius Symo Gen24: minSOC einstellen:

                            "factor": 0.01,

                            Ja, da hast Du auch wieder Recht 🙂
                            Ich hab's gerade im Adapter kontrolliert und da stand bei mir eine '1' im Faktor 😞
                            Passe ich das an, kann ich dann auch wieder '15' anstatt '1500' eingeben und es klappt.

                            Sehr schön, danke auch an Dich @nkleber 👍

                            Pedder
                            All @Proxmox/Bookworm auf HP Elitedesk 800 G4; Zigbee: ZigStar (LAN), ~110Devices
                            Unifi, Motioneye/3Reolinks, PiHole, Bosch 7800i via BBQKees/EMS-ESP, Fronius/BYD 11kWp via Modbus

                            1 Antwort Letzte Antwort
                            0
                            • Wolfgang GaryW Offline
                              Wolfgang GaryW Offline
                              Wolfgang Gary
                              schrieb am zuletzt editiert von
                              #18

                              Hallo,
                              habe gerade meinen Gen24 per Modbus angehängt und kann somit auch einzelne Werte setzen (z.b. Entladeleistung der BYD Akkus).

                              Nun möchte ich aber zeitgesteuert die Nachladung aus dem Netz erzwingen (AWATTAR bietet oft fast kostenfreien Strom).
                              Dazu habe ich versucht das Register 40360 ChaGriSet auf 1 zu setzen. Lt. Anleitung ist auch in der Oberfläche des Gen24 die Checkbox "Batterieladung aus dem öffentlichen Netz zulassen" zu setzen. Leider wird so aber der Akku nicht aus dem Netz geladen.
                              Einzig durch erhöhen des Registers 40350 MinRsvPct (Min. Reserve for Storage in %) wurde die Ladung erzwungen.

                              Hat schon jemand geschafft 40360 ChaGriSet zur Ladung des Akkus zu nutzen?

                              danke & mfg Wolfgang
                              PS: Danke an alle, die hier ihre Erfahrungen und Expertise teilen, wirklich toll, was alles möglich ist!

                              Pedder007P Z 2 Antworten Letzte Antwort
                              0
                              • Wolfgang GaryW Wolfgang Gary

                                Hallo,
                                habe gerade meinen Gen24 per Modbus angehängt und kann somit auch einzelne Werte setzen (z.b. Entladeleistung der BYD Akkus).

                                Nun möchte ich aber zeitgesteuert die Nachladung aus dem Netz erzwingen (AWATTAR bietet oft fast kostenfreien Strom).
                                Dazu habe ich versucht das Register 40360 ChaGriSet auf 1 zu setzen. Lt. Anleitung ist auch in der Oberfläche des Gen24 die Checkbox "Batterieladung aus dem öffentlichen Netz zulassen" zu setzen. Leider wird so aber der Akku nicht aus dem Netz geladen.
                                Einzig durch erhöhen des Registers 40350 MinRsvPct (Min. Reserve for Storage in %) wurde die Ladung erzwungen.

                                Hat schon jemand geschafft 40360 ChaGriSet zur Ladung des Akkus zu nutzen?

                                danke & mfg Wolfgang
                                PS: Danke an alle, die hier ihre Erfahrungen und Expertise teilen, wirklich toll, was alles möglich ist!

                                Pedder007P Offline
                                Pedder007P Offline
                                Pedder007
                                schrieb am zuletzt editiert von
                                #19

                                @wolfgang-gary sagte in Fronius Symo Gen24: minSOC einstellen:

                                Einzig durch erhöhen des Registers 40350 MinRsvPct

                                Hi, bei mir ist der Case zwar etwas anders, aber Zwangsladung per Register steuere ich über:
                                40348_StorCtl_Mod => '2'
                                40355_OutWRte => '-125' (=~100W Ladelstg,, oder z.B. '-650' =~500W Ladelstg. )

                                Da ich das für meine Zwecke mit den Registeransteuerungen (via Blockly) auch etwas verwirrend fand, habe ich tatsächlich herumprobiert und mir, für meine Zwecke, dazu eine kleine Hilfstabelle mit den Parametern für die, für mich, relevanten Register angelegt. So weiß ich dann auch noch in 6 Monaten was ich mir dabei mal gedacht hatte 😉
                                Ich war auch kurz versucht die Tabelle hier zu teilen, lasse das aber mal lieber, da das bestimmt einen Endlos-Thread erzeugen würde 🤣

                                Pedder
                                All @Proxmox/Bookworm auf HP Elitedesk 800 G4; Zigbee: ZigStar (LAN), ~110Devices
                                Unifi, Motioneye/3Reolinks, PiHole, Bosch 7800i via BBQKees/EMS-ESP, Fronius/BYD 11kWp via Modbus

                                1 Antwort Letzte Antwort
                                0
                                • Wolfgang GaryW Wolfgang Gary

                                  Hallo,
                                  habe gerade meinen Gen24 per Modbus angehängt und kann somit auch einzelne Werte setzen (z.b. Entladeleistung der BYD Akkus).

                                  Nun möchte ich aber zeitgesteuert die Nachladung aus dem Netz erzwingen (AWATTAR bietet oft fast kostenfreien Strom).
                                  Dazu habe ich versucht das Register 40360 ChaGriSet auf 1 zu setzen. Lt. Anleitung ist auch in der Oberfläche des Gen24 die Checkbox "Batterieladung aus dem öffentlichen Netz zulassen" zu setzen. Leider wird so aber der Akku nicht aus dem Netz geladen.
                                  Einzig durch erhöhen des Registers 40350 MinRsvPct (Min. Reserve for Storage in %) wurde die Ladung erzwungen.

                                  Hat schon jemand geschafft 40360 ChaGriSet zur Ladung des Akkus zu nutzen?

                                  danke & mfg Wolfgang
                                  PS: Danke an alle, die hier ihre Erfahrungen und Expertise teilen, wirklich toll, was alles möglich ist!

                                  Z Offline
                                  Z Offline
                                  zloe
                                  schrieb am zuletzt editiert von zloe
                                  #20

                                  Hi @wolfgang-gary ,
                                  ich habe mit eine JS Funktion geschrieben um die erzwungene Ladung zeitlich zu steuern.
                                  Mein ANwendungsfall ist, dass ich um ca. 17h die awattar Preise prüfe und dann berechne ob und wann es sich auszahlt in der Nacht die Batterie übers Netz zu laden.
                                  Ich berechne dazu sowohl die Dauer der Ladung als auch die minimale Laderate die ich brauche um die Batterie in der Zeit auf gewünschten Ladestand zu bekommen.

                                  Die Funktion ist aber universeller einsetzbar. Man übergibt einfach die notwendigen Werte (siehe Kommentare im Code):

                                  function setRechargeTimers(delayStart, delayEnd, scaledRechargeSoC, rechargeRate, chargeRateScalingFactor) {
                                      // set timers to start the charging (delayStart in ms from "now") */
                                      var t1 = setStateDelayed('modbus.0.holdingRegisters.1.40360_ChaGriSet',   1,                                    delayStart, false); // allow charging from grid
                                      var t2 = setStateDelayed('modbus.0.holdingRegisters.1.40350_MinRsvPct',   scaledRechargeSoC,                    delayStart + 100, false); // set target SoC
                                      var t3 = setStateDelayed('modbus.0.holdingRegisters.1.40355_OutWRte',    -rechargeRate/chargeRateScalingFactor, delayStart + 200, false); // set charge rate
                                      var t4 = setStateDelayed('modbus.0.holdingRegisters.1.40356_InWRte',      100/chargeRateScalingFactor,          delayStart + 300, false); // set max charge rate to 100%
                                      var t5 = setStateDelayed('modbus.0.holdingRegisters.1.40348_StorCtl_Mod', 3,                                    delayStart + 400, false); // activate the above set limits
                                  
                                      // set timers to stop charging (delayEnd in ms from "now") */
                                      var t6 = setStateDelayed('modbus.0.holdingRegisters.1.40348_StorCtl_Mod', 0,                           delayEnd, false); // deactivate above set limits
                                      var t7 = setStateDelayed('modbus.0.holdingRegisters.1.40355_OutWRte',     100/chargeRateScalingFactor, delayEnd + 100, false); // set max discharge rate to 100%
                                      var t8 = setStateDelayed('modbus.0.holdingRegisters.1.40356_InWRte',      100/chargeRateScalingFactor, delayEnd + 200, false); // set max charge rate to 100%
                                  }
                                  

                                  Die Timervariablen t1 bis t8 hatte ich nur für Debugzwecke verwendet, kann man getrost weglassen.

                                  Vielleicht ist das ja hilfreich.

                                  • zloe
                                  Z 1 Antwort Letzte Antwort
                                  1
                                  • Z zloe

                                    Hi @wolfgang-gary ,
                                    ich habe mit eine JS Funktion geschrieben um die erzwungene Ladung zeitlich zu steuern.
                                    Mein ANwendungsfall ist, dass ich um ca. 17h die awattar Preise prüfe und dann berechne ob und wann es sich auszahlt in der Nacht die Batterie übers Netz zu laden.
                                    Ich berechne dazu sowohl die Dauer der Ladung als auch die minimale Laderate die ich brauche um die Batterie in der Zeit auf gewünschten Ladestand zu bekommen.

                                    Die Funktion ist aber universeller einsetzbar. Man übergibt einfach die notwendigen Werte (siehe Kommentare im Code):

                                    function setRechargeTimers(delayStart, delayEnd, scaledRechargeSoC, rechargeRate, chargeRateScalingFactor) {
                                        // set timers to start the charging (delayStart in ms from "now") */
                                        var t1 = setStateDelayed('modbus.0.holdingRegisters.1.40360_ChaGriSet',   1,                                    delayStart, false); // allow charging from grid
                                        var t2 = setStateDelayed('modbus.0.holdingRegisters.1.40350_MinRsvPct',   scaledRechargeSoC,                    delayStart + 100, false); // set target SoC
                                        var t3 = setStateDelayed('modbus.0.holdingRegisters.1.40355_OutWRte',    -rechargeRate/chargeRateScalingFactor, delayStart + 200, false); // set charge rate
                                        var t4 = setStateDelayed('modbus.0.holdingRegisters.1.40356_InWRte',      100/chargeRateScalingFactor,          delayStart + 300, false); // set max charge rate to 100%
                                        var t5 = setStateDelayed('modbus.0.holdingRegisters.1.40348_StorCtl_Mod', 3,                                    delayStart + 400, false); // activate the above set limits
                                    
                                        // set timers to stop charging (delayEnd in ms from "now") */
                                        var t6 = setStateDelayed('modbus.0.holdingRegisters.1.40348_StorCtl_Mod', 0,                           delayEnd, false); // deactivate above set limits
                                        var t7 = setStateDelayed('modbus.0.holdingRegisters.1.40355_OutWRte',     100/chargeRateScalingFactor, delayEnd + 100, false); // set max discharge rate to 100%
                                        var t8 = setStateDelayed('modbus.0.holdingRegisters.1.40356_InWRte',      100/chargeRateScalingFactor, delayEnd + 200, false); // set max charge rate to 100%
                                    }
                                    

                                    Die Timervariablen t1 bis t8 hatte ich nur für Debugzwecke verwendet, kann man getrost weglassen.

                                    Vielleicht ist das ja hilfreich.

                                    • zloe
                                    Z Offline
                                    Z Offline
                                    zloe
                                    schrieb am zuletzt editiert von
                                    #21

                                    Ich hätte noch eine Frage, ...
                                    hat es jemand schon "geschafft" über modbus das MAXIMALE Ladelimit der Batterie zu setzen?

                                    1 Antwort Letzte Antwort
                                    0
                                    • Bjoern77B Offline
                                      Bjoern77B Offline
                                      Bjoern77
                                      schrieb am zuletzt editiert von
                                      #22

                                      Moin
                                      Ich stehe noch immer auf dem Schlauch.
                                      Ich habe einen Symo mit BYD.
                                      Mein Ziel ist das Ändern der unteren Ladeschwelle der Batterie.
                                      Ich möchte gerne dynamisch die untere Schwelle hochnehmen, damit ich im Winter auch mal die 100% Ladung erreiche.
                                      Ich möchte also diesen Wert ändern:
                                      5.jpg

                                      Ich habe den Modbus Adapter soweit am Laufen.
                                      Diese Einstellungen im WR:
                                      1.jpg

                                      Und hier im Adapter:
                                      2.jpg

                                      Dann versuche ich diese Register zu lesen:
                                      3.jpg

                                      Bei dem Hersteller und der Softwareversion klappt es auch. Nur bei meinem Zielwert minsoc nicht:

                                      4.jpg

                                      Wenn ich den Wert auf Write setze, wird der Wert rot, wenn ich ihn überschreibe. Klappt also nicht 😞
                                      Hat jemand eine Idee, wo ich hänge?
                                      Vielen Dank und Gruß
                                      Björn

                                      nkleberN 1 Antwort Letzte Antwort
                                      0
                                      • Bjoern77B Bjoern77

                                        Moin
                                        Ich stehe noch immer auf dem Schlauch.
                                        Ich habe einen Symo mit BYD.
                                        Mein Ziel ist das Ändern der unteren Ladeschwelle der Batterie.
                                        Ich möchte gerne dynamisch die untere Schwelle hochnehmen, damit ich im Winter auch mal die 100% Ladung erreiche.
                                        Ich möchte also diesen Wert ändern:
                                        5.jpg

                                        Ich habe den Modbus Adapter soweit am Laufen.
                                        Diese Einstellungen im WR:
                                        1.jpg

                                        Und hier im Adapter:
                                        2.jpg

                                        Dann versuche ich diese Register zu lesen:
                                        3.jpg

                                        Bei dem Hersteller und der Softwareversion klappt es auch. Nur bei meinem Zielwert minsoc nicht:

                                        4.jpg

                                        Wenn ich den Wert auf Write setze, wird der Wert rot, wenn ich ihn überschreibe. Klappt also nicht 😞
                                        Hat jemand eine Idee, wo ich hänge?
                                        Vielen Dank und Gruß
                                        Björn

                                        nkleberN Offline
                                        nkleberN Offline
                                        nkleber
                                        schrieb am zuletzt editiert von
                                        #23

                                        Hallo @bjoern77 Dazu gibt es schon irgendwo ein Post. Die Daten welche per Modbus geschrieben werden sind andere wie jene die im UI als Minimales Ladelimit angegeben werden. Daher siehst du die geänderten Daten nicht im UI. Wenn ich das noch richtig im Kopf habe kannst du per Modbus nicht unter den Wert im UI gehen, aber höher kannst du. Dass der Wert zum schreiben zunächst rot wird ist normal. Beim nächsten Schreibzyklus wird der Wert dann geschrieben und beim übernächsten Lesezyklus gelesen. Sobald er dann wieder gelesen wurde wird der Wert dann Grün bzw. Grau

                                        Bjoern77B 1 Antwort Letzte Antwort
                                        0
                                        • nkleberN nkleber

                                          Hallo @bjoern77 Dazu gibt es schon irgendwo ein Post. Die Daten welche per Modbus geschrieben werden sind andere wie jene die im UI als Minimales Ladelimit angegeben werden. Daher siehst du die geänderten Daten nicht im UI. Wenn ich das noch richtig im Kopf habe kannst du per Modbus nicht unter den Wert im UI gehen, aber höher kannst du. Dass der Wert zum schreiben zunächst rot wird ist normal. Beim nächsten Schreibzyklus wird der Wert dann geschrieben und beim übernächsten Lesezyklus gelesen. Sobald er dann wieder gelesen wurde wird der Wert dann Grün bzw. Grau

                                          Bjoern77B Offline
                                          Bjoern77B Offline
                                          Bjoern77
                                          schrieb am zuletzt editiert von
                                          #24

                                          @nkleber Moin. Danke fürs helfen. Leider funktioniert scheinbar das Lesen von diesem Register nicht. Ich bekomme 11, aber im UI habe ich 10 eingetragen.
                                          Wenn ich im UI keine Änderung sehe, wie kann ich dann feststellen ob es funktioniert.
                                          Danke und Gruss
                                          Björn

                                          nkleberN 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

                                          338

                                          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
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe