Repository navigation
Conversation
|
Kurzer Hinweis, unabhängig von der eigentlichen Review: seit #3717 (gemerged 2026-08-04, vermutlich nach deinem 2.1.9-Fork) gibt es pro Fahrzeug-Template Das kollidiert konkret mit den festen Ich würde dafür aber nicht noch eine Einstellung ergänzen wollen - wir haben in der openWB schon reichlich Konfigurationsoptionen, und jede weitere macht es für Nutzer schwerer, das Gesamtbild zu verstehen. Stattdessen: Nebenbei, ganz ohne Vorwurf: für die Weiterentwicklung lohnt es sich generell, auf Basis von master statt eines älteren Standes wie 2.1.9 zu arbeiten - genau solche Überschneidungen wie mit #3717 wären dir dann vermutlich schon früher aufgefallen. |
entweder das oder force=true benutzen, so wie das für die Phasenumschaltung gemacht wird. Brauchst Du aber wahrscheinlich gar nicht. Stell die Evse einmalig auf 16A und mach mit CP was Du willst. |
|
Kurzer Nachtrag dazu: dein Vorschlag (EVSE einmalig setzen, CP unabhängig davon steuern) klingt nach der saubereren Lösung als das, was ich vorgeschlagen hatte - aber das ist eine echte Verhaltensänderung an Mein Vorschlag: das vor dem Merge dieses PRs klären, nicht erst danach als Follow-up. Der Grund: ohne die Anpassung wäre |
|
Mir fallen folgende Optionen ein:
und so weiter. Meine Meinung: ist nicht getestet, ich kann das nicht testen. Hier sind wir auf feedback angewiesen was man nicht so einfach bekommt wenn sich nix ändert am code.
|
|
Hast du denn überhaupt die funktion mit cp_retry aus #3717 überhaupt mal getestet? Weil Auslöser war ja genau jemand mit einem Elroq und dafür hab ich diese Option eingebaut, das man dann bei aktivem cp_interrupt auch die cp Unterbrechnung erneut anstößt. Unds zu 6. es würden sich ja haufenweise Meldungen sammeln wenn andere auch ein riesen Thema damit hätten und openWB nicht nutzbar wäre. Die Tickets würden sich stapeln und es hätte schon eventuell ne Alternative/Lösung dafür gegeben. Also glaub ich nicht, das der Filter jetzt das Allheilmittel ist wie du behauptest :) |
|
Also Mein Problem war ein anderes. Bei mir ist er auf Störung gegangen. Led am Port rot, nicht rücksetzbar außer durch Stecker abziehen. Wobei Stecker abziehen nicht ausschließlich per CP geprüft wird sondern auch durch PP. Und eine PP Unterbrechung gibts nicht, der ist hart verdrahtet im Stecker. Der Grund mindestens einer Störung war eine Relaisschleife bei Phasenwechsel. #3319 Zufällig stand ich neben der Box als es passierte, sonst hätt ich das nie gefunden. Taucht in keinem Log auf. Aus der Erfahrung heraus hab ich dann diesen low level Filter implementiert. Als Robustheitsmaßnahme. |
Auf welche Stellen beziehst Du Dich hier? Es gibt genau einen Soll-Strom am Ende des Algorithmus und eine Stelle, die den Strom setzt. Deinen Lösungsansatz sehe ich eher kritisch, er behebt ein Symptom, ohne den Bug zu identifizieren und bringt gleichzeitig sehr viel Komplexität in die Abhängigkeiten zu den restlichen Einstellungen. |
|
Ja natürlich ist es besser den Code zu fixen. Sieh das hier als Robustheitsmaßnahme. |
Problem
Der Regelalgorithmus ist über Lademodi, Lastmanagement, Phasenumschaltung, CP-Unterbrechung und Fehlerbehandlung so verzweigt, dass sich das Ein- und Ausschalten der Ladefreigabe aus mehreren voneinander unabhängigen Stellen ergibt. In der Vergangenheit sind dadurch wiederholt Relaisschleifen aufgetreten: Register 1000 wird im Sekundentakt zwischen 0 und ungleich 0 hin- und hergeschrieben.
Für viele Fahrzeuge ist das unkritisch. Bei MEB-Fahrzeugen — ID.4, Enyaq, Elroq ab Softwarestand > 5.2 — führt zu schnelles An/Aus zu einem Fehlerzustand, aus dem sich das Fahrzeug nicht selbst befreit. Die Ladung bleibt stehen, bis manuell aus- und wieder eingesteckt wird.
Der PR setzt bewusst nicht am Algorithmus an, sondern unmittelbar vor dem Modbus-Schreibzugriff. Das ist die einzige Stelle, an der alle Pfade zusammenlaufen; die Garantie gilt damit unabhängig davon, welcher Zweig den Wechsel ausgelöst hat.
Funktion
Ratenbegrenzung. Ein Wechsel
0 -> ungleich 0bzw.ungleich 0 -> 0auf Register 1000 ist erst nach Ablauf eines Mindestfensters erlaubt (MIN_ON_TIME_S/MIN_OFF_TIME_S, je 300 s). Reine Stromänderungen (6 A -> 10 A) laufen immer durch, die Überschussregelung bleibt unangetastet.Das Fenster greift nur dann, wenn der letzte Zustandswechsel weniger als 5 Minuten zurückliegt — im Normalbetrieb ist es also nie aktiv. Die Werte stammen aus einem Fork, der seit längerem im Feld läuft; kleinere Werte funktionieren möglicherweise auch, sind aber nicht bestätigt.
Ausnahme Phasenumschaltung (und CP-Unterbrechung). Diese Prozeduren schalten Hardware genau in dem Moment, in dem sie den Strom auf 0 setzen. Ein bloßes Unterdrücken des Schreibzugriffs würde das Relais unter Last schalten lassen. Sie warten deshalb über
wait_for_window()aktiv, bis die Abschaltung erlaubt ist, und brechen ab, falls das Fenster nicht aufgeht — die Umschaltung wird später erneut angefordert. Sie laufen ohnehin in eigenen Threads, blockieren also nichts.Die so abgewartete Abschaltung zieht kein neues Fenster auf, damit der Wiederanlauf direkt nach der Umschaltung nicht für weitere 5 Minuten gesperrt ist.
Ausnahme Heartbeat-Verlust. Fällt die Verbindung zur übergeordneten openWB aus, muss die Ladung sofort stoppen; auf ein Fenster zu warten wäre hier falsch. Dieser Fall ist selten und erzeugt daher keine Schleife. Der Schreibzugriff geht über
force=Truesofort raus und wird als Ausnahme protokolliert. Das Fenster wird dabei aufgezogen, der anschließende Wiederanlauf ist also wie üblich begrenzt — der Schutz für das Fahrzeug bleibt vollständig erhalten.Meldung im Log. Jeder tatsächliche Schreibzugriff auf Register 1000 und jeder unterdrückte Versuch geht nach
data/log/openwb_evse_relay.log. Ab 3 Wechseln in 120 s wird zusätzlichmögliche Relaisschleife!protokolliert. Das macht den Fehler erstmals nachweisbar, statt ihn nur zu vermuten.Darüber hinaus gibt es keine Umgehung — auch nicht für die Fehlerabschaltung.
Verhalten bei Unterdrückung
Der Filter verzögert, er verwirft nicht.
set_currentkehrt vorwrite_registerzurück; die Regelung stellt ihren Wunsch im nächsten Zyklus erneut, ein dauerhafter Befehl landet also, sobald das Fenster abgelaufen ist. Ein Ein-Zyklus-Zappler wird vollständig geschluckt: der 0-Schreibzugriff wird unterdrückt, der darauf folgende ungleich-0-Schreibzugriff ist wegen des unverändertenevse_currentein No-Op.Änderungen
modules/common/evse_transition_filter.pyevse_id, thread-sichermodules/common/evse_transition_filter_test.pymodules/common/evse.pyset_currenterhältwaitundforce, ruft den Filtermodules/internal_chargepoint_handler/chargepoint_module.pymodules/internal_chargepoint_handler/internal_chargepoint_handler.pyforce=Truemodules/internal_chargepoint_handler/socket.pyforcean die Basisklasse durchmodules/chargepoints/openwb_series2_satellit/chargepoint_module.pyTests
30 Unit-Tests mit gestellter Uhr, ohne Hardware: Fensterlogik in beide Richtungen, Nicht-Begrenzung von Stromänderungen, Trennung nach
evse_id, aktives Warten inklusive Timeout-Abbruch, beide Ausnahmen inklusive Nachweis, dass sie den Fahrzeugschutz nicht aushebeln, Fail-open beiallow_writegegenüber Fail-safe beiwait_for_window.Offene Punkte für die Diskussion
hardware_configuration-Setting konfigurierbar gemacht werden.error_counter_exceeded()) läuft bewusst durch den Filter und bekommt keinforce. Falls das aus eurer Sicht anders sein soll, ziehe ich das nach.