Skip to content
Merged
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
55 changes: 28 additions & 27 deletions packages/control/algorithm/additional_current.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import logging
from typing import List

from control.algorithm import common
from control.algorithm.chargemodes import CONSIDERED_CHARGE_MODES_ADDITIONAL_CURRENT
from control.limiting_value import LoadmanagementLimit
from control.load_protocol import Load
from control.loadmanagement import Loadmanagement
from control.algorithm.filter_chargepoints import (filtered_loads_to_str, get_grouped_loads_by_mode_and_counter,
from control.algorithm.filter_chargepoints import (filter_grouped_loads_by_mode_and_counter, filtered_loads_to_str,
get_preferenced_load_charging)

log = logging.getLogger(__name__)
Expand All @@ -16,33 +17,33 @@ class AdditionalCurrent:
def __init__(self) -> None:
pass

def set_additional_current(self) -> None:
common.reset_current_by_chargemode(CONSIDERED_CHARGE_MODES_ADDITIONAL_CURRENT)
def set_additional_current(self, grouped_loads: List[Load]) -> None:
common.reset_current_by_chargemode(grouped_loads, CONSIDERED_CHARGE_MODES_ADDITIONAL_CURRENT)
for counter in common.counter_generator():
preferenced_loads_groups, preferenced_loads_without_set_current = get_preferenced_load_charging(
get_grouped_loads_by_mode_and_counter(CONSIDERED_CHARGE_MODES_ADDITIONAL_CURRENT,
f"counter{counter.num}"))
for preferenced_loads in preferenced_loads_groups:
common.update_raw_data(preferenced_loads)
if len(preferenced_loads) > 0:
log.info(f"Zähler {counter.num}, Verbraucher {filtered_loads_to_str(preferenced_loads)}")
while len(preferenced_loads):
load = preferenced_loads[0]
missing_currents, counts = common.get_missing_currents_left(preferenced_loads)
available_currents, limit = Loadmanagement().get_available_currents(missing_currents, counter, load)
log.debug(f"load {load.num} available currents {available_currents} missing currents "
f"{missing_currents} limit {limit.message}")
load.data.control_parameter.limit = limit
available_for_cp = common.available_current_for_load(
load, counts, available_currents, missing_currents)
current = common.get_current_to_set(
load.data.set.current, available_for_cp, load.data.set.target_current)
self._set_loadmangement_message(current, limit, load)
common.set_current_counterdiff(
load.data.control_parameter.min_current,
current,
load)
preferenced_loads.pop(0)
preferenced_loads, preferenced_loads_without_set_current = get_preferenced_load_charging(
filter_grouped_loads_by_mode_and_counter(grouped_loads,
CONSIDERED_CHARGE_MODES_ADDITIONAL_CURRENT,
f"counter{counter.num}"))
common.update_raw_data(preferenced_loads)
if len(preferenced_loads) > 0:
log.info(f"Zähler {counter.num}, Verbraucher {filtered_loads_to_str(preferenced_loads)}")
while len(preferenced_loads):
load = preferenced_loads[0]
missing_currents, counts = common.get_missing_currents_left(preferenced_loads)
available_currents, limit = Loadmanagement().get_available_currents(missing_currents, counter, load)
log.debug(f"load {load.num} available currents {available_currents} missing currents "
f"{missing_currents} limit {limit.message}")
load.data.control_parameter.limit = limit
available_for_cp = common.available_current_for_load(
load, counts, available_currents, missing_currents)
current = common.get_current_to_set(
load.data.set.current, available_for_cp, load.data.set.target_current)
self._set_loadmangement_message(current, limit, load)
common.set_current_counterdiff(
load.data.control_parameter.min_current,
current,
load)
preferenced_loads.pop(0)
for load in preferenced_loads_without_set_current:
load.data.set.current = load.data.set.target_current

Expand Down
34 changes: 19 additions & 15 deletions packages/control/algorithm/algorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from control.algorithm import common
from control.algorithm.additional_current import AdditionalCurrent
from control.algorithm.bidi_charging import Bidi
from control.algorithm.filter_chargepoints import filtered_loads_to_str, group_loads_generator
from control.algorithm.min_current import MinCurrent
from control.algorithm.no_current import NoCurrent
from control.algorithm.surplus_controlled import SurplusControlled
Expand All @@ -31,21 +32,24 @@ def calc_current(self) -> None:
common.reset_current()
for cp in data.data.cp_data.values():
cp.reset_values_before_algorithm()
log.info("**Mindestrom setzen**")
self.min_current.set_min_current()
log.info("**Soll-Strom setzen**")
common.reset_current_to_target_current()
self.additional_current.set_additional_current()
self.surplus_controlled.set_required_current_to_max()
log.info("**PV-geführten Strom setzen**")
counter.limit_raw_power_left_to_surplus(self.evu_counter.calc_raw_surplus())
if self.evu_counter.data.set.surplus_power_left > 0:
common.reset_current_to_target_current()
self.surplus_controlled.set_surplus_current()
else:
log.info("Keine Leistung für PV-geführtes Laden übrig.")
log.info("**Bidi-(Ent-)Lade-Strom setzen**")
counter.set_raw_surplus_power_left()
for grouped_loads in group_loads_generator():
log.info(f"Gruppe {filtered_loads_to_str(grouped_loads)}")
log.info("**Mindestrom setzen**")
self.min_current.set_min_current(grouped_loads)
log.info("**Soll-Strom setzen**")
common.reset_current_to_target_current(grouped_loads)
self.additional_current.set_additional_current(grouped_loads)
self.surplus_controlled.set_required_current_to_max(grouped_loads)
log.info("**PV-geführten Strom setzen**")
counter.limit_raw_power_left_to_surplus(self.evu_counter.calc_raw_surplus())
if self.evu_counter.data.set.surplus_power_left > 0:
common.reset_current_to_target_current(grouped_loads)
self.surplus_controlled.set_surplus_current(grouped_loads)
Comment on lines +44 to +47
else:
log.info("Keine Leistung für PV-geführtes Laden übrig.")
log.info("**Bidi-(Ent-)Lade-Strom setzen**")
counter.set_raw_surplus_power_left()
# Nullpunktausregelung, nachdem für alle anderen Ladepunkte der Soll-Strom feststeht
self.bidi.set_bidi()
self.no_current.set_no_current()
self.no_current.set_none_current()
Expand Down
56 changes: 29 additions & 27 deletions packages/control/algorithm/bidi_charging.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
from control import data
from control.chargemode import Chargemode
from control.algorithm.chargemodes import CONSIDERED_CHARGE_MODES_BIDI_DISCHARGE
from control.algorithm.filter_chargepoints import filtered_loads_to_str, get_loads_by_chargemodes
from control.algorithm.filter_chargepoints import (
filter_loads_by_chargemodes, filtered_loads_to_str, group_loads_generator)
from control.chargepoint.chargepoint import Chargepoint
from helpermodules.phase_handling import voltages_mean

Expand Down Expand Up @@ -33,43 +34,44 @@ def set_bidi(self):

# CPs nach Modus filtern, dann verfügbare Ströme gegen alle relevanten Counter-Limits begrenzen.
# -> Um bei mehreren Bidi-CPs das Entladen bei der Nullpunktanpassung gleichmäßig zu verteilen
preferenced_cps = get_loads_by_chargemodes(CONSIDERED_CHARGE_MODES_BIDI_DISCHARGE)
if preferenced_cps:
log.info(f"Verbraucher {filtered_loads_to_str(preferenced_cps)}")
while len(preferenced_cps):
cp: Chargepoint = preferenced_cps[0]
for grouped_loads in group_loads_generator():
preferenced_cps = filter_loads_by_chargemodes(grouped_loads, CONSIDERED_CHARGE_MODES_BIDI_DISCHARGE)
Comment on lines +37 to +38
if preferenced_cps:
log.info(f"Verbraucher {filtered_loads_to_str(preferenced_cps)}")
while len(preferenced_cps):
cp: Chargepoint = preferenced_cps[0]

counts = self.get_counts(cp)
counts = self.get_counts(cp)

cp.data.set.target_current = 0
cp.data.set.target_current = 0

missing_currents = self.get_missing_currents(preferenced_cps, grid_counter)
log.debug(f"Bidi-LP{cp.num}: missing currents {missing_currents}A")
missing_currents = self.get_missing_currents(preferenced_cps, grid_counter)
log.debug(f"Bidi-LP{cp.num}: missing currents {missing_currents}A")

counters = data.data.counter_all_data.get_counters_to_check(cp.num)
for counter in counters:
available_currents, limit = Loadmanagement().get_available_currents_bidi(
missing_currents, voltages_mean(cp.data.get.voltages), data.data.counter_data[counter])
counters = data.data.counter_all_data.get_counters_to_check(cp.num)
for counter in counters:
available_currents, limit = Loadmanagement().get_available_currents_bidi(
missing_currents, voltages_mean(cp.data.get.voltages), data.data.counter_data[counter])

if limit.limiting_value is not None:
cp.data.control_parameter.limit = limit
if limit.limiting_value is not None:
cp.data.control_parameter.limit = limit

available_for_cp = common.available_current_for_load(
cp, counts, available_currents, missing_currents, bidi_mode=True)
available_for_cp = common.available_current_for_load(
cp, counts, available_currents, missing_currents, bidi_mode=True)

# Der neue Strom darf nicht höher als der bisher gesetzte Strom sein
current = common.get_current_to_set(
cp.data.set.current, available_for_cp, cp.data.set.target_current)
# Der neue Strom darf nicht höher als der bisher gesetzte Strom sein
current = common.get_current_to_set(
cp.data.set.current, available_for_cp, cp.data.set.target_current)

cp.data.set.current = current
log.info(f"LP{cp.num}: Stromstärke {current}A")
cp.data.set.current = current
log.info(f"LP{cp.num}: Stromstärke {current}A")

# Ausgabe LIMIT-MSG
self._set_loadmangement_message(current, limit, cp)
# Ausgabe LIMIT-MSG
self._set_loadmangement_message(current, limit, cp)

common.set_current_counterdiff(cp.data.set.target_current, current, cp, surplus=True)
common.set_current_counterdiff(cp.data.set.target_current, current, cp, surplus=True)

preferenced_cps.pop(0)
preferenced_cps.pop(0)

def _set_loadmangement_message(self,
current: float,
Expand Down
10 changes: 5 additions & 5 deletions packages/control/algorithm/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from typing import Iterable, List, Optional, Tuple

from control import data
from control.algorithm.filter_chargepoints import get_loads_by_chargemodes
from control.algorithm.filter_chargepoints import filter_loads_by_chargemodes
from control.algorithm.utils import get_medium_charging_current
from control.chargepoint.chargepoint import Chargepoint
from control.counter import Counter
Expand All @@ -29,8 +29,8 @@ def reset_current():
log.exception(f"Fehler im Algorithmus-Modul für {get_load_str(load)}")


def reset_current_by_chargemode(chargemodes: Tuple[Tuple[Optional[str], str]]) -> None:
for load in get_loads_by_chargemodes(chargemodes):
def reset_current_by_chargemode(grouped_loads: List[Load], chargemodes: Tuple[Tuple[Optional[str], str]]) -> None:
for load in filter_loads_by_chargemodes(grouped_loads, chargemodes):
load.data.set.current = None


Expand Down Expand Up @@ -226,11 +226,11 @@ def get_missing_currents_left(preferenced_loads: List[Load]) -> Tuple[List[float
return missing_currents, counts


def reset_current_to_target_current():
def reset_current_to_target_current(grouped_loads: List[Load]):
"""target_current enthält die gesetzte Stromstärke der vorherigen Stufe. Notwendig, um zB bei der
Mindeststromstärke erkennen zu können, ob diese ein vom LM begrenzter Strom aus Stufe 2 oder der Mindeststrom
aus Stufe 1 ist."""
for load in (list(data.data.cp_data.values()) + list(data.data.consumer_data.values())):
for load in grouped_loads:
try:
load.data.set.target_current = load.data.set.current
except Exception:
Expand Down
Loading
Loading