evcc icon indicating copy to clipboard operation
evcc copied to clipboard

Switch to 15m slots for tariffs and planner

Open Maschga opened this issue 7 months ago • 3 comments

Purpose of this PR is to change default 1h slots to 15m slots. This affects:

  • tariffs (cost, co2, solar, both coded and templates)
  • planner
  • ui

We should do this in a way that all internal data structures use 15m slots. For this purpose, tariff data must be converted to 15m slots when received.

We should still supported 1h or 30m tariffs and templates, but provide an option to convert after receive. The output of evcc tariff might potentially be simplified to still show 1h slots where applicable (nice to have).

When we support 1h or 30m inputs, we'll need specific logic for converting them into 15m slots depending on tariff type:

  • prices: constant price over all sub-slots
  • solar: interpolated power at start of sub-slot
  • co2: interpolated co2 load (clarify howto)

Planner depends on tariffs and must be changed in the same step since planner assumes 1h slots.

/cc @naltatis can we please align on co2

Maschga avatar May 10 '25 13:05 Maschga

can we please align on co2

I'd say the value is always gCO2e/kWh. So splitting up 1h our datasource would result in slots with the same value as the source. Same thing for price ($CURRENCY/kWh).

naltatis avatar May 22 '25 14:05 naltatis

grafik grafik grafik

Maschga avatar May 23 '25 10:05 Maschga

Wie besprochen schaue ich mir die Visualisierung des Ladeplans an.

naltatis avatar May 29 '25 13:05 naltatis

Lag lange auf Eis, aber das Thema wird ab 1. Oktober wieder relevant.

naltatis avatar Sep 29 '25 13:09 naltatis

@Maschga hast du hier noch offene Todos? Ich hab den Konflikt gerade aufgelöst und den Branch auf Stand gebracht. Magst du dir die Fehler mal anschauen?

naltatis avatar Sep 29 '25 13:09 naltatis

aber das Thema wird ab 1. Oktober wieder relevant.

Schaffen wir das noch? 😅

hast du hier noch offene Todos?

An sich funktioniert die Umwandlung von >15 min Tariffen zu 15min Tariffen. Ich muss aber noch länger über Edge Cases nachdenken und wie sich der Algorithmus, der für die Umwandlung zuständig ist, am Besten in die Go-Tariff-Architektur einbinden lässt. Also nichts, was sich auf die UI auswirkt.

UI-seitig muss man sich hier Gedanken machen, ob man den Planner auch zu Chart.js umschreiben möchte oder das für einen anderen PR beiseitelegt.

Außerdem stellt sich die Frage, ob man beispielsweise beim Preis-Chart (s. oben) die feinen Linien wirklich haben möchte. Ich denke mal, dass es auf kleinen Displays sehr schwierig ist, die richtige Linie zu treffen, zu der man Daten angezeigt bekommen möchte. Braucht es hier vielleicht eine andere Darstellung oder gibt es andere Tricks? Das gleiche für das Liniendiagramm (Solar). Die Abstände sind mit den 15 min Intervallen so klein geworden, dass es alle Charts sehr filigran macht.

Auch finde ich es störend, was man beim Chart sieht, wenn man 1h Intervalle auf 15min Intervalle konvertiert: Jeweils 4 Balken sind hintereinander gleich hoch. Sollte man hier vielleicht Backendseitig immer in 15 min Intervallen rechnen/denken und im UI einfach bei der alten Darstellung bleiben (also 1h Tariffe anzeigen) oder ist diese Darstellung trotzdem so gewollt?

Magst du dir die Fehler mal anschauen?

Ich mache mich mal dran. 👍

Maschga avatar Sep 29 '25 13:09 Maschga

Die Tests sind soweit gefixt, der Rest sollte auf die Umwandlung der Tariffe zurückzuführen sein. Die würde ich erst am Ende fixen.

Maschga avatar Sep 29 '25 14:09 Maschga

UI-seitig muss man sich hier Gedanken machen, ob man den Planner auch zu Chart.js umschreiben möchte oder das für einen anderen PR beiseitelegt.

Wollen wir, sollten wir aber in einem anderen PR machen. Hier ist bereits einiges an Vorarbeit dafür eingeflossen: https://github.com/evcc-io/evcc/pull/21839

naltatis avatar Sep 29 '25 15:09 naltatis

Schaffen wir das noch? 😅

Lieber in Ruhe und dafür richtig.

naltatis avatar Sep 29 '25 15:09 naltatis

Außerdem stellt sich die Frage, ob man beispielsweise beim Preis-Chart (s. oben) die feinen Linien wirklich haben möchte.

Schau ich mir an. Ggf. wechseln wir von Balken auf Step-Chart, da ist der Effekt nicht so stark. Order wir verkleinern/entfernen die Abstände. Ich probiert damit morgen mal etwas rum.

naltatis avatar Sep 29 '25 15:09 naltatis

Ich bin etwas verwirrt, was den Fokus dieses PRs angeht. Backend ist klar, das muss auf 15 min Tariffe umgestellt werden. Aber was muss im UI gemacht werden? Welche Vorarbeit ist bereits in #21839 geleistet worden?

Maschga avatar Sep 29 '25 17:09 Maschga

@naltatis ? Klar ist, dass der andere zuerst rein muss, todo bei mir.

andig avatar Sep 29 '25 17:09 andig

