Neuer Optimizer/Logik für mehrere Hybrid ESSes

Ja genau, PV-Leistung wird nur zum Entladen berücksichtigt, wenn sie >= 100W ist.

Ich wollte hiermit vermeiden, dass ein Wechselrichter am Morgen bzw. Abend permanent aktiv/inaktiv wird. Denn wenn ein WR PV-Leistung generiert, wird er bevorzugt verwendet, auch wenn er ggf. lt. Gewichtung nicht verwendet werden würde. Dies kann dazu führen, dass in einem Cycle (PV-Leistung vorhanden) Wechselrichter A genutzt wird und im nächste Cycle (keine PV-Leistung vorhanden) Wechselrichter B und im nächsten Cycle dann wieder Wechselrichter A usw. Durch die Grenze von 100W sollte dass denke ich ganz gut vermieden werden.

Wenn zudem für ein paar Minuten <100W Leistung generiert wird, ist es m.E. nicht nachteilig diese Leistung in die Batterie zu bringen anstatt sie direkt abzurufen. Die Effizienzwerte von Wechselrichtern sind bei <100W ohnehin nicht wirklich gut. Meine Annahme ist, dass sich die PV-Anlage nicht lange in dem Bereich <100W bewegen sollte, oder ist dass bei dir anders?

In anderen Implementierungen werden übrigen ebenfalls Leistungen <100W ignoriert.

Siehe z.B.

1 Like

Hi,

mir geht das Verhalten trotzdem nicht ganz ein:

Da war definitiv der Speicher noch nutzbar.

Grüße

Das ist mit einem Screenshot alleine nicht nachzuvollziehen. Der Optimizer macht ja selbst keine Lade-/Entladevorgaben, er verteilt nur die Vorgaben unter Berücksichtigung der gesetzten Constrains auf die Speichersysteme. Sollte er nicht auflösen können, müsste ein Fehler im Log protokolliert werden.

Um den Grund herauszufinden, wieso hier nicht entladen wurde, wäre folgendes interessant:

Welche Speichersysteme und Controller sind aktiv? Gibt es evtl. Controller für LimitTotalDischarge oder SOC-Reserve?

Welche Lade/-Entladevorgaben waren aktiv?

Welche Werte für AllowedDischarge hatten die Speichersysteme zu der Zeit? Also war eine Entladung vom BMS freigegeben?

Der angezeigte Wert ist zudem ein Mittelwert. Bei mir wird der eine Speicher bis 7% entladen, der andere bis 10%, ergibt 8,5% minSoc über beide Speichersysteme.

Hi,

siehe anbei:

  • Fenecon Home
  • AC-Speicher
  • GoodWe ess

Obwohl der FENECON noch etwas drin hätte entlädt er nicht..

Heute auch wieder ein sehr komisches Verhalten:

Ohne weitere Informationen zur Konfiguration des Systems und weiteren Detailinformationen ist es schwierig Rückschlüsse auf dieses Verhalten zu schließen.

Ein Beispiel: Ich hatte auch bereits ein Verhalten welches für mich auf den ersten Blick merkwürdig aussah, bei genauerer Analyse, hat sich herausgestellt dass es genau richtig war. In meinem Fall wirkte ein Power-Constraint auf einen der beiden ESS, der eine Beladung erzwungen hatte (durch den LimitTotalDischarge Controller). Dadurch wurde ein ESS geladen, obwohl eigentlich gerade entladen werden sollte. Der andere ESS wurde entsprechend entladen.

Dann habe ich z.B. einen gridOptimizedCharge Controller aktiv, der ab einem gewissen Zeitpunkt die maximale Beladung begrenzt.

