-
-
Notifications
You must be signed in to change notification settings - Fork 620
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
Geladene kWh / kWh der Session fehlerhaft #9884
Comments
Die Zählerwerte werden offensichtlich richtig übernommen. Es fehlt der Sessionwert im Logfile um das zu beurteilen. Oder das Ladelog der Easee. Vmtl. schickt die Easee einfach den falschen Wert und dann müsste man würfeln um festzustellen welcher jetzt wohl stimmen könnte. Wie sollte evcc das auflösen? |
Das hier? Das sind alle Session Updates der Easee während des 2. Ladevorgangs.
Und in der Tat erscheint dort am Anfang die falschen 13,3 kWh. Und zwar immer nach einem neuen SignalR Verbindungsaufbau, z.B.
Da ist wohl die Easee Api schuld, die liefert total veraltete Daten nach einem Neuaufbau. Während der Sitzung erfolgte wiederholt eine neue SignalR Verbindung
Lt. Easee App hatten die Ladevorgänge heute 13,3 kWh (1. also korrekt in EVCC) und 5 kWh (nicht korrekt in EVCC). So oder so, wenn man die Werte von meter_end_kwh müsste der aktuelle Wert sein, da ist eine Verzögerung in der Easee Api, der richtige Endstand kam erst nach über 40 Minuten nach Ende des Ladevorgangs.
Daher wäre m.E.n. eine Korrektur wie folgt nötig: Meter_start_kwh 2342,6 zzgl. diese 5 ergibt dann auch den aktuellen Stand von 2347,6.. Aber sowohl meter_start als auch meter_end werden mit ggf. veralteten Werten der Easee Updates gefüllt, damit da aber richtige und aktuelle Werte kommen, könnte man ein Update über |
Mein Vorschlag wäre Ticket bei Easee. Die API-Daten sollten konsistent sein. Wir verwenden ja genau NICHT das Polling sondern Push via SignalR. |
Ticket kann sicherlich nicht schaden, aber keine entspr. Stelle zum eröffnen gefunden (?). Das Pollen pollt auch nicht im eigentlichen Sinne, sondern löst nur ein kurzfristiges ProductUpdate mit aktuellen Daten aus, s.u.,. Ansonsten würden mehr oder weniger viele Korrekturen dass Problem lösen: a) in EnergyMetrics, wenn der Wert von getChargedEnergy() aus Easee.go einen kleineren Wert liefert als zuvor, diesen kleineren übernehmen, statt auf dem alten / höheren und falschen zu verharren bzw. den neuen Wert als ungültig zu betrachten, nur weil er kleiner ist. Warum das so ist, und ob und welche Wallboxen kleinere Werte im Laufe einer Sitzung senden - k.A. b) Ignorieren aller veralteten Productupdates c) bei Erkennen Fahrzeug an/abgesteckt, über die API ein Update von Lifetimeenergy auslösen, dann wären zumindest Start- und Endstand richtig(er). SignalR Output des "Polls":
|
@GrimmiMeloni , was meinst Du zu b) ?
|
Wir nehmen für alle Product Updates immer das aktuellste was Easee per API zur Verfügung stellt. Insbesondere werden Product Updates rausgefiltert die einen älteren Timestamp haben als wir aktuell im Speicher. (fix dazu bereits im Juli, siehe #9047) Ansonsten sorry, aber TL;DR - bitte ggf. konkret nochmal Log(ausschnitt) zeigen um den es geht. Das hier ist viel zu detailliert um hier nachträglich einzusteigen. |
Danke @GrimmiMeloni dass Du da rein schaust! |
@allcoolusernamesaregone ich habe mich jetzt hier mal tapfer eingelesen.
Wo oben erläutert, filtern wir bereits veraltete Werte bei den Product Updates, falls diese Out of order kommen. Ich möchte ungern noch weitere "magic" in Bezug auf die Product Updates einbauen. Es wird dann haarig wenn es darum geht den "korrekten" Threshold zu finden. Sind 5mins schon "alt"? Oder erst 1h? Und gilt das für alle, oder nur für manche? Besser nicht zu sehr tricksen - zumindest nicht so lange wir hier andere Optionen haben. Zu deinen Vorschlägen. |
Hallo, kurz vorab da mobil, bei 2. müsste es LIFETIME_ENERGY heißen denke ich.. |
Ich habe in der Easee.go hinter
nun mal folgendes ergänzt. Switch, da ich anfänglich dachte, auch andere Werte bräuchten ggf. eine Sonderbehandlung. Ist aber, wenn man sich die ganzen veralteten bzw. älteren Werte ansieht (Übersicht folgt) nicht so.
Das erste if filtert die SESSION_ENERGY Updates, deren Erstelldatum älter als 15 Minuten beim Empfangen ist.
Ein Neustart von EVCC und somit auf zwingendem SignalR Neuaufbau:
Denke es ist wenig sinnvoll, den Wert SESSION_ENERGY der letzten Ladesession von vor 10 Stunden zu übernehmen.. Ein Ladevorgang->Ende->Ab-/Anstecken - Pause -> Ladegang Szenario teste ich morgen mal.. Anbei außerdem eine Übersicht der empfangenen Productupdates nach Neuaufbau der SignalR Verbindung. Wegen dem Start- und Endzählerstand, habe ältere Logs geprüft, das ist systematisch falsch. Der Eintrag in die Datenbank bzw. das Update der Session erfolgt mit einem nicht aktuellen Wert. Der kommt halt tatsächlich unterschiedlich viel später. |
Nachtrag: die Session in der Datenbank ist i.A.
Ob das schon länger so ist, oder die API seit kürzlich (da gab's doch vor kurzem einen Ausfall/Wartung!?) - wer weiß. |
Ticket bei Easee? |
Wer wo wie? |
|
Hier stellt sich weiterhin die Frage wann zu filtern ist. Auch ein 10h alter Wert für SESSION_ENERGY kann durchaus korrekt sein, z.B. wenn über Nacht pausiert wird und es bei Sonnenaufgang mit der Ladung weitergeht. Im Kern ist das Problem das SESSION_ENERGY und LIFETIME_ENERGY nicht zuverlässig aktualisiert werden. Während der Ladung "unschön" aber insbesondere am Ende der Session nicht gut, weil wir mit (teils stark) veralteten Werten rechnen, wenn wir die Session abschließen. Ich habe das jetzt noch nicht selbst testen können, ich mutmaße aber das wir hier eine Race Condition haben, zwischen Session Ende (und Berechnung im Loadpoint) und dem asynchronen Update für SESSION_ENERGY und LIFETIME_ENERGY. Hängt vermutlich auch vom Zeitpunkt im Intervall ab, wann die Ladung physikalisch endet. Selbst wenn Easee die letzten Werte zeitnah sendet, könnte es sein das wir dies nicht mehr berücksichtigen weil wir bereits berechnet haben. Der zuverlässigste Weg wäre meiner Ansicht nach beim Stoppen der Session die Daten direkt bei Easee abzuholen. Ich sehe aber noch nicht wie das im Code möglich wäre. Ein Mittelweg könnte es sein, die Werte für |
Das stimmt, allerdings gilt das nur während der selben Ladesitzung, und das weiß man doch, bzw. den Wechsel der Sitzung kann man doch erkennen/auswerten.
ChargedEnergy() = SESSION_ENERGY wird nach meinen Logs nach stop_charging umgehend und korrekt übermittelt als Productupdate. Das wird nur heute ja leider ignoriert, da der Wert kleiner als der vorherige Wert der letzten Ladesession ist. TotalEnergy() = LIFETIME_ENERGY wird periodisch (ca. stündlich außerhalb einer Ladesitzung, während einer Sitzung viel häufiger) als Productupdate gesendet, aber der Wert selbst wird in der Cloud scheinbar nur stündlich aktualisiert.
Mag auch sein dass das Mist ist von Easee - vielleicht hat es aber auch seinen Grund. Ob oder ob nicht, und falls ja, da eine Korrektur käme - wer weiß. Ist eigentlich keine Option darauf zu warten, wenn die Statistik irgendeinen Sinn ergeben sollte.. |
Ich glaube wir reden immer noch über unterschiedliche Dinge. Line 278 in 9e0ceb9
Wo siehst Du das alte und neue Werte verglichen und ggf. ignoriert werden? Kannst Du die Stelle im Code benennen? |
ok, an folgendem Beispiel erklärt: Ladevorgang 2 startet am Nachmittag
und/oder (vermutlich eher) in energy-metrigs.go
"...or invalid lower value" sagt denke ich auch genau das. Daher sah ich auch im Beispiel oben Der 2. Ladevorgang wäre korrekt protokolliert, wären > 13,3 kWh geladen worden, denke ich. |
Nun, ich habe hinter
nun folgendes eingebaut:
Den case CHARGER_OP_MODE habe ich ergänzt, da der intern vorhandene Wert auch über Ladesessions erhalten bleibt, das ignorieren veralteter Updates im case SESSION_ENERGY allein daher nicht zielführend war. Ebenso nach
ergänzt:
Nach start/stop / resume/pause charging ebenfalls einen neuen Wert für LIFETIME_ENERGY anfordern. Funktioniert hat das jetzt in mehreren Tests mit unterschiedlichen Ladestarts (EVCC startet neu während Fahrzeug verbunden, Fahrzeug verbinden während EVCC läuft, Ende Ladevorgang über UI, Ende Ladevorgang über Aufsperren Fahrzeug/abstecken) wie erwartet. Start+Endwert korrekt, geladene Menge ebenfalls. Alternativ könnte man folgendes tun:
|
Die Idee den OP_MODE Wechsel als Trigger für einen Poll zu nehmen finde ich gut. 👍 Das sollte auch die oben genannte Race Condition verhindern, zumindest wenn wir noch auf das async Product Update für LIFETIME_ENERGY warten. Dann können wir sicherstellen, daß der Loadpoint die Zustandsänderungen erst sieht wenn wir definitiv die aktuellen Werte haben. Somit finden dann auch Berechnungen am Session Ende auf korrekten Daten statt. Was mir überflüssig erscheint ist der Aufruf des Polls explizit nach start/stop/resume/pause. Dabei entsteht implizit ein opMode Übergang, welcher dann den entsprechenden Poll mit Deinem Change auslöst. Oder übersehe ich hier etwas? Zusätzlich müssen wir noch bei den zeitgleich eintreffenden SESSION_ENERGY Updates aufpassen . Die Reihenfolge der Nachrichten ist erfahrungsgemäß nicht garantiert. Das war der eigentliche Auslöser für den Filter über den Timestamp. Wenn jetzt aber die Nachrichten mal in anderer Reihenfolge kommen, könnte es sein das wir 0 statt dem letzten korrekten Wert der Session übernehmen. Der explizite Reset auf 0 sollte auch den Timestamp auf den aktuellen Zeitpunkt ändern. Dann ist die Logik bzgl. "älter als 5 mins" nicht mehr erforderlich. Bitte pack mal Deinen Change in einen PR, damit wir hier sauber zusammenarbeiten können. Danke! |
klingt gut, für sowas reichen meine Go / EVCC Kenntnisse leider nicht :(
Ja, das stimmt. Ich filter aber aktuell ja auf an/abstecken, ein Stop/Start von EVCC wird da ja nicht berücksichtigt.
Deswegen nulle ich nach dem Anstecken den internen letzten Wert, der ja noch > 0 sein kann und übernehme dann auch nur aktuelle Werte (man könnte da nach meinen Logfiles auf <1 Minute runter) und verhindere das versehentliche Nullen des letzten Werts durch ein "gleich altes" Update, wenn der neue Wert 0 ist. Falls diese gleich alte 0-Meldung im ProductUpdate (wie hier im Log)
Muss ich drüber sinnieren 😂 - aber klingt gut. Da scheitere ich beim Analysieren heute morgen ein wenig am Verständnis von Go und der Datenstrukturen.
Äh, ich versuch's mal.. da waren wir glaub ich schon mal, ich habe keine Ahnung, aber setze mich heute abend mal ran... |
#9940 so richtig...? |
Describe the bug
Eingesetzte Version: Master vom 9.9., 19:30.
Ladevorgang heute morgen, lt. Wallbox Easee bei Zählerstand 2329,271.
Ladeende, Zählerstand lt. Easee 2337,614. Differenz 8,34 kwh. In die Session wird 13,28 geschrieben.
Beim Ladestart glaube ich mich auch zu erinnern gesehen zu haben, dass der Ladevorgang schon direkt nach dem Start mit 5,x kWh angegeben war in der UI. Ob 13,x oder 8,x geladen, das fällt ja nicht mal so sehr auf.
Aber stutzig wurde ich eben, da In der Statistik 2x die gleiche Menge erscheint - und die Ladedauer für 13 kWh am Nachmittag viel zu kurz war.
Ladevorgang anderes KFZ am Nachmittag, knapp 3 kWh geladen - wieder gute 13.
Steps to reproduce
Leider nicht bekannt
Configuration details
Ergänze ich gerne falls nötig
Log details
What type of operating system are you running?
Linux
Version
Master 9.9. 19:30
The text was updated successfully, but these errors were encountered: