Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add charge planner #5445

Merged
merged 2 commits into from
Dec 23, 2022
Merged

Add charge planner #5445

merged 2 commits into from
Dec 23, 2022

Conversation

andig
Copy link
Member

@andig andig commented Dec 11, 2022

Fix #5337. This work builds on #2211 by @schenlap. It provides the following features:

  • add a planner that will select the best/cheapest periods for achieving the target charging goal
  • remove the cheap price setting- it's no longer needed
  • soc/Timer is removed and replaced by the (much simpler) planner
  • remove usage of VehicleFinishTimer- we'll always rely on the estimator now (simplified RemainingChargeDuration)

The planner is essentially a cost optimiser. It's task is to chose a lowest-cost plan of suitable charging slots from a list of slots (typically from a variable tariff), each with its own cost. Constraints are:

  • without a tariff or with fixed tariff, planner should act like target charging (start charging as late as possible to meet deadline)
  • with flexible tariff, charging should start as early as possible to consume as much of the lower-cost slots as possible

TODO:

  • fix tests
  • fix existing soc planner
  • gracefully handle removal cheap config option
  • integration with target charging per energy amount instead of soc
  • make empty grid tariff behave like fixed tariff (=„normal“ Zielladen)
  • handle missing grid tariff by adding a "pseudo" tariff (add a fixed tariff with price 0)
  • decide handling missing future data (i.e. "after plan ends"), for example for fixed tariff which only reports 1 hour
  • fix delaying most expensive slot
  • clear target charging when session ends (Add charge planner #5445 (comment))
  • don't deactivate after end of plan when charge goal not achieved

Bonus features:

  • find a good place for caching planner result
  • separate planning and evaluating plan
  • visualise plan (UX)
  • re-add vehicle FinishTime api
  • improve use of GetMaxPower() for complex vehicle config (Add charge planner #5445 (comment))

@andig andig added the enhancement New feature or request label Dec 11, 2022
@andig andig mentioned this pull request Dec 11, 2022
4 tasks
@andig
Copy link
Member Author

andig commented Dec 11, 2022

@schenlap Du könntest mal einen ersten Test wagen, sowohl für einfaches Zielladen mit festem Tarif wie auch mit variablem Tarif.

@RTTTC
Copy link
Contributor

RTTTC commented Dec 12, 2022

This is very nice!
It would not work for countries with no tibber though.

@andig
Copy link
Member Author

andig commented Dec 12, 2022

It would not work for countries with no tibber though.

The planner can work on any "tariff/rates". It does not care if the price is really an energy tariff or rather a CO2 footprint. We can add more data sources as we go.

@RTTTC

This comment was marked as off-topic.

@andig

This comment was marked as off-topic.

@RTTTC

This comment was marked as off-topic.

@schenlap
Copy link
Contributor

schenlap commented Dec 12, 2022

Test läuft. Das ist jetzt mal der einfachste Fall, Auto ist noch recht voll.

[lp-1  ] DEBUG 2022/12/12 19:02:52 charge duration: 1h19m0s, end: 2022-12-13 04:00:00 +0000 UTC, find best prices:
[lp-1  ] TRACE 2022/12/12 19:02:52   slot from: 2022-12-12 23:00:00 +0100 CET to 2022-12-13 00:00:00 +0100 CET price 0.267180, time sum 1h0m0s
[lp-1  ] TRACE 2022/12/12 19:02:52   slot from: 2022-12-13 03:00:00 +0100 CET to 2022-12-13 04:00:00 +0100 CET price 0.270970, time sum 2h0m0s

-> hat geladen wie geplant. Ladevorgang war im ersten Slot schon fertig.

@andig

This comment was marked as off-topic.

@andig
Copy link
Member Author

andig commented Dec 12, 2022

Auto ist noch recht voll.

bin gespannt ob das klappt. Zum einen generell, zum Anderen weil die Ladekurve bei vollem Auto ja schlechter wird.

Bei deinem Plan oben wärs noch nett, wenn er die angebrochene Stunde auch nur halb zeigen würde?

@andig andig changed the title Add dynamic pricing planner Add charge planner Dec 12, 2022
@RTTTC

This comment was marked as off-topic.

@schenlap
Copy link
Contributor

Mir ist gerade aufgefallen dass nach dem Laden / Abstecken des Fahrzeugs und wieder anstecken der Timer im UI immer noch angezeigt wurde (in diese, Fall heute, 5AM also ~12h in der Vergangenheit). Ich weiß jetzt nicht ob das immer schon so war. Auch ein Reload der Seite hat nichts geändert. Meine Erwartung wäre dass nach dem Laden (oder zumindest dem abstecken) der Timer gelöscht wurde. Im Log habe ich keinen Hinweis gefunden dass der Timer noch aktiv wäre.

@schenlap

This comment was marked as resolved.

@schenlap
Copy link
Contributor

schenlap commented Dec 13, 2022

Jetzt nach 18:00 ist die reduced duration sogar negativ, da hat es noch was.

@andig
Es liegt an d57134e
Ist reproduzierbar.

@andig
Copy link
Member Author

andig commented Dec 13, 2022

@schenlap könntest Du das weiter analysieren? Was ist falsch daran auch die Daten von "tomorrow" mit einzubeziehen?

@andig
Copy link
Member Author

andig commented Dec 13, 2022

Meine Erwartung wäre dass nach dem Laden (oder zumindest dem abstecken) der Timer gelöscht wurde.

@schenlap wann genau sollten wir das tun:

  • beim ersten Ladestop (beliebiger Grund)
  • bei Erreichen der Ladegrenze (soc/energy)
  • beim Abstecken (klar!)
  • ...noch aus anderen Gründen? Welchen?

@schenlap
Copy link
Contributor

schenlap commented Dec 14, 2022

@schenlap könntest Du das weiter analysieren? Was ist falsch daran auch die Daten von "tomorrow" mit einzubeziehen?

Ja mache ich. Wenn es funktioniert ist daran nichts falsch. Jetzt scheint es noch wo einen Bug zu geben.

@schenlap
Copy link
Contributor

Ladung hat heute auch funktioniert, es wurde allerdings öfters ein/ausgeschaltet als gedacht. Das liegt wie damals schon mal diskutiert an

[lp-1  ] DEBUG 2022/12/14 01:28:10 soc gradient updated: soc: 25.0%, socDiff: 13.0%, energyDiff: 850Wh, energyPerSocStep: 65.4Wh, virtualCapacity: 6538Wh
[lp-1  ] DEBUG 2022/12/14 02:03:50 soc gradient updated: soc: 39.0%, socDiff: 27.0%, energyDiff: 900Wh, energyPerSocStep: 33.3Wh, virtualCapacity: 3333Wh
[lp-1  ] DEBUG 2022/12/14 03:00:30 soc gradient updated: soc: 40.0%, socDiff: 28.0%, energyDiff: 950Wh, energyPerSocStep: 33.9Wh, virtualCapacity: 3393Wh
[lp-1  ] DEBUG 2022/12/14 03:11:10 soc gradient updated: soc: 45.0%, socDiff: 33.0%, energyDiff: 1470Wh, energyPerSocStep: 44.5Wh, virtualCapacity: 4455Wh
[lp-1  ] DEBUG 2022/12/14 03:16:30 soc gradient updated: soc: 50.0%, socDiff: 38.0%, energyDiff: 1730Wh, energyPerSocStep: 45.5Wh, virtualCapacity: 4553Wh
[lp-1  ] DEBUG 2022/12/14 03:21:50 soc gradient updated: soc: 55.0%, socDiff: 43.0%, energyDiff: 1980Wh, energyPerSocStep: 46.0Wh, virtualCapacity: 4605Wh
[lp-1  ] DEBUG 2022/12/14 03:27:10 soc gradient updated: soc: 60.0%, socDiff: 48.0%, energyDiff: 2240Wh, energyPerSocStep: 46.7Wh, virtualCapacity: 4667Wh
[lp-1  ] DEBUG 2022/12/14 03:37:50 soc gradient updated: soc: 65.0%, socDiff: 53.0%, energyDiff: 2760Wh, energyPerSocStep: 52.1Wh, virtualCapacity: 5208Wh
[lp-1  ] DEBUG 2022/12/14 03:43:10 soc gradient updated: soc: 70.0%, socDiff: 58.0%, energyDiff: 3020Wh, energyPerSocStep: 52.1Wh, virtualCapacity: 5207Wh
[lp-1  ] DEBUG 2022/12/14 03:48:30 soc gradient updated: soc: 75.0%, socDiff: 63.0%, energyDiff: 3270Wh, energyPerSocStep: 51.9Wh, virtualCapacity: 5190Wh
[lp-1  ] DEBUG 2022/12/14 04:04:30 soc gradient updated: soc: 81.0%, socDiff: 69.0%, energyDiff: 4050Wh, energyPerSocStep: 58.7Wh, virtualCapacity: 5870Wh
[lp-1  ] DEBUG 2022/12/14 04:09:50 soc gradient updated: soc: 82.0%, socDiff: 70.0%, energyDiff: 4310Wh, energyPerSocStep: 61.6Wh, virtualCapacity: 6157Wh
[lp-1  ] DEBUG 2022/12/14 04:15:10 soc gradient updated: soc: 86.0%, socDiff: 74.0%, energyDiff: 4570Wh, energyPerSocStep: 61.8Wh, virtualCapacity: 6176Wh
[lp-1  ] DEBUG 2022/12/14 04:20:30 soc gradient updated: soc: 91.0%, socDiff: 79.0%, energyDiff: 4830Wh, energyPerSocStep: 61.1Wh, virtualCapacity: 6114Wh
[lp-1  ] DEBUG 2022/12/14 04:25:50 soc gradient updated: soc: 94.0%, socDiff: 82.0%, energyDiff: 5090Wh, energyPerSocStep: 62.1Wh, virtualCapacity: 6207Wh
[lp-1  ] DEBUG 2022/12/14 04:31:10 soc gradient updated: soc: 98.0%, socDiff: 86.0%, energyDiff: 5350Wh, energyPerSocStep: 62.2Wh, virtualCapacity: 6221Wh
[lp-1  ] DEBUG 2022/12/14 04:36:30 soc gradient updated: soc: 99.0%, socDiff: 87.0%, energyDiff: 5520Wh, energyPerSocStep: 63.4Wh, virtualCapacity: 6345Wh

virtualCapacity Berechnung funktioniert bei mir einfach nicht.

@schenlap

This comment was marked as resolved.

@andig
Copy link
Member Author

andig commented Dec 15, 2022

Mhhm- warum tut das inplace weh? Die Reihenfolge hinterher stimmt doch?

@andig
Copy link
Member Author

andig commented Dec 21, 2022

Schlimmstenfalls muss dann die restliche Zeit geladen werden. Normalerweise kommen die neuen Preise aber rechtzeitig. Schöne Lösung weil implementierungsseitig sehr einfach.

@andig andig force-pushed the feature/planner-2 branch 2 times, most recently from aff5bd5 to 645c98b Compare December 21, 2022 19:30
@Hofyyy
Copy link
Contributor

Hofyyy commented Dec 21, 2022

Anbei mal ein kurzer Test von meiner Seite. Siehe Logs und Tibber Screenshots.

  • Dem Auto fehlen 40% von 60KWH -> 24 KWH mit 11 KW -> 2+ Stunden Ladezeit
  • Nach den groben Tibberscreenshots sollte er zwischen (3-4 für 29 Cent und 4-5 28.5 Cent laden)
  • Zielladen auf Morgen 8 Uhr eingestellt.
  • EVCC Version von heute gegen 21:30 Uhr frischer Compile

Ich sehe:

  • Er startet mit 11KW
  • Dann stoppt EVCC wegen zu hohen Preisen
  • Dann fängt er nach wenigen Minuten komischer Weise wieder an ...
  • Dann habe ich den Test abgebrochen, da er nicht bis um 3 Uhr o.ä. gewartet hat.

Vielleicht helfen euch die Daten.
Wenn ich spezielle Testfälle fahren soll, sagt bescheid.

log.txt
tibber_22 12
tibber_21 12

@andig
Copy link
Member Author

andig commented Dec 21, 2022

Warum will der bei dir so lange laden?

[lp-1  ] DEBUG 2022/12/21 22:04:51 planning 7h57m0s until 2022-12-22 07:00:00 +0000 UTC
[lp-1  ] DEBUG 2022/12/21 22:04:51 total plan duration: 8h55m0s, cost: 2.78

@andig
Copy link
Member Author

andig commented Dec 21, 2022

Der zweite Wert kommt aufgrund 90% Effizienz, der erste ist unklar.

@Hofyyy
Copy link
Contributor

Hofyyy commented Dec 21, 2022

Warum will der bei dir so lange laden?

[lp-1  ] DEBUG 2022/12/21 22:04:51 planning 7h57m0s until 2022-12-22 07:00:00 +0000 UTC
[lp-1  ] DEBUG 2022/12/21 22:04:51 total plan duration: 8h55m0s, cost: 2.78

Hilft hier meinte config? Habe im loadpoint auf 1phasig gestellt und 6A-20A min max eingestellt. Beim Tesla auf 3 Phasen, was er auch real nutzt. rechnet er vielleicht mit 1 Phase 20A?

@andig
Copy link
Member Author

andig commented Dec 21, 2022

Glaskugel -> Reparatur 💁‍♂️

@premultiply
Copy link
Member

Habe im loadpoint auf 1phasig gestellt und 6A-20A min max eingestellt. Beim Tesla auf 3 Phasen, was er auch real nutzt. rechnet er vielleicht mit 1 Phase 20A?

Ja, sehr wahrscheinlich.
Die LP-Konfig muss der tatsächlichen dort anliegenden Phasenkonfiguration entsprechen, die Fahrzeugkonfig der maximal vom Fahrzeug genutzten Phasen.

@andig
Copy link
Member Author

andig commented Dec 22, 2022

Das Problem liegt hier:

func (lp *LoadPoint) maxActivePhases() int {
. Ich bin unsicher mit der Reihenfolge. In dem Moment, wo das Auto erkannt ist müsste ja umgeschaltet werden- das scheint bei dir aber noch nicht passiert zu sein. Warum ist mir nicht ganz klar. Damit kann man als Sonderfall vielleicht erstmal leben da sich das ja im Verlauf wieder zurecht sortiert?

Lass uns das in einem Folge-PR verbessern, siehe offene Punkte.

@Hofyyy
Copy link
Contributor

Hofyyy commented Dec 22, 2022

Das Problem liegt hier:

func (lp *LoadPoint) maxActivePhases() int {

. Ich bin unsicher mit der Reihenfolge. In dem Moment, wo das Auto erkannt ist müsste ja umgeschaltet werden- das scheint bei dir aber noch nicht passiert zu sein. Warum ist mir nicht ganz klar. Damit kann man als Sonderfall vielleicht erstmal leben da sich das ja im Verlauf wieder zurecht sortiert?
Lass uns das in einem Folge-PR verbessern, siehe offene Punkte.

Anbei meine Loadpoint config, falls man da was sehen kann. Also Auto war es ein Tesla mit Phase 3 config. Ich ändere die Config jetzt ab und werde im Loadpoint mal aufräumen und den Test wiederholen.

loadpoint_config.txt

@RTTTC
Copy link
Contributor

RTTTC commented Dec 22, 2022

@Hofyyy
Loadpoint has to have phases set to the 1 or 3 that loadpoint is actually connected as, or 0 IF it supports auto-shift
Do not # comment it out
ALSO vehicle config - car has to be configured to the factual max phases that car supports.

@andig
Copy link
Member Author

andig commented Dec 22, 2022

Anbei meine Loadpoint config

Jetzt verstehe ich es noch weniger (und es fehlt der Rest der Config um ein klares Bild zu bekommen). Die Wallbe hat keine Phasenumschaltung. Wie soll da eine Umschaltung auf 3p passieren? Lass uns das bitte eine eigene Discussion auslagern, das ist hier erstmal OT.

@Hofyyy
Copy link
Contributor

Hofyyy commented Dec 22, 2022

Der zweite Test läuft mit korrigierter Config.

  • Dem Auto fehlen 50% von 62KWH -> 31 KWH mit 11 KW -> 3+ Stunden Ladezeit
  • Zielladen auf Morgen 8 Uhr eingestellt.
  • EVCC Version von gestern gegen 21:30 Uhr

Ich sehe:

  • Kein Solar, daher im PV Modus gleich pausiert
  • Zielladen eingestellt auf 8 Uhr morgens, laden weiterhin pausiert.
  • Jetzt kommt folgende Meldung: ... Sieht erstmal gut aus ...

[lp-1 ] DEBUG 2022/12/22 13:23:54 charge power: -1W
[lp-1 ] DEBUG 2022/12/22 13:23:54 charge currents: [0 0 0]A
[lp-1 ] DEBUG 2022/12/22 13:23:54 charger status: B
[lp-1 ] DEBUG 2022/12/22 13:23:54 next soc poll remaining time: 55m3s
[lp-1 ] DEBUG 2022/12/22 13:23:54 planning 3h5m0s until 2022-12-23 07:00:00 +0000 UTC
[lp-1 ] DEBUG 2022/12/22 13:23:54 total plan duration: 4h0m0s, cost: 1.21
[lp-1 ] DEBUG 2022/12/22 13:23:54 pv charge current: 0A = 0A + -3.55A (2448W @ 3p)

[lp-1 ] DEBUG 2022/12/22 13:36:44 planning 3h1m0s until 2022-12-23 07:00:00 +0000 UTC
[lp-1 ] DEBUG 2022/12/22 13:36:44 slot from: 2022-12-23 03:00:00 +0100 CET to 2022-12-23 04:00:00 +0100 CET cost 0.30, duration running total 1h0m0s, active: false
[lp-1 ] DEBUG 2022/12/22 13:36:44 slot from: 2022-12-23 04:00:00 +0100 CET to 2022-12-23 05:00:00 +0100 CET cost 0.30, duration running total 2h0m0s, active: false
[lp-1 ] DEBUG 2022/12/22 13:36:44 slot from: 2022-12-23 02:00:00 +0100 CET to 2022-12-23 03:00:00 +0100 CET cost 0.31, duration running total 3h0m0s, active: false
[lp-1 ] DEBUG 2022/12/22 13:36:44 slot from: 2022-12-23 05:00:00 +0100 CET to 2022-12-23 06:00:00 +0100 CET cost 0.31, duration running total 4h0m0s, active: false
[lp-1 ] DEBUG 2022/12/22 13:36:44 total plan duration: 4h0m0s, cost: 1.21

@andig
Ich glaube ich habe einen Fehler finden können.
Wenn ich den TargetSOC auf 55% stelle und er nur noch einen Slot benötigt, nimmt er bei zwei gleich teuren Slots den Ersten. in meinem Fall wäre das der um 3 Uhr. Wenn wir aber so spät wie möglich laden sollen, müsste er aber den um 4 nehmen.

Siehe:
[lp-1 ] DEBUG 2022/12/22 15:35:09 planning 18m0s until 2022-12-23 07:00:00 +0000 UTC
[lp-1 ] DEBUG 2022/12/22 15:35:09 slot from: 2022-12-23 03:00:00 +0100 CET to 2022-12-23 04:00:00 +0100 CET cost 0.30, duration running total 1h0m0s, active: false
[lp-1 ] DEBUG 2022/12/22 15:35:09 total plan duration: 1h0m0s, cost: 0.30
[lp-1 ] DEBUG 2022/12/22 15:35:09 pv charge current: 0A = 0A + -2.46A (1699W @ 3p)

@andig

This comment was marked as resolved.

@andig
Copy link
Member Author

andig commented Dec 22, 2022

@Hofyyy also die Sortierung der Slots stimmt, das hab ich grad überprüft.

@Hofyyy
Copy link
Contributor

Hofyyy commented Dec 22, 2022

@Hofyyy also die Sortierung der Slots stimmt, das hab ich grad überprüft.

Ich gucke mir das morgen noch mal an, oder probiere mich mal an einem Test.

@Hofyyy
Copy link
Contributor

Hofyyy commented Dec 22, 2022

Wie oft werden die Kosten (z.B. von Tibber) aus dem Internet geladen? Ich hatte jetzt 2x beim Testen den Fehler, dass keine "Rates" verfügbar sind. Werden die dann probiert alle 5 min neu zu Laden, oder wie geht man mit dem Fehlerfall um, dass es ganz am Anfang nicht geklappt hat Sie zu holen?

@andig
Copy link
Member Author

andig commented Dec 22, 2022

Hier gar nicht. Neues Ticket für Tibber mit Logfile?

@Hofyyy
Copy link
Contributor

Hofyyy commented Dec 22, 2022

Hier gar nicht. Neues Ticket für Tibber mit Logfile?

ok, dachte das hängt mit am planner.

@andig
Copy link
Member Author

andig commented Dec 23, 2022

Seems as if all open points are resolved. Will merge asap.

@andig andig merged commit a9666b5 into master Dec 23, 2022
@andig andig deleted the feature/planner-2 branch December 23, 2022 09:52
@andig andig mentioned this pull request Mar 9, 2023
5 tasks
@mmierke
Copy link

mmierke commented Dec 31, 2023

@andig Vielleicht eine doofe Frage. Gibt es eine Art Designdokument (Architecture), die den Planner (inklusive Persistenz und aller Features) beschreibt. Ich bin zwar neu hier, aber das kling eher nach einer komplexen Erweiterung als nach einem einfachen Enhancement.

@andig
Copy link
Member Author

andig commented Dec 31, 2023

Ne, gibts nicht. Die wesentlichen Dinge haben wir auf Slack diskutiert. Wenn dich die Interna interessieren und du da einsteigen willst meld dich gerne bei Slack an.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Change "cheap" (tariffs) parameter via API/mqtt
8 participants