Um hier eine Idee zum Verhalten zu bekommen kannst du in der solvePower-Methode die Variable debug mal auf true setzen und dann im Debug Log nach dem Output schauen. Dort sollte der vom System vorgegebene PowerSetPoint (also die gewünschte Lade- bzw. Entladeleistung über alle ESSs) geloggt werden sowie Details dazu, wie diese Lade-/Entladeleistung auf die einzelnen ESSs verteilt wird. Schau mal ob der PowerSetPoint bei deinem letzten Screenshot wie folgt geloggt wird:
[ACTIVE] PowerSetPoint: -300.0, Direction: CHARGE

In diesem Fall wäre das Verhalten des Optimizers richtig und die Vorgabe liegt einfach bei -300W. Dann muss man weiter vorne schauen, welche Constrains gibt es und welcher Controller sollte welchen PowerSetPoint vorgeben. Dazu mal das Debug der PowerKlasse einschalten und im Log von meinem Optimizer mal nach den min und max Werten eines jeden ESS schauen, dort werden die jeweils möglichen min und max Werte angzeigt:

[ACTIVE] ess0: PVProduction: 584.0, min: -1744.0, max: -606.0
[ACTIVE] ess1: PVProduction: 2266.0, min: 46.0, max: 1184.0

@Sn0w3y ich habe soeben ein neue Version hochgeladen, die Probleme bei den folgenden Situationen behebt:

  1. Wenn constraint coefficients fehlen (z.B. beim Start von OpenEMS)
  2. Bei KEEP_ZERO, d.h. wenn in Summe weder geladen noch entladen werden soll

Sollte es trotzdem noch zu Problemen kommen, gerne mir mal deine Systemkonfiguration und den Debug-Output aus dem DcOptimizer schicken.

1 Like

Werde es testen !! Danke !!


Leider macht das Verhalten immer noch keinen Sinn:

24.10.2025, 11:16:24INFOio.openems.edge.ess.core.power.Solver- Channel [SetActivePowerEquals]+ess3P EQUALS 5089

24.10.2025, 11:16:24INFOio.openems.edge.ess.core.power.SolverCurrently active EQUALS constraints

Mehr Debug kommt auch im “Debug Mode” nicht..

Er BElädt den Speicher, obwohl er eigentlich bei 5,1kW schon entladen sollte.

Setze bitte mal in der solvePower-Methode die Variable debug=true, dann sollte wesentlich mehr im Debug kommen. Daran erkennt man die Vorgabe (müsste DISCHARGE 5089 sein), die Grenzen der ESS (also min und max Grenzen der aktuell erlaubten Setpoints) und wie die Vorgabe auf die ESS verteilt wird.

Ich sehe gerade, dass die Variable beim Commit noch auf true stand. Wenn jetzt nichts im Debug kommt, ist entweder KEEP_ZERO aktiv oder der Optimizer gar nicht aktiv.

Bitte setze auch in der apply-Methode debug=true.

Wenn dann immer noch nichts kommt, bitte mal schauen ob der Optimizer auch ausgewählt ist. Falls ja mal neustarten und schauen was geloggt wird. Wechselt er ggf in einen Fallback-Optimizer, da die Vorgabe (aufgrund bestehender Constraints) nicht umsetzbar ist?

Was steht im DebugLog für den FeneconHome als „Allowed:“?

Nach dem Neustart weil ich alle 2 auf “true” gesetzt habe kommt der Fehler nicht mehr.. Muss nun wieder warten, wann der Fehler wieder auftritt.

Grüße !

Ich habe noch einen Fehler gefunden und behoben (siehe Commit von gerade eben).

Werde berichten! :slight_smile:

Danke für deine Arbeit!!

Hi,

leider besteht nun ein anderes Problem wieder:

