Skip to content

Fix tariff: fehlender Backoff bei erfolglosem Abruf beheben - #4095

Merged
LKuemmel merged 7 commits into
openWB:masterfrom
seaspotter:fix-tariff-retry-backoff
Oct 14, 2026
Merged

LKuemmel merged 7 commits into
openWB:masterfrom
seaspotter:fix-tariff-retry-backoff

Conversation

@seaspotter

Copy link
Copy Markdown
Collaborator

Behebt #3703: next_query_time wurde nur bei neuen Preisen weitergesetzt. Lieferte ein Anbieter (noch) keine neuen Preise - z.B. weil die Folgetagspreise noch nicht veröffentlicht sind, der normale Fall für mehrere Stunden am Tag - wurde jeden Regelzyklus (~10s) neu abgefragt. Betrifft alle Tarif-/Netzentgelt-Anbieter gleichermaßen.

Beim genaueren Hinsehen zwei weitere Bugs in derselben Datei gefunden und mitgefixt:

  • Exceptions beim Abrufen wurden vom Context-Manager verschluckt, bevor der except-Block greifen konnte - der Fehlerpfad war seit einem Refactor komplett tot.
  • fault_state wurde am Ende jedes Durchlaufs durch ein unbedingtes no_error() überschrieben, auch wenn kurz zuvor ein Fehler/eine Warnung gesetzt wurde.

Backoff nach einem erfolglosen Abruf (egal ob keine neuen Preise oder Exception) ist jetzt einheitlich 5 Minuten. Und wenn 2 Stunden nach 14 Uhr keine Daten vorhanden sind, eine Warnung ausgegeben.

…penWB#3703)

next_query_time wurde bisher nur neu gesetzt, wenn ein Abruf tatsächlich
neuere Preise lieferte. Hatte ein Anbieter die Preise für den Folgetag noch
nicht veröffentlicht (der normale Fall für mehrere Stunden am Tag), blieb
next_query_time auf dem alten, bereits abgelaufenen Wert stehen - jeder
folgende Regelzyklus (alle ~10s) hat dadurch sofort erneut abgefragt statt
zu warten. Betrifft alle Tarif-Anbieter gleichermaßen, da sie dieselbe
ConfigurableFlexibleTariff/ConfigurableGridFee-Basis nutzen.

Zweiter, unabhängiger Bug beim Testen gefunden: SingleComponentUpdateContext
ohne reraise=True hat die Exception im Fehlerfall schon in __exit__
verschluckt, bevor der except-Block in update() next_query_time neu setzen
konnte - der Exception-Pfad war faktisch toter Code.

- next_query_time wird jetzt auch bei "keine neuen Preise" und bei einer
  Exception auf einen 20-Minuten-Backoff gesetzt statt unverändert zu bleiben
- reraise=True ergänzt, damit der except-Block tatsächlich erreicht wird
  (fault_state wurde unabhängig davon schon vorher korrekt aus der Exception
  gesetzt)
- echte Warnung, wenn 2h nach der ersten konfigurierten Update-Stunde immer
  noch keine Preise für den Folgetag vorliegen, statt weiterhin "Kein Fehler"
  anzuzeigen
- fault_state wurde nach einer gesetzten Warnung/Fehler im selben
  Durchlauf durch ein abschließendes no_error() sofort wieder
  überschrieben - jetzt einziger Ort (__finalize_update_status), der
  den Status setzt
- Exception im component_initializer (Konstruktor) wurde bisher
  stillschweigend verschluckt, _component_updater blieb dauerhaft
  ungesetzt, ohne jede Fehlermeldung
- Backoff nach Exception vereinheitlicht auf die ursprünglich
  vorgesehenen 5 Minuten (vorher totes "retry in 5 minutes", siehe
  Historie zu openWB#3703)
Comment thread packages/modules/common/configurable_tariff.py Outdated
seaspotter and others added 2 commits October 13, 2026 08:59
@benderl
benderl requested a balanced review from Copilot October 13, 2026 09:28
@benderl benderl added this to the 2.3.0 milestone Oct 13, 2026
@benderl benderl added the bug Something isn't working label Oct 13, 2026

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.

🟡 Changes recommended

Failed reconfiguration can retain the old provider, and the warning threshold is incorrect across DST transitions.

2 open findings
What changed in this PR

Adds consistent retry backoff and preserves tariff-provider fault states.

Changes:

  • Adds five-minute backoff for failed or unchanged responses.
  • Preserves errors and warns when next-day prices remain unavailable.
  • Adds regression tests for retry and fault-state behavior.
File Description
packages/​modules/​common/​configurable_tariff.py Implements backoff and status handling.
packages/​modules/​common/​configurable_tariff_test.py Tests the new behavior.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

self.fault_state.store_error()
with SingleComponentUpdateContext(self.fault_state):
# reraise=True, sonst bleibt _component_updater bei einer Exception dauerhaft ungesetzt
with SingleComponentUpdateContext(self.fault_state, reraise=True):
warning_hour = min(self.tariff_update_hours) + LATE_WARNING_OFFSET_HOURS
if now.hour < warning_hour:
return False
tomorrow_start = int(now.replace(hour=0, minute=0, second=0, microsecond=0).timestamp()) + 24*ONE_HOUR_SECONDS
@LKuemmel
LKuemmel merged commit 889a3d4 into openWB:master Oct 14, 2026
1 check passed
@seaspotter
seaspotter deleted the fix-tariff-retry-backoff branch October 14, 2026 07:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants