Repository navigation
fix hybrid consideration in min bat soc-mode - #3764
Conversation
There was a problem hiding this comment.
Pull request overview
This PR addresses incorrect hybrid-inverter consideration when applying min/max-SoC battery rules in PV surplus charging, aiming to prevent unintended grid import and restore correct battery/EV power balancing (fixes #3604).
Changes:
- Replaces the previous hybrid discharge limiting approach with
_absolute_bat_discharge_power()and integrates the resulting cap directly into the min/max-SoC discharge allowance calculation. - Renames and adjusts the “charging power left” calculation method to compute a power difference (
get_charging_power_left_diff) and updates call sites accordingly. - Updates and extends unit tests to cover hybrid discharge limiting behavior and the new helper.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| packages/control/bat_all.py | Refactors hybrid discharge limiting and updates min/max-SoC “charging power left” calculation to account for inverter max AC output. |
| packages/control/bat_all_test.py | Updates tests for the refactor, adds hybrid-focused coverage, and adapts mocks to the new helper method. |
Suppressed comments (2)
packages/control/bat_all.py:433
- Auch hier wird
_absolute_bat_discharge_power()mehrfach aufgerufen, obwohl sich das Ergebnis innerhalb des Blocks nicht ändern sollte. Einmal berechnen und wiederverwenden (siehe аналогes Muster im vorherigen Zweig).
# max Entladeleistung auf max Ausgangsleistung des WR begrenzen
required_absolut_discharge_power = min(
config.bat_power_discharge, self._absolute_bat_discharge_power())
# Differenz zwischen erlaubter Entladeleistung und aktueller Speicherleistung bestimmen.
# Wenn der Speicher lädt, darf die freigegebene Entladeleistung nicht die max
# Ausgangsleistung des WR überschreiten.
# Wenn der Speicher mit mehr als der erlaubten Entladeleistung entladen wird, muss das
# vom Überschuss subtrahiert werden.
charging_power_left = min(required_absolut_discharge_power +
base_power, self._absolute_bat_discharge_power())
packages/control/bat_all_test.py:220
- Die Kommentare sind veraltet/inkorrekt: es gibt keine
_limit_bat_power_dischargemehr, und die Erläuterung zu "Begrenzung (300W) + base_power (400W)" passt nicht zur aktuellen Setup-/Rechenlogik. Bitte Kommentar anpassen, damit die Intention des Tests klar bleibt.
# Hybrid-Setup fuer reale Berechnung in _limit_bat_power_discharge
data.data.pv_data = {"pv2": Pv(2)}
data.data.pv_data["pv2"].data.get.power = -7500
data.data.pv_data["pv2"].data.config.max_ac_out = 10000
data.data.bat_data["bat1"] = Bat(1)
data.data.bat_data["bat1"].data.get.power = -2500
mock_entry_children = Mock(return_value={
"id": 2,
"type": "pv",
"children": [{"id": 1, "type": "bat", "children": []}],
})
monkeypatch.setattr(data.data.counter_all_data, "get_entry_of_element", mock_entry_children)
# execution
b_all.get_charging_power_left_diff()
# evaluation: reale Begrenzung (300W) + base_power (400W)
assert b_all.data.set.charging_power_left == 0
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| # max Entladeleistung auf max Ausgangsleistung des WR begrenzen | ||
| required_absolut_discharge_power = min( | ||
| config.bat_power_discharge, self._absolute_bat_discharge_power()) | ||
| # Differenz zwischen erlaubter Entladeleistung und aktueller Speicherleistung bestimmen. | ||
| # Wenn der Speicher lädt, darf die freigegebene Entladeleistung nicht die max | ||
| # Ausgangsleistung des WR überschreiten. | ||
| # Wenn der Speicher mit mehr als der erlaubten Entladeleistung entladen wird, muss das | ||
| # vom Überschuss subtrahiert werden. | ||
| charging_power_left = config.bat_power_discharge + base_power | ||
| charging_power_left = min(required_absolut_discharge_power + | ||
| base_power, self._absolute_bat_discharge_power()) |
Co-authored-by: Copilot Autofix powered by AI <[email protected]>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.
Suppressed comments (2)
packages/control/bat_all_test.py:219
test_get_charging_power_left_uses_limited_bat_discharge_in_hysteresisrichtet ein Hybrid-Szenario ein, mockt aber weiterhinget_entry_of_element()– diese Methode wird im neuen Codepfad nicht mehr verwendet. Dadurch wird_absolute_bat_discharge_power()hier nicht deterministisch in Richtung „Hybrid“ gesteuert und der Test kann fehlschlagen oder nicht das beabsichtigte Limit-Verhalten prüfen.
Mocke stattdessen die neuen Hierarchie-Helper (get_hybrid_bat_ids()/get_hybrid_inverter_ids()/get_non_hybrid_bat_ids()), damit _absolute_bat_discharge_power() die PV-Daten von pv2 sicher einbezieht.
# Hybrid-Setup fuer reale Berechnung in _limit_bat_power_discharge
data.data.pv_data = {"pv2": Pv(2)}
data.data.pv_data["pv2"].data.get.power = -7500
data.data.pv_data["pv2"].data.config.max_ac_out = 10000
data.data.bat_data["bat1"] = Bat(1)
data.data.bat_data["bat1"].data.get.power = -2500
mock_entry_children = Mock(return_value={
"id": 2,
"type": "pv",
"children": [{"id": 1, "type": "bat", "children": []}],
})
monkeypatch.setattr(data.data.counter_all_data, "get_entry_of_element", mock_entry_children)
packages/control/bat_all_test.py:53
- In diesem Test wird
data.data.counter_all_data.get_entry_of_elementgemockt, aber der Produktionscode nutzt die Methode nicht mehr (die Hybrid-Erkennung läuft jetzt überget_hybrid_bat_ids()/get_hybrid_inverter_ids()/get_non_hybrid_bat_ids()). Dadurch hängt der Test implizit von der globalencounter_all_data-Hierarchie ausdata_init()ab und kann flakey oder wirkungslos werden.
Besser ist es, die tatsächlich verwendeten Methoden explizit zu mocken, damit das Szenario „Hybrid-WR mit Bat“ reproduzierbar ist.
This issue also appears on line 207 of the same file.
mock_entry_children = Mock(return_value={"id": 5, "type": "pv", "children": [
{"id": 1, "type": "bat", "children": []}]})
monkeypatch.setattr(data.data.counter_all_data, "get_entry_of_element", mock_entry_children)
* fix hybrid consideration in min bat soc-mode * Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <[email protected]> * review * Review * fix pytest * clean up --------- Co-authored-by: Copilot Autofix powered by AI <[email protected]>
fixes #3604