– Logs begin at Mon 2025-10-27 17:36:25 CET, end at Mon 2025-10-27 17:58:46 CET. –
Oct 27 17:58:44 edge0 java[7137]: [REACTIVE] → remaining power required after pv production solved: 0.0
Oct 27 17:58:44 edge0 java[7137]: [REACTIVE] → remaining power required after ess already discharging solved: 0.0
Oct 27 17:58:44 edge0 java[7137]: [REACTIVE] Add Constraint for ess0: GREATER_OR_EQUALS 0.0
Oct 27 17:58:44 edge0 java[7137]: [REACTIVE] Add Constraint for ess1: GREATER_OR_EQUALS 0.0
Oct 27 17:58:44 edge0 java[7137]: [REACTIVE] Add Constraint for ess4: GREATER_OR_EQUALS 0.0
Oct 27 17:58:44 edge0 java[7137]: [REACTIVE] Solved Solution for ess0: EQUALS 0.0 (should be equal to added constraints!!)
Oct 27 17:58:44 edge0 java[7137]: [REACTIVE] Solved Solution for ess1: EQUALS 0.0 (should be equal to added constraints!!)
Oct 27 17:58:44 edge0 java[7137]: [REACTIVE] Solved Solution for ess4: EQUALS 0.0 (should be equal to added constraints!!)
Oct 27 17:58:44 edge0 java[7137]: Solution → ess0 ACTIVE 739.0 | 0.0
Oct 27 17:58:44 edge0 java[7137]: Solution → ess0 REACTIVE 0.0 | 0.0
Oct 27 17:58:44 edge0 java[7137]: Solution → ess1 ACTIVE 0.0 | 0.0
Oct 27 17:58:44 edge0 java[7137]: Solution → ess1 REACTIVE 0.0 | 0.0
Oct 27 17:58:44 edge0 java[7137]: Solution → ess4 ACTIVE 0.0 | 0.0
Oct 27 17:58:44 edge0 java[7137]: Solution → ess4 REACTIVE 0.0 | 0.0
Oct 27 17:58:44 edge0 java[7137]: 2025-10-27T17:58:44,876 [_cycle ] INFO [ebuglog.ControllerDebugLogImpl] [ctrlDebugLog0] _sum[State:Ok Ess SoC:13 %|L:-39 W Grid:732 W Production Total:0 W,AC:0 W,DC:0 W Consumption:693 W]
Oct 27 17:58:44 edge0 java[7137]: battery0[Running|SoC:16 %|Actual:369 V;0 A|Charge:392 V;40 A|Discharge:336 V;40 A|Health:GOOD|Towers:1]

Oct 27 17:58:45 edge0 java[7137]: [REACTIVE] Solved Solution for ess0: EQUALS 0.0 (should be equal to added constraints!!)
Oct 27 17:58:45 edge0 java[7137]: [REACTIVE] Solved Solution for ess1: EQUALS 0.0 (should be equal to added constraints!!)
Oct 27 17:58:45 edge0 java[7137]: [REACTIVE] Solved Solution for ess4: EQUALS 0.0 (should be equal to added constraints!!)
Oct 27 17:58:45 edge0 java[7137]: Solution → ess0 ACTIVE 745.0 | 0.0
Oct 27 17:58:45 edge0 java[7137]: Solution → ess0 REACTIVE 0.0 | 0.0
Oct 27 17:58:45 edge0 java[7137]: Solution → ess1 ACTIVE 0.0 | 0.0
Oct 27 17:58:45 edge0 java[7137]: Solution → ess1 REACTIVE 0.0 | 0.0
Oct 27 17:58:45 edge0 java[7137]: Solution → ess4 ACTIVE 0.0 | 0.0
Oct 27 17:58:45 edge0 java[7137]: Solution → ess4 REACTIVE 0.0 | 0.0
Oct 27 17:58:46 edge0 sudo[15504]: root : TTY=unknown ; PWD=/usr/lib/openems ; USER=root ; COMMAND=/usr/bin/journalctl -u openems -n 250
Oct 27 17:58:46 edge0 sudo[15504]: pam_unix(sudo:session): session opened for user root by (uid=0)

Also was ich sehe ist, dass der ess0 mit 739W entladen soll aber nicht entlädt. Kannst du nachvollziehen ob die 739W beim ess0 in der applyPower Methode ankommen und an den Speicher weitergegeben werden?

Was mir zudem nicht ganz klar ist, ob die REACTIVE Power genau wie die ACTIVE Power aufgelöst werden kann, sprich die Umsetzung für REACTIVE Power so passt. Bei meinen Speichersystemen wird mE ausschließlich mit der ACTIVE Power gearbeitet.

Dazu müsste ich “Debug-Logs” einbauen und das System neu starten - im GoodWe Ess. Leider ist der Fehler dann wieder weg.

Das kann ich allerdings leider nicht sagen..

Verstehe auch die Logik in der früh nicht wirklich :see_no_evil_monkey:

Macht für mich auch keinen Sinn. Führt der Fenecon evtl. eine Zwangsbeladung durch? Was sagt der DcOptimizer als Ergebnis und was zeigt er als min und max Wert für den Fenecon an?

Oder gibt es evtl ein ctrlLimitTotalDischarge der eine Zwangsbeladung durchführt oder im BlockDischarge (minSoc) State ist? Der Controller setzt seinen Target auf AC, d.h. wenn minSoc erreicht ist, wird der AC PowerSetPoint auf 0 gehalten. AC 0 bedeutet, dass jegliche PV (DC) Leistung in die Batterie geladen wird.

So sieht es bei mir aus (mit 2 HybridEss) und einen erweiterten ctrlLimitTotalDischarge Controller mit Target DC.

nein

Oct 29 08:08:31 sems200 java[2403]: [ACTIVE] ess1: PVProduction: 0.0, min: -3033.0, max: 1996.0 → ess1 EQUALS 0.0
Oct 29 08:08:31 sems200 java[2403]: [ACTIVE] Solved Solution for ess1: EQUALS 0.0 (should be equal to added constraints!!)
Oct 29 08:08:31 sems200 java[2403]: Solution → ess1 ACTIVE 0.0 | 0.0

Nein, den gibt es auch nicht. Ich habe einen ctrlEmergencyCapacityReserve auf dem ess1 und dem ess4 (die 2 DC Speicher) aber beim ess1 (Fenecon) ist dieser deaktiviert.

-- Logs begin at Wed 2025-10-29 08:00:15 CET, end at Wed 2025-10-29 08:12:11 CET. --
Oct 29 08:12:10 edge0 java[2403]: [REACTIVE]   -> remaining power required after ess already discharging solved: 0.0
Oct 29 08:12:10 edge0 java[2403]: [REACTIVE] Add Constraint for ess0: GREATER_OR_EQUALS 0.0
Oct 29 08:12:10 edge0 java[2403]: [REACTIVE] Add Constraint for ess4: GREATER_OR_EQUALS 0.0
Oct 29 08:12:10 edge0 java[2403]: [REACTIVE] Add Constraint for ess1: GREATER_OR_EQUALS 0.0
Oct 29 08:12:10 edge0 java[2403]: [REACTIVE] Solved Solution for ess0: EQUALS 0.0 (should be equal to added constraints!!)
Oct 29 08:12:10 edge0 java[2403]: [REACTIVE] Solved Solution for ess4: EQUALS 0.0 (should be equal to added constraints!!)
Oct 29 08:12:10 edge0 java[2403]: [REACTIVE] Solved Solution for ess1: EQUALS 0.0 (should be equal to added constraints!!)
Oct 29 08:12:10 edge0 java[2403]: Solution -> ess0 ACTIVE -68.0 | 689.0
Oct 29 08:12:10 edge0 java[2403]: Solution -> ess0 REACTIVE 0.0 | 0.0
Oct 29 08:12:10 edge0 java[2403]: Solution -> ess4 ACTIVE 689.0 | 0.0
Oct 29 08:12:10 edge0 java[2403]: Solution -> ess4 REACTIVE 0.0 | 0.0
Oct 29 08:12:10 edge0 java[2403]: Solution -> ess1 ACTIVE 0.0 | 0.0
Oct 29 08:12:10 edge0 java[2403]: Solution -> ess1 REACTIVE 0.0 | 0.0
Oct 29 08:12:10 edge0 java[2403]: 2025-10-29T08:12:10,874 [_cycle  ] INFO  [ebuglog.ControllerDebugLogImpl] [ctrlDebugLog0] _sum[State:Ok Ess SoC:5 %|L:-131 W Grid:731 W Production Total:431 W,AC:68 W,DC:363 W Consumption:668 W]
Oct 29 08:12:10 edge0 java[2403]: battery0[Running|SoC:1 %|Actual:360 V;0 A|Charge:392 V;40 A|Discharge:336 V;28 A|Health:GOOD|Towers:1]
Oct 29 08:12:10 edge0 java[2403]: batteryInverter0[AllowedAC:-8738;9262 W]
Oct 29 08:12:10 edge0 java[2403]: charger0[L:62 W]
Oct 29 08:12:10 edge0 java[2403]: charger1[L:39 W]
Oct 29 08:12:10 edge0 java[2403]: charger2[L:180 W]
Oct 29 08:12:10 edge0 java[2403]: charger3[L:82 W]
Oct 29 08:12:10 edge0 java[2403]: ctrlEvseSingle0[Mode:Surplus|Undefined]
Oct 29 08:12:10 edge0 java[2403]: ctrlIoTimebased0[Scheduled | Upcoming Tasks: [17:00: ON] [07:00: OFF] | State: OFF]
Oct 29 08:12:10 edge0 java[2403]: ess0[SoC:10 %|L:-60 W|On-Grid|Allowed:-9600;9221 W]
Oct 29 08:12:10 edge0 java[2403]: ess1[Started|SoC:1 %|L:-44 W|Battery:-306 W|PV:262|Allowed:-10000;9839]
Oct 29 08:12:10 edge0 java[2403]: ess4[SoC:2 %|L:-27 W|-3680 W|3680 W]
Oct 29 08:12:10 edge0 java[2403]: evseChargePoint0[L:0 W|SetCurrent:UNDEFINED|SetEnable:-1:Undefined]
Oct 29 08:12:10 edge0 java[2403]: io1[1- 2- 3- 4- 5- 6- 7- 8-]
Oct 29 08:12:10 edge0 java[2403]: io3[IO Read[xxxx]Write[----]]
Oct 29 08:12:10 edge0 java[2403]: io4[x|36 W]
Oct 29 08:12:10 edge0 java[2403]: io6[19 W]
Oct 29 08:12:10 edge0 java[2403]: io7[19 W]
Oct 29 08:12:10 edge0 java[2403]: io9[-|0 W]
Oct 29 08:12:10 edge0 java[2403]: io10[15 W]
Oct 29 08:12:10 edge0 java[2403]: io11[1- 2- 3- 4-]
Oct 29 08:12:10 edge0 java[2403]: io12[-|0 W]
Oct 29 08:12:10 edge0 java[2403]: io13[-]
Oct 29 08:12:10 edge0 java[2403]: io14[-]
Oct 29 08:12:10 edge0 java[2403]: io15[15 W]
Oct 29 08:12:10 edge0 java[2403]: meter0[L:731 W]
Oct 29 08:12:10 edge0 java[2403]: meter2[L:34 W]
Oct 29 08:12:10 edge0 java[2403]: temp1[43.7°C | 35.9°C | 8.8°C]
Oct 29 08:12:10 edge0 java[2403]: DISCHARGE
Oct 29 08:12:10 edge0 java[2403]: ess0: ess0 10
Oct 29 08:12:10 edge0 java[2403]: ess4: ess4 2
Oct 29 08:12:10 edge0 java[2403]: ess1: ess1 1
...
Oct 29 08:12:11 edge0 sudo[22338]:     root : TTY=unknown ; PWD=/usr/lib/openems ; USER=root ; COMMAND=/usr/bin/journalctl -u openems -n 250
Oct 29 08:12:11 edge0 sudo[22338]: pam_unix(sudo:session): session opened for user root by (uid=0)