Skip to content

Ladeprotokoll: Energie und Kosten je Tarifzeitraum (Feste Tarifstunden) - #4117

Draft
buhito81 wants to merge 5 commits into
openWB:masterfrom
buhito81:feature_chargelog_tariff_split
Draft

buhito81 wants to merge 5 commits into
openWB:masterfrom
buhito81:feature_chargelog_tariff_split

Conversation

@buhito81

@buhito81 buhito81 commented Oct 14, 2026 •

Copy link
Copy Markdown

Umsetzung von #4111 (Entwurf, baut auf dem gemergten #4110 auf).
Oberfläche: openWB/openwb-ui-settings#1129

Was

Für „Feste Tarifstunden“ zeigt das Ladeprotokoll zusätzlich, wie viel Energie in welchem Tarifzeitraum geladen wurde (Zähler des Ladepunkts) und was sie gekostet hat, z. B. „NT: 18,40 kWh / 4,73 € · Standardpreis: 3,10 kWh / 0,88 €“. Die Aufteilung hat höchstens so viele Einträge wie Zeitfenster konfiguriert sind, unabhängig von der Ladedauer. Rein additiv und opt-in (Spalte standardmäßig ausgeblendet).

  1. fixed_hours: _find_tariff_for_time_slot() enthält die bisherige Zuordnung aus _fetch_price_for_time_slot(); Preis (_fetch_price_for_time_slot) und Name (get_tariff_name_for_time_slot(config, time_slot, default_name=None)) nutzen dieselbe Funktion und können nicht auseinanderlaufen. weekdays/dates werden per .get() gelesen (upgrade_datastore_133 hat weekdays neben statt in active_times angelegt).
  2. Optional.ep_get_current_tariff_name(): Name für denselben Zeitslot, dessen Preis ep_get_current_price() liefert (erster Eintrag von ep/get/prices, nicht now()). Nur wenn alle konfigurierten Preismodule fixed_hours sind, sonst None. Gilt der Standardpreis, heißt der Eintrag „Standardpreis“; sind Tarif und Netzentgelt beide feste Tarifstunden, werden die Namen verbunden („NT / Modul 3 NT“).
  3. Tageslog: prices.tariff_name neben grid, nur wenn es einen Tarifzeitraum gibt. Ohne Feste Tarifstunden (dynamische Tarife, kein Preismodul, Rückfallpfad) bleibt der Eintrag unverändert.
  4. Ladelog: Log.tariff_split sammelt im selben Schritt wie _calc_costs je 5-Minuten-Intervall die gesamte geladene Energie des Intervalls (über alle Quellen, also die Zählerdifferenz des Ladepunkts) und genau die Kosten, die _calc_costs für das Intervall berechnet; er wird mit dem Log zurückgesetzt (auch beim Zwischeneintrag nach Lademoduswechsel). Im Eintrag optional data.tariff_split = {Name: {"energy": Wh, "costs": €}}. Die Kosten je Tarifzeitraum ergeben in Summe data.costs (bis auf Rundung); data.costs bleibt die maßgebliche Summe, alte Einträge ohne den Schlüssel bleiben gültig.
  5. process_chargelog: totals.tariff_split, Einträge ohne Aufteilung werden übersprungen.
  6. charge_log_data_config.data_tariff_split (Standard False) + upgrade_datastore_155.
  7. web/settings/downloadChargeLog.php: je Tarifzeitraum zwei Spalten am Ende („Energie “, „Kosten “), nur wenn mindestens ein Eintrag eine Aufteilung hat. Ohne Feste Tarifstunden bleibt die CSV unverändert. Datei identisch mit public/downloadChargeLog.php im UI-PR.

Bewusst nicht enthalten

  • Dynamische Tarife (Tibber, aWATTar …), auch in Kombination mit festen Netzentgelten: kein Name, es bleibt bei der Summe.
  • Keine Quellen je Tarifzeitraum: PV- und Speicheranteile bleiben in der Energieaufteilung. Die Aufteilung zählt die gemessene Energie des Ladepunkts, nicht den geschätzten Netzanteil aus dem Strom-Mix.
  • Frage 3 aus Feature Request: Ladeprotokoll – Energie und Kosten je Tarifzeitraum (Feste Tarifstunden) #4111 (Preis des letzten angebrochenen Intervalls): unverändert, die Aufteilung übernimmt immer die Kosten aus _calc_costs.

Verhältnis zu #4110

#4110 ist gemergt, der Branch baut darauf auf. Die tariff_name-Zeilen stehen in process_log_entry_builder.create_entry, und das angebrochene letzte Intervall eines Ladevorgangs bekommt den Tarifzeitraum der aktuellen Messung. DATASTORE_VERSION 155 ist weiterhin frei.

Tests

PYTHONPATH=packages python -m pytest - neu: Zuordnung Name = Preis über eine Woche in Viertelstunden, Standardname, fehlende weekdays/dates (tariff_test.py); Name je Modulkombination und leere Preisliste (optional_test.py); Aufsummieren je Intervall (Energie aller Quellen, Kosten = _calc_costs), ohne Tarifname, Eintrag mit/ohne Schlüssel, Zurücksetzen, letztes angebrochenes Intervall mit dem Tarifzeitraum der aktuellen Messung (chargelog_test.py); Summen mit alten Einträgen (process_chargelog_test.py); tariff_name im Tageslog, kein Feld bei dynamischem Tarif und im Rückfallpfad (write_log_test.py); upgrade_datastore_155 (update_config_test.py). flake8 (max-line-length 120) sauber.

🤖 Generated with Claude Code

…den)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Netzanteil

Die Aufteilung je Tarifzeitraum enthält jetzt die gesamte geladene Energie des
Intervalls (über alle Quellen) und seine Kosten, wie sie in costs eingehen. Die
Kosten je Tarifzeitraum ergeben so in Summe data.costs. CSV-Spalten heißen
"Energie <Name>" / "Kosten <Name>".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@buhito81 buhito81 changed the title Ladeprotokoll: Netzbezug und Kosten je Tarifzeitraum (Feste Tarifstunden) Ladeprotokoll: Energie und Kosten je Tarifzeitraum (Feste Tarifstunden) Oct 15, 2026
Ohne Tarifzeitraum (dynamische Tarife, kein Preismodul, Rückfallpfad) bleibt
der Preis-Eintrag im Tageslog unverändert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
buhito81 and others added 2 commits October 20, 2026 11:55
Konflikt in packages/control/optional_test.py mit openWB#3782 (PV-Prognose):
beide Seiten ergänzen Importe und Tests, beide behalten.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
openWB#4110 hat create_entry nach process_log_entry_builder.py verschoben: die
tariff_name-Zeilen stehen jetzt dort, write_log.py übernimmt die master-Seite.
chargelog_test.py: beide Seiten behalten, dazu ein Test, dass das
angebrochene letzte Intervall den Tarifzeitraum der aktuellen Messung bekommt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

1 participant