Skip to content

Consumer: voltages/currents bei Änderung von connected_phases - #4071

Merged
LKuemmel merged 5 commits into
openWB:masterfrom
seaspotter:fix-consumer-stale-phase-values
Oct 9, 2026
Merged

LKuemmel merged 5 commits into
openWB:masterfrom
seaspotter:fix-consumer-stale-phase-values

Conversation

@seaspotter

Copy link
Copy Markdown
Collaborator

#3908 (comment)

voltages/currents eines Verbrauchers wurden bisher nur einmalig (bei None) berechnet und immer ab Index 0 befüllt - unabhängig von connected_phases und phase_1.

  • Die Neuberechnung lief nur beim allerersten Mal (is None). Wurde connected_phases später geändert (zB 3 auf 1 Phase), blieb das alte, zu lange Array stehen.

voltages/currents sind jetzt immer 3 Elemente lang, der Wert liegt am über phase_1 korrekt gemappten EVU-Index. Neuberechnung erfolgt, sobald sich connected_phases oder phase_1 vom zuletzt berechneten Zustand unterscheiden, nicht mehr nur einmalig.

…e_1 neu berechnen

Wurden bisher nur einmalig (bei None) berechnet und immer ab Index 0 befüllt.
Änderte sich connected_phases oder phase_1 nachträglich, blieb das alte Array
mit falscher Länge bzw. falschem Index stehen - das zeigte in der Modulübersicht
Werte für nicht mehr angeschlossene Phasen an und passte nicht mehr zum
phasenkorrekten required_currents aus set_control_parameter().
@seaspotter
seaspotter requested a review from LKuemmel October 8, 2026 09:46
Comment thread packages/control/consumer/consumer.py Outdated
Comment on lines +51 to +68
# Index wie required_currents in set_control_parameter() am EVU-Phasen-Index ausrichten, nicht an 0.
try:
connected_evu_phases = {
convert_single_evu_phase_to_cp_phase(self.data.config.phase_1, i)
for i in range(0, self.data.config.connected_phases)}
except KeyError:
connected_evu_phases = set(range(0, self.data.config.connected_phases))
# neu berechnen, wenn sich connected_phases oder phase_1 geändert haben, nicht nur bei None
phase_config_changed = (self.data.get.voltages is None or
len(self.data.get.voltages) != 3 or
{i for i, v in enumerate(self.data.get.voltages) if v} != connected_evu_phases)
if phase_config_changed:
self.data.get.voltages = [230 if i in connected_evu_phases else 0 for i in range(3)]
if self.data.get.currents is None or phase_config_changed:
self.data.get.currents = [
(self.data.get.power / self.data.config.connected_phases / self.data.get.voltages[i])
if i in connected_evu_phases else 0
for i in range(3)]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die Phasenverdrehung macht das Lastmanagement. Wenn ein Verbraucher seine Ströme selbst misst, fängt er üblicherweise intern auf L1 an.
Es müsste so sein:

Suggested change
# Index wie required_currents in set_control_parameter() am EVU-Phasen-Index ausrichten, nicht an 0.
try:
connected_evu_phases = {
convert_single_evu_phase_to_cp_phase(self.data.config.phase_1, i)
for i in range(0, self.data.config.connected_phases)}
except KeyError:
connected_evu_phases = set(range(0, self.data.config.connected_phases))
# neu berechnen, wenn sich connected_phases oder phase_1 geändert haben, nicht nur bei None
phase_config_changed = (self.data.get.voltages is None or
len(self.data.get.voltages) != 3 or
{i for i, v in enumerate(self.data.get.voltages) if v} != connected_evu_phases)
if phase_config_changed:
self.data.get.voltages = [230 if i in connected_evu_phases else 0 for i in range(3)]
if self.data.get.currents is None or phase_config_changed:
self.data.get.currents = [
(self.data.get.power / self.data.config.connected_phases / self.data.get.voltages[i])
if i in connected_evu_phases else 0
for i in range(3)]
if self.data.get.voltages == [230.0]*3:
self.data.get.voltages = [230 if i < self.data.config.connected_phases else 0 for i in range(0, self.data.config.connected_phases)]
if self.data.get.currents == [0]*3:
for i in range(0, self.data.config.connected_phases):
self.data.get.currents[i] = (self.data.get.power /
self.data.config.connected_phases /
self.data.get.voltages[i])

Bin jetzt auch drüber gestolpert. Die Default-Werte in der consumer.py müssen analog zu den Zählern und Ladepunkten so sein:
currents: List[float] = field(default_factory=currents_list_factory) und voltages: List[float] = field(default_factory=voltages_list_factory)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Habs mal so umgebaut, passts so für dich?

Comment thread packages/control/consumer/consumer.py Outdated
seaspotter and others added 3 commits October 9, 2026 14:37
@LKuemmel
LKuemmel merged commit c477f77 into openWB:master Oct 9, 2026
1 check passed
@seaspotter
seaspotter deleted the fix-consumer-stale-phase-values branch October 9, 2026 14:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants