Repository navigation
PV-Laden: bei ausreichend Überschuss direkt mehrphasig statt einphasig starten - #3899
seaspotter wants to merge 2 commits into
Conversation
|
Ergänzung: Warum es manchmal schon funktioniert und manchmal nicht Kurz zur Einordnung: Es gibt bereits eine bestehende Das Problem liegt an einer zweiten, unabhängigen Stelle:
Das eine Problem tritt also nur bei einer bestimmten Vorbedingung (Hardware Was diese PR wirklich behebt: |
Das stimmt so nicht. An der Stelle wird die Phasenzahl fest gelegt, aber nicht umgeschaltet. Es gibt mehrere Stellen, die Einfluss auf die vorgegebene Phasenzahl haben. Umgeschaltet wird erst am Ende in core/packages/control/process.py Line 47 in 983f47d Die Lösung berücksichtigt auch keine Gleichzeitigkeit. In der algorithm.py wird vorher noch geprüft, ob eine automatische Umschaltung gemacht werden muss und es wird für jeden LP ggf eine Leistung reserviert. Auch im Sinn der Trennung von Verantwortlichkeiten ist es unschön, dass die Ladepunkt-Klasse , die erstmal Soll-Strom und -Phasen ermitteln soll, beurteilt, ob der Überschuss ausreicht. Last- und Überschussverteilung sollte innerhalb der algorithm.py bleiben. |
|
Das Problem bei zB #3496 (comment) ist, dass direkt mit der Umschaltung begonnen wird und nicht erst die Umschaltverzögerung durchlaufen wird, an deren Ende die 1p oder 3p-Entscheidung getroffen wird. Ich habe dafür aber noch keine Ursache gefunden. |
|
Danke für den Hinweis, das deckt sich mit meiner eigenen Erfahrung – genau dieses Verhalten hatte ich selbst auf meiner Anlage, deshalb kam die PR überhaupt zustande. Ich glaube, die eigentliche Ursache liegt tiefer: Alternativvorschlag, damit das komplett in der Algorithmus-Logik bleibt statt in der Ladepunkt-Klasse:
Damit bräuchte es die separate Überschussprüfung in der Ladepunkt-Klasse aus meiner PR gar nicht mehr. Wenn das so für dich passt, würde ich das entsprechend umbauen. |
|
Ich kann deiner Argumentation nicht ganz folgen und es auch nicht nachstellen:
Dann müsste man das mit Sofortladen 1-phasig, Stop und dann bei ausreichend Überschuss auf PV nachstellen können, dass er dann umschaltet und sofort anfängt. Bei mir wird immer erst die Einschaltverzögerung abgewartet.
Das ist richtig, die Einschaltverzögerung soll im Automatikmodus ja auch für eine Phase starten. Am Ende der Einschaltverzögerung wird der Überschuss geprüft und ggf die Soll-Phasen auf 3 gesetzt.
Die Phasenzahl ist während der Umschaltverzögerung nicht relevant. Es reicht, wenn nach der Einschaltverzögerung und vor dem Ladestart auf die benötigte Phasenzahl umgeschaltet wird.
Du meinst wahrscheinlich den Aufruf aus der process.py von |
…g starten get_phases_by_selected_chargemode() erzwang beim Ladestart unconditional phases=1, unabhängig vom Überschuss und davon, auf welcher Phasenzahl die Hardware (Rest vom vorherigen Ladevorgang) noch steht. Das löste eine unnötige Umschaltung aus, bevor überhaupt eine Einschaltverzögerung beginnt (state=NO_CHARGING_ALLOWED) - mit echtem Log belegt. Fix bewusst in Algorithm._check_phases_at_charging_start() statt in der Ladepunkt-Klasse: nur hier sind Reihenfolge und noch verfügbarer Überschuss über alle Ladepunkte hinweg bekannt, remaining_surplus wird lokal fortgeschrieben, damit nicht zwei gleichzeitig neu startende Ladepunkte denselben Überschuss beanspruchen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
c9467ee to
a9116a4
Compare
|
Zu Der eigentliche Auslöser ist ein anderer, bisher nicht diskutierter Zweig - Zu deinem zweiten Punkt (gehört nicht in die Ladepunkt-Klasse, keine Berücksichtigung von Gleichzeitigkeit): dem stimme ich zu und habe den PR entsprechend umgebaut. Die Überschussprüfung sitzt jetzt in Mit den echten Werten aus Matts Log getestet: mit dem Fix wählt der Algorithmus direkt 3 Phasen, |
Genau das ist die Frage: In welcher Situation wird im ersten Zyklus nach dem Anstecken nicht auf SWITCH_ON_DELAY gewechselt? Im normalen Ablauf ist das der Fall.
Das behebt mMn nicht den Bug, sondern baut einen parallelen Weg, um die Phasenzahl zu setzen. Wartungsfreundlich ist das nicht, es gibt mehrere Wege, mal greift der eine, mal der andere. |
Immer dann, wenn im ersten Zyklus der Überschuss noch nicht ausreicht. In Und Reihenfolge innerhalb eines Zyklus passt auch dazu: Noch ein Vorschlag:
Damit bleibt die Entscheidung komplett an der einen Stelle, kein zweiter Weg in der algorithm.py nötig - und der eigentliche Bug (unnötige Umschaltung während Ich baue das gerne so um, wenn das für dich passt. |
…tt paralleler Prüfung Ersetzt Algorithm._check_phases_at_charging_start() (paralleler Weg, von Lena zurecht als nicht wartungsfreundlich kritisiert) 1. get_phases_by_selected_chargemode() erzwingt vor Ladestart nicht mehr phases=1, sondern behält die bisherige Phasenzahl bei. Das war der eigentliche Bug: stand die Hardware noch auf 3 Phasen (Rest vom vorherigen Ladevorgang), löste das erzwungene phases=1 eine unnötige 3->1-Umschaltung aus - noch bevor überhaupt eine Einschaltverzögerung beginnt, im Zustand NO_CHARGING_ALLOWED (_is_phase_switch_required() hat dafür einen expliziten Zweig). 2. get_pv_config_py_load() berechnet die Einschaltschwelle jetzt bewusst immer für eine Phase, unabhängig von control_parameter.phases. 3. switch_on_timer_expired() setzt die Phasenzahl jetzt explizit in beiden Fällen (ausreichend/nicht ausreichend Überschuss für die maximale Phasenzahl), nicht mehr nur im "genug Überschuss"-Fall. Die Entscheidung bleibt damit vollständig an der bestehenden Stelle in counter.py, inklusive der schon vorhandenen Gleichzeitigkeits-Behandlung über reserved_surplus. Tests aktualisiert: die jetzt korrekt niedrigere Einschaltschwelle (immer 1-phasig statt der vorherigen, von der Phasenzahl abhängigen Schwelle) lässt in den Integrationstests teils mehr Ladepunkte gleichzeitig die Verzögerung starten - das ist beabsichtigt und wurde einzeln nachvollzogen, nicht blind an die neuen Werte angepasst.
|
Ehrlich gesagt, kann ich aus Deiner bisherigen Argumentation weder den Bug theoretisch nachvollziehen noch nachstellen, um zu verifizieren, dass der PR den Bug wirklich behebt.
Kannst Du mit dem beschriebenen Ablauf den Bug nachstellen? Nach dem Wechsel in SWITCH_ON_DELAY gibt es kein passenden Branch in _is_phase_switch_required.
|
|
Danke für deine Geduld Lena und die kritischen Nachfragen - die ursprüngliche These (phases=1 löst über NO_CHARGING_ALLOWED eine vorzeitige 3→1-Umschaltung aus) konnte ich trotz mehrerer Versuche nicht reproduzieren. Da lag ich falsch, und du hattest die ganze Zeit zurecht Zweifel. Ein Teil davon liegt sicher auch daran, dass der Code an der Stelle über mehrere Module verteilt und nicht immer auf den ersten Blick zu überblicken ist - mea culpa. Ich würde vorschlagen, ich mach den PR hier zu. Dabei ist mir bei Matts Log aber ein separates "Problem" aufgefallen: Vorschlag: Für den bestätigten Fall (Überschussprüfung erneut anstoßen, wenn charge_state innerhalb einer laufenden CHARGING_ALLOWED-Session auf True wechselt)? Ich hatte defintiv auch einen Fall wo er mit 1p gestartet ist obwohl Überschuss für 3p vorhanden war, das war der Ausgang für den PR, ich hab leider den Log von damals nicht mehr und kann nachvollziehen ob das genauso war. Ansonsten mach ich auch gern nochmal ein Issue auf wo wir die Fälle nochmal sammeln mit Logs (als txt damit es im paste nicht verloren geht)? |
Ja, das macht Sinn. |
Ich finde das zu perfektionistisch. Da gibt es aktuell Themen, die wichtiger sind. |
Der Hilfetext zur Einstellung "Pufferzeit zwischen automat. Phasenumschaltungen"
verspricht explizit:
Das funktioniert bisher nur zufällig zuverlässig, nicht durchgängig. Es gibt
dafür bereits eine Logik (
switch_on_timer_expired()incounter.py, Meldung"Der Überschuss ist ausreichend, um direkt mit {} Phasen zu laden."), die beim
Ablauf der Einschaltverzögerung den Überschuss prüft und korrekt direkt mit
maximaler Phasenzahl startet – das funktioniert für sich genommen.
Das Problem liegt an einer zweiten, unabhängigen Stelle:
get_phases_by_selected_chargemode()setzt beim Ladestart im Automatikmodus unconditional
phases = 1, unabhängigvom Überschuss und unabhängig davon, auf welcher Phasenzahl die Hardware
gerade tatsächlich steht. Stand die Hardware zufällig schon auf 1 Phase,
fällt das nicht auf –
switch_on_timer_expired()schaltet dann sauber ineinem Schritt auf 3 Phasen hoch. Stand die Hardware aber noch auf 3 Phasen
(z. B. Restzustand vom vorherigen Ladevorgang), wird durch das erzwungene
phases = 1unnötig auf 1 Phase heruntergeschaltet, bevor dieÜberschussprüfung überhaupt zum Zug kommt. Diese Umschaltung setzt den
Zeitstempel für die Umschaltverzögerung zurück, wodurch anschließend die
volle Pufferzeit (Standard 7 Minuten) erneut abgewartet werden muss, bevor
wieder auf 3 Phasen hochgeschaltet wird – das ist der eigentliche Bug, und er
tritt nur bei dieser Vorbedingung auf.
Konkret beobachtet: Ladepunkt wurde gestartet, obwohl bereits ausreichend
PV-Überschuss vorhanden war. Es folgte dennoch eine unnötige Umschaltung
3→1 Phase und danach eine Statusmeldung "Umschaltung von 1 auf 3 Phasen in
7 Min. 41 Sek.", bevor tatsächlich mehrphasig geladen wurde.
references #3496 (comment)