Skip to content

fix hybrid consideration in min bat soc-mode - #3764

Merged
LKuemmel merged 6 commits into
openWB:masterfrom
LKuemmel:fix_max_ac_out
Aug 5, 2026
Merged

LKuemmel merged 6 commits into
openWB:masterfrom
LKuemmel:fix_max_ac_out

Conversation

@LKuemmel

@LKuemmel LKuemmel commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

fixes #3604

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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_discharge mehr, 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.

Comment thread packages/control/bat_all.py Resolved
Comment thread packages/control/bat_all.py Outdated
Comment on lines +387 to +396
# 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())
Comment thread packages/control/bat_all_test.py Resolved
LKuemmel and others added 2 commits August 5, 2026 09:18
Co-authored-by: Copilot Autofix powered by AI <[email protected]>
@LKuemmel
LKuemmel requested a review from ndrsnhs August 5, 2026 07:24

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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_hysteresis richtet ein Hybrid-Szenario ein, mockt aber weiterhin get_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_element gemockt, aber der Produktionscode nutzt die Methode nicht mehr (die Hybrid-Erkennung läuft jetzt über get_hybrid_bat_ids() / get_hybrid_inverter_ids() / get_non_hybrid_bat_ids()). Dadurch hängt der Test implizit von der globalen counter_all_data-Hierarchie aus data_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)

@LKuemmel
LKuemmel merged commit 947925e into openWB:master Aug 5, 2026
1 check passed
@LKuemmel
LKuemmel deleted the fix_max_ac_out branch August 5, 2026 13:02
ndrsnhs pushed a commit to ndrsnhs/core that referenced this pull request Aug 24, 2026
* 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]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Hybrid leistungsbeachtung bei der passiven Speichersteuerung

2 participants