Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 19 additions & 5 deletions packages/control/chargepoint/chargepoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from control.ev.charge_template import ChargeTemplate
from control.ev.ev import Ev
from control import phase_switch
from control.chargepoint.chargepoint_state import CHARGING_STATES, ChargepointState
from control.chargepoint.chargepoint_state import CHARGING_STATES, ChargepointState, PHASE_SWITCH_STATES
from control.limiting_value import loadmanagement_limit_factory
from control.load_protocol import Load
from control.text import BidiState
Expand Down Expand Up @@ -232,10 +232,24 @@ def set_control_parameter(self, submode: Chargemode):
self.data.control_parameter.chargemode = Chargemode.TIME_CHARGING
else:
self.data.control_parameter.chargemode = self.data.set.charge_template.data.chargemode.selected
if self.template.data.charging_type == ChargingType.AC.value:
self.data.control_parameter.min_current = self.data.set.charging_ev_data.ev_template.data.min_current
else:
self.data.control_parameter.min_current = self.data.set.charging_ev_data.ev_template.data.dc_min_current
# min_current nicht während laufender Phasenumschaltung ändern: auto_phase_switch() berechnet die
# reservierte Leistung jeden Zyklus neu daraus, ein Wechsel mittendrin würde reserved_surplus verfälschen.
if self.data.control_parameter.state not in PHASE_SWITCH_STATES:
if self.template.data.charging_type == ChargingType.AC.value:
self.data.control_parameter.min_current = (
self.data.set.charging_ev_data.ev_template.data.min_current)
else:
self.data.control_parameter.min_current = (
self.data.set.charging_ev_data.ev_template.data.dc_min_current)
# Mindest-SoC-Ladestrom statt allgemeinem Mindeststrom als Untergrenze, sonst würde bei
# automatischer Rückschaltung auf 1 Phase unterhalb des Mindest-SoC-Ladestroms geladen.
pv_charging = self.data.set.charge_template.data.chargemode.pv_charging
soc = self.data.set.charging_ev_data.data.get.soc
if (self.data.control_parameter.chargemode == Chargemode.PV_CHARGING and
pv_charging.min_soc != 0 and soc is not None and soc < pv_charging.min_soc):
self.data.control_parameter.min_current = (
pv_charging.min_soc_current if self.template.data.charging_type == ChargingType.AC.value
else pv_charging.dc_min_soc_current)
except Exception:
log.exception("Fehler im LP-Modul "+str(self.num))

Expand Down
84 changes: 84 additions & 0 deletions packages/control/chargepoint/chargepoint_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,3 +225,87 @@ def test_process_charge_stop_reset_manual_soc(soc_module: Optional[ConfigurableV
assert len(mock_pub.method_calls) - 1 == expected_calls
if expected_calls > 0:
assert mock_pub.method_calls[1].args == expected_pub_call


@pytest.mark.parametrize(
"chargemode_selected, min_soc, soc, charging_type, expected_min_current",
[
pytest.param(Chargemode.PV_CHARGING, 50, 30, ChargingType.AC.value, 16,
id="PV-Laden, unterhalb Mindest-SoC (AC): Mindest-SoC-Ladestrom als Untergrenze"),
pytest.param(Chargemode.PV_CHARGING, 50, 30, ChargingType.DC.value, 145,
id="PV-Laden, unterhalb Mindest-SoC (DC): Mindest-SoC-Ladestrom als Untergrenze"),
pytest.param(Chargemode.PV_CHARGING, 50, 80, ChargingType.AC.value, 6,
id="PV-Laden, Mindest-SoC bereits erreicht: allgemeiner Mindeststrom des Fahrzeugs"),
pytest.param(Chargemode.PV_CHARGING, 0, 30, ChargingType.AC.value, 6,
id="PV-Laden, Mindest-SoC deaktiviert: allgemeiner Mindeststrom des Fahrzeugs"),
pytest.param(Chargemode.PV_CHARGING, 50, None, ChargingType.AC.value, 6,
id="PV-Laden, kein SoC bekannt: allgemeiner Mindeststrom des Fahrzeugs"),
pytest.param(Chargemode.PV_CHARGING, 50, 80, ChargingType.DC.value, 100,
id="PV-Laden, Mindest-SoC bereits erreicht (DC): allgemeiner Mindeststrom des Fahrzeugs"),
pytest.param(Chargemode.INSTANT_CHARGING, 50, 30, ChargingType.AC.value, 6,
id="Sofortladen, Mindest-SoC-Werte vorhanden aber anderer Lademodus: unberührt"),
])
def test_set_control_parameter_min_soc_current_as_phase_switch_floor(
chargemode_selected, min_soc, soc, charging_type, expected_min_current, mock_data):
""" Mindest-SoC-Ladestrom statt allgemeinem Mindeststrom als Untergrenze für auto_phase_switch(). """
# setup
cp = Chargepoint(0, None)
cp.template = CpTemplate()
cp.template.data.charging_type = charging_type
ev = Ev(0)
ev.ev_template.data.min_current = 6
ev.ev_template.data.dc_min_current = 100
ev.data.get.soc = soc
cp.data.set.charging_ev_data = ev
cp.data.set.charge_template.data.chargemode.selected = chargemode_selected
cp.data.set.charge_template.data.chargemode.pv_charging.min_soc = min_soc
cp.data.set.charge_template.data.chargemode.pv_charging.min_soc_current = 16
cp.data.set.charge_template.data.chargemode.pv_charging.dc_min_soc_current = 145

# execution
cp.set_control_parameter(Chargemode.INSTANT_CHARGING)

# evaluation
assert cp.data.control_parameter.min_current == expected_min_current


@pytest.mark.parametrize(
"state",
[
pytest.param(ChargepointState.PHASE_SWITCH_DELAY, id="Umschaltverzögerung läuft"),
pytest.param(ChargepointState.PERFORMING_PHASE_SWITCH, id="Umschaltung wird gerade durchgeführt"),
pytest.param(ChargepointState.WAIT_FOR_USING_PHASES, id="wartet auf Nutzung der neuen Phasenzahl"),
])
def test_set_control_parameter_min_current_frozen_during_phase_switch(state, mock_data):
""" min_current darf sich während einer laufenden Phasenumschaltung nicht ändern, sonst verfälscht das
die reservierte Leistung in auto_phase_switch(). """
# setup
cp = Chargepoint(0, None)
cp.template = CpTemplate()
cp.template.data.charging_type = ChargingType.AC.value
ev = Ev(0)
ev.ev_template.data.min_current = 6
ev.data.get.soc = 30 # noch unterhalb Mindest-SoC beim Start der Umschaltung
cp.data.set.charging_ev_data = ev
cp.data.set.charge_template.data.chargemode.selected = Chargemode.PV_CHARGING
cp.data.set.charge_template.data.chargemode.pv_charging.min_soc = 50
cp.data.set.charge_template.data.chargemode.pv_charging.min_soc_current = 16

# Umschaltung auslösen, dabei greift die Mindest-SoC-Untergrenze
cp.set_control_parameter(Chargemode.INSTANT_CHARGING)
assert cp.data.control_parameter.min_current == 16

# Umschaltung läuft nun, Mindest-SoC wird währenddessen erreicht
cp.data.control_parameter.state = state
ev.data.get.soc = 60

# execution
cp.set_control_parameter(Chargemode.INSTANT_CHARGING)

# evaluation: min_current bleibt eingefroren, solange die Umschaltung läuft
assert cp.data.control_parameter.min_current == 16

# nach Abschluss der Umschaltung darf min_current wieder aktualisiert werden
cp.data.control_parameter.state = ChargepointState.CHARGING_ALLOWED
cp.set_control_parameter(Chargemode.INSTANT_CHARGING)
assert cp.data.control_parameter.min_current == 6
Original file line number Diff line number Diff line change
Expand Up @@ -1016,6 +1016,28 @@ export default {
>
Maximum
</i-button>
<i-button
:color="
mqttStore.getChargePointConnectedVehiclePvChargingMinSocPhases(
modalChargePointId,
) == 0
? 'primary'
: ''
"
:active="
mqttStore.getChargePointConnectedVehiclePvChargingMinSocPhases(
modalChargePointId,
) == 0
"
@click="
setChargePointConnectedVehiclePvChargingMinSocPhases(
modalChargePointId,
0,
)
"
>
Automatik
</i-button>
</i-button-group>
</i-form-group>
</i-form>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,10 @@
<RadioInput2
v-model="cp.pvMinSocPhases"
class="grid-col-1"
:columns="2"
:options="[
['1', 1],
['Maximum', 3],
['Auto', 0],
]"
/>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ const phaseOptions = [
const phaseOptionsMinSoc = [
{ value: 1, label: '1' },
{ value: 3, label: 'Maximum' },
{ value: 0, label: 'Automatik' },
];

const pvMinCurrent = computed(() =>
Expand Down
3 changes: 3 additions & 0 deletions packages/modules/web_themes/standard_legacy/web/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -955,6 +955,9 @@ <h3>Einstellungen für "PV"</h3>
<label class="btn btn-outline-info btn-toggle">
<input type="radio" name="phasesCp" data-option="3"> Maximum
</label>
<label class="btn btn-outline-info btn-toggle">
<input type="radio" name="phasesCp" data-option="0"> Automatik
</label>
</div>
</div>
</div>
Expand Down
Loading