Sollte man hier vielleicht Backendseitig immer in 15 min Intervallen rechnen/denken und im UI einfach bei der alten Darstellung bleiben (also 1h Tariffe anzeigen) oder ist diese Darstellung trotzdem so gewollt?

From my (amateur) point of view - we should use 15 min intervals everywhere. If we calculate 15min intervals, but show 1h intervals - it can get very confusing..

RTTTC avatar Sep 29 '25 18:09 RTTTC

@Maschga das ist großartige Vorarbeit! Hast Du einen Überblick, was aus Deiner Sicht alles schon erledigt ist, bzw. was noch fehlen würde?

andig avatar Sep 30 '25 06:09 andig

Danke :-) Ich habe die TODOs oben noch ergänzt.

convert >= 15 min to 15 min

Die Umwandlung von >= 15 min zu 15 min Tariffen funktioniert schonmal.

convert < 15 min to 15 min (?)

Für Slots < 15 min funktioniert es soweit ich das sehe noch nicht korrekt. Da ist aber die Frage, ob wir das brauchen und wollen.

think about backend integration / data flow

Ich finde es auch nicht schön, dass in jeder Tariff-Datei api.ConvertTo15mSlots() hinzugefügt werden muss. Fällt dir hier vielleicht eine schönere Alternative ein?

Maschga avatar Sep 30 '25 08:09 Maschga

Eine Idee zum UI. Vielleicht kann man bei Auswählen eines Bereichs mit Maus, Finger diesen und die umgebenden Bereiche vergrößert darstellen? Keine Ahnung, ob die Lib das hergibt, aber solch eine Dynamik funktioniert da meist ganz gut. Ihr versteht, was ich meine?

foto-andreas avatar Sep 30 '25 10:09 foto-andreas

Nachtrag: gibt's in der Tibber-App ggf was ähnliches? Angeblich kann man ja die neue Ansicht mit dem neuen Widget umschalten. Die 15 Minuten-Darstellung gibt es bei mir in der App allerdings nicht. Falls das bei jemandem funktioniert, wäre da ggf. auch ein UI-Ansatz.

foto-andreas avatar Sep 30 '25 10:09 foto-andreas

Können wir bitte beim Thema bleiben ? Das ist die technische Umstellung. Sonst nix.

andig avatar Sep 30 '25 10:09 andig

@andig I can change the Stekker tariff to 15 minutes resolution, but will this be default? Or will there still be the possibility to use hourly values?

djfanatix avatar Sep 30 '25 11:09 djfanatix

@djfanatix @RTTTC all tariffs will be treated and shown as 15min interval (currently 1h). We will not introduce an option or 15min/1h mix in UI and API

Klar ist, dass der andere zuerst rein muss, todo bei mir.

The https://github.com/evcc-io/evcc/pull/21839 PR does a lot of changes to the forecast chart (chart.js). It introduces chart annotations which we can use to replace your custom planner and grid charging diagrams. Looking at the code, it's not a super-strict dependency, but I think merging #21839 before this one saves us a lot of merge trouble.

naltatis avatar Sep 30 '25 12:09 naltatis

Note: Energy charts template currently returns mixed slots (hours today, 15min from tomorrow on). I've updated the template here to avoid overlapping slots and strange behavior. We might want to issue a separate fix.

PR welcome.

naltatis avatar Sep 30 '25 14:09 naltatis

switch solar logic (and tariffs) from "power at timestamp" to "average power during period"

+1 for "average power during period". Would simplify ui types and chart rendering.

naltatis avatar Sep 30 '25 15:09 naltatis

@naltatis machen wir so. Im Solar Forecast sollte daraus aber wieder eine Linie werden. Und dafür ist zu interpolieren! Bleibt die Frage, ob im UI oder Backend?

andig avatar Sep 30 '25 15:09 andig

Bleibt die Frage, ob im UI oder Backend?

Am Besten im Backend. Wir können ja erst einmal mit ner linearen Interpolation starten (glaube hat @Maschga schon gebaut). Dann wird die Grafik im UI etwas kantig. Bessere Interpolation können wir dann immer noch später "nachrüsten".

naltatis avatar Sep 30 '25 15:09 naltatis

Updated layout for planner view

Bildschirmfoto 2025-09-30 um 20 04 15 Bildschirmfoto 2025-09-30 um 20 03 35

naltatis avatar Sep 30 '25 18:09 naltatis

Die Anforderungen mit "vorher https://github.com/evcc-io/evcc/pull/21839 mergen" kann ich zurücknehmen. Wir nehmen erstmal die "alten Charts" (siehe Screenshot oben) und bauen die dann später um.

naltatis avatar Sep 30 '25 18:09 naltatis

@andig Is the current approach (Tariff15mWrapper) to convert tariff rates to 15m ok for you? A drawback is that Default/Test passes, because tests do not rely on NewFromConfig(). However, it is a small but effective change.

Maschga avatar Oct 01 '25 08:10 Maschga

I still need to take a detailed look, hopefully this (long) weekend.

andig avatar Oct 01 '25 08:10 andig

No problem, take your time. 👍

Maschga avatar Oct 01 '25 08:10 Maschga

@Maschga Yesterday I ran in to problems when testing with an energy charts grid tariff. The converted 15min rates had overlapping timespans. Might have been because auf the special situation (1h + 15min slots mixed in their api response).

I did not debug deeper and created a demo tariff template for testing instead.

But maybe you can double-check that the 1h to 15min slot conversion does not produce overlapping slots.

naltatis avatar Oct 01 '25 10:10 naltatis