evcc icon indicating copy to clipboard operation
evcc copied to clipboard

Do not call API every 10 sec. during charging

Open Hofyyy opened this issue 3 years ago • 10 comments

@andig Auf ein Neues.

Um nicht in die Gefahr zu laufen, das zu oft das API aufgerufen wird und man immer das identische Verhalten hat, unabhängig von den Poll Modes, habe ich im socPollAllowed() alle Ausnahmen entfernt.

  • Ich habe keinen Grund für "lp.connected() && lp.socUpdated.IsZero()" finden können. Auch nicht nahc ausführlichem Testen.
  • Charging wurde anders gelöst.

Vorteil:

  • Auch im Charging sieht man jetzt die Debugausgabe wann die nächste Abfrage kommt.
  • Man wartet explizit und nicht implizit über das Caching

Leider hat die Funktion socPollAllowed() nicht nur das API beschützt, sondern indirekt noch den Takt für den Loadpoint vorgegeben in der Funktion publishSoCAndRange(). Das ganze aber nur, wenn die Ladestation den Takt nicht vorgeben konnte.

  • Daher wurde "if lp.socPollAllowed() || lp.socProvidedByCharger()" entfernt. Somit gibt es nun immer den gleichen Takt und der "estimator" kann wenn er denn eingestellt ist arbeiten.

Vorteil:

  • Alle Funktionloops laufen immer mit der gleichen Geschwindigkeit (EVCC Takt)

Die API Aufrufe Tätigt die Klasse Estimator, also schadet es nicht wenn diese über socPollAllowed() bescheid weis und damit intern arbeitet. Das reduziert Abhängigkeiten und Komplexität in der Laufzeit. socPollAllowed wurde der Klasse Estimator zur Verfügung gestellt.

Die Klasse Estimator macht in der Funktion SOC() zwei Dinge. Sie holt einen neuen SOC vom Vehicle oder Charger API. und danach kommt ggf. noch die Estimation, wenn configuriert. Das könnte, und sollte man wahrscheinlich noch auseinanderziehen und ggf. das holen der SOCs in eine Funktion des Loadpoints stecken.

Damit nun nicht zu oft gefragt wird, habe ich die SOC APIs hinter socPollAllowed() gehängt. Der zweite Teil des Estimators wird immer durchlaufen.

Somit kann jetzt socPollAllowed nur noch gaaanz wenig beeinflussen und das so tief wie möglich.

Noch offen:

  • Die Cache duration vom aktuellen Auto in socPollAllowed() für den Charginmode nutzen. Aktuell fest auf 15min gesetzt.
  • Ggf. das SOC besorgen aus den Estimator in eine Funktion des Loadpoints verschieben. (nice to have)

Hofyyy avatar Oct 02 '22 15:10 Hofyyy

Um nicht in die Gefahr zu laufen

Da ist keine Gefahr, denn die APIs sind gecached. Oder willst Du die Caches loswerden? Das wäre eine Idee.

Auch im Charging sieht man jetzt die Debugausgabe wann die nächste Abfrage kommt.

Nice. Dann bräuchte es aber 1 Setting je Auto da die sich durchaus unterscheiden. Nicht alle müssen gleich selten abgefragt werden. Aktuell sieht man übrigens im TRACE of da wirklich eine Abfrage passiert.

Nochmal: welches Problem willst Du hier lösen? Und ist das wirklich ein Problem?

andig avatar Oct 02 '22 16:10 andig

Ich habe keinen Grund für "lp.connected() && lp.socUpdated.IsZero()" finden können.

Das ist der Zustand beim Programmstart

andig avatar Oct 02 '22 16:10 andig

Um nicht in die Gefahr zu laufen

Da ist keine Gefahr, denn die APIs sind gecached. Oder willst Du die Caches loswerden? Das wäre eine Idee.

Auch im Charging sieht man jetzt die Debugausgabe wann die nächste Abfrage kommt.

Nice. Dann bräuchte es aber 1 Setting je Auto da die sich durchaus unterscheiden. Nicht alle müssen gleich selten abgefragt werden. Aktuell sieht man übrigens im TRACE of da wirklich eine Abfrage passiert.

Nochmal: welches Problem willst Du hier lösen? Und ist das wirklich ein Problem?

Also ich wollte beim Chargeing die Ausgabe sehen und war dann verwirt. Ein Bug und wirkliches Problem ist es nicht. Wenn ihr andere Baustellen habt ist auch gut. Änderungen haben ja auch immer ein Risiko. Ich finde aber regelmäßige kleine Überarbeitung wenn sie z.B. einen Wartbarkeitsvorteil haben auch nicht schlecht.

Ich würde eine Statemachine eher so pflegen das man ggf. den Cache plötzlich garnicht mehr braucht.

Also ich finde es besser so, habe eine Menge gelernt. Jetzt gucke ich welche Prioritäten ihr im Projekt setzt und gucke wo ich helfen kann. :-)

Hofyyy avatar Oct 02 '22 16:10 Hofyyy

Ich würde eine Statemachine eher so pflegen das man ggf. den Cache plötzlich garnicht mehr braucht.

Spricht nix dagegen. Der Punkt unterschiedlicher Cachezeiten je Fahrzeug ist aber weiter offen.

andig avatar Oct 02 '22 17:10 andig

Ich würde eine Statemachine eher so pflegen das man ggf. den Cache plötzlich garnicht mehr braucht.

Spricht nix dagegen. Der Punkt unterschiedlicher Cachezeiten je Fahrzeug ist aber weiter offen.

Das gucke ich mir mal an. Ich dachte da kennt ihr euch vielleicht mit den Templates aus. Also der Loadpoint kennt doch das aktuell Verbundene Vehicle?! da müsste dann der Wert in irgendeine Interface funktion und die würde man in PollAllowed() auslesen und gut ist.

Hofyyy avatar Oct 02 '22 17:10 Hofyyy

Ich habe keinen Grund für "lp.connected() && lp.socUpdated.IsZero()" finden können.

Das ist der Zustand beim Programmstart

Edit: deleted

Edit2: Ich mache die Tests grün und melde mich dann wieder

Hofyyy avatar Oct 02 '22 17:10 Hofyyy

Ich würde mich dann mal um die Tests kümmern, ob wir das mergen oder nicht. Dann lerne ich mal wie das geht. Ich hoffe es ist ok, wenn wir dein ein paar Tage offen lassen. Gerade habe ich schon mal den Linter geradegezogen.

Hofyyy avatar Oct 02 '22 18:10 Hofyyy

@andig Ich habe einen voll kompatiblen Zwischenschritt erreicht, bei dem ich auch einen Bug beheben konnte. Diese Version ermöglicht es zusätzlich mit einem Charging Intervall > 0 zu testen und es weiter umzubauen.

Änderungen:

  • Alle Modi setzen "honourUpdateInterval" damit gibt es keinen Sonderfall mehr. Hab es auf meine Art programmiert, Ich könnte es aber auch minimalinversiv in die aktuelle Version einbauen. Und die Werte vom "return" in die "honourUpdateInterval" Ebene verschieben.
  • Der Reset mit lp.socUpdated.IsZero() geht dann auch so durch, da die Differenz sehr groß wird. Hier braucht es keine extra logic.
  • Für Charging würde ich erstmal ein Intervall für 0 annehmen, damit geht es dann auch immer sofort durch und verhält sich identisch zu vorher.
  • socProvidedByCharger() aus der Mainloop entfernt und via Intervall 0 gelöst, siehe Bugfix.

Bugfix:

  • Ich habe auch für socProvidedByCharger() ein Intervall eingetragen. Früher wäre da bei jedem Setting in "honourUpdateInterval" eine Logmeldung erschienen, die in der Realität aber nicht passiert wäre, da der Estimator den SOC sofort und direkt vom Charger geholt hätte.

Hofyyy avatar Oct 03 '22 18:10 Hofyyy

Ich versteh grad nur Bahnhof. Kannst Du bitte nochmal kurz sagen, was der PR tut und inwiefern unterschiedliche Abfrageintervalle je Fahrzeug damit harmonieren?

andig avatar Oct 08 '22 19:10 andig

Ich versteh grad nur Bahnhof. Kannst Du bitte nochmal kurz sagen, was der PR tut und inwiefern unterschiedliche Abfrageintervalle je Fahrzeug damit harmonieren?

  1. Es behebt einen logging Bug, wenn die Wallbox den SOC bereitstellt. Da in dem Fall socPollAllowed() nicht mehr loggt.
  2. Da im charging mode noch das Intervall 0 gesetzt ist, hat sich real das Verhalten nicht geändert. Es gibt also noch kein Problem mit verschiedenen Fahrzeugen.

Aber du hast Recht. wenn es mehrere Fahrzeuge "gleichzeitig" gibt, ist die finale Lösung garnicht so einfach und in dem PR auch noch nicht adressiert.

Hofyyy avatar Oct 09 '22 06:10 Hofyyy

wenn es mehrere Fahrzeuge "gleichzeitig" gibt, ist die finale Lösung garnicht so einfach und in dem PR auch noch nicht adressiert.

Ich mache vorerst mal zu da Rückschritt ggü. Status Quo.

andig avatar Oct 23 '22 11:10 andig