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
6 changes: 4 additions & 2 deletions packages/control/chargelog/chargelog.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from control.chargemode import Chargemode
from modules.common.component_type import ComponentType
from helpermodules.utils.json_file_handler import write_and_check
from helpermodules import timecheck
import copy
Expand Down Expand Up @@ -32,7 +33,7 @@
# "id": 1,
# "name": "Auto",
# "chargemode": instant_charging,
# "prio": False,
# "prio": 2,
# "rfid": "123"
# "soc_at_start": 50,
# "soc_at_end": 60,
Expand Down Expand Up @@ -121,7 +122,8 @@ def collect_data(chargepoint):
log_data.soc_at_start = get_value_or_default(lambda: charging_ev.data.get.soc)

log_data.ev = get_value_or_default(lambda: chargepoint.data.set.charging_ev_data.num, 0)
log_data.prio = get_value_or_default(lambda: chargepoint.data.control_parameter.prio, False)
log_data.prio = get_value_or_default(
lambda: data.data.counter_all_data.get_loadmanagement_priority(ComponentType.VEHICLE, log_data.ev))
log_data.rfid = get_value_or_default(lambda: chargepoint.data.set.rfid)
log_data.odometer = get_value_or_default(lambda: charging_ev.data.get.odometer)
log_data.imported_since_mode_switch = get_value_or_default(
Expand Down
36 changes: 36 additions & 0 deletions packages/control/chargelog/priority_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from unittest.mock import Mock

import pytest

from control import data
from control.chargelog import chargelog
from control.chargepoint.chargepoint import Chargepoint
from control.ev.ev import Ev


@pytest.mark.parametrize("entries, expected", [
([{"type": "vehicle", "id": 9}], 1),
([{"type": "consumer", "id": 9}, {"type": "vehicle", "id": 9}], 2),
([{"type": "consumer", "id": 0}, {"type": "group", "children": [
{"type": "vehicle", "id": 1}, {"type": "vehicle", "id": 9}]}], 2),
([{"type": "vehicle", "id": 1}], None),
])
def test_collect_data_logs_shared_priority_rank(entries, expected, monkeypatch):
data.data_init(Mock())
data.data.counter_all_data.data.get.loadmanagement_prios = entries
cp = Chargepoint(4, None)
vehicle = Ev(9)
cp.data.set.charging_ev_data = vehicle
cp.data.get.plug_state = True
cp.data.get.charge_state = True
cp.data.get.imported = 1000
cp.data.get.exported = 0

chargelog.collect_data(cp)

assert cp.data.set.log.ev == 9
assert cp.data.set.log.prio == expected
assert cp.data.set.log.prio is None or type(cp.data.set.log.prio) is int
monkeypatch.setattr(chargelog, "calc_energy_costs", Mock())
entry = chargelog._create_entry(cp, vehicle)
assert entry["vehicle"]["prio"] == expected
10 changes: 0 additions & 10 deletions packages/control/chargelog/process_chargelog.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,16 +71,6 @@ def get_log_data(request: Dict):
(str(entry["vehicle"]["chargemode"]), str(request["filter"]["vehicle"]["chargemode"]))
)
continue
if (
"prio" in request["filter"]["vehicle"] and
request["filter"]["vehicle"]["prio"] is not entry["vehicle"]["prio"]
):
log.debug(
"Verwerfe Eintrag wegen Priorität: %s != %s" %
(str(entry["vehicle"]["prio"]), str(request["filter"]["vehicle"]["prio"]))
)
continue

# wenn wir hier ankommen, passt der Eintrag zum Filter
log_data["entries"].append(entry)
log_data["totals"] = get_totals_of_filtered_log_data(log_data)
Expand Down
3 changes: 1 addition & 2 deletions packages/control/chargepoint/chargepoint_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ class ConnectedConfig:
chargemode: Chargemode = Chargemode.STOP
current_plan: Optional[int] = 0
ev_template: int = 0
priority: bool = False
time_charging_in_use: bool = False


Expand Down Expand Up @@ -91,7 +90,7 @@ class Log:
timestamp_start_charging: Optional[float] = None
timestamp_mode_switch: Optional[float] = None
ev: int = -1
prio: bool = False
prio: Optional[int] = None
rfid: Optional[str] = None
serial_number: Optional[str] = None
soc_at_start: Optional[int] = None
Expand Down
2 changes: 2 additions & 0 deletions packages/control/counter_all/counter_all_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ def update_linked_counter_hierarchy(self,


class LoadmanagementPrioProtocol(Protocol):
def get_loadmanagement_priority(self, type: ComponentType, id: int) -> Optional[int]: ...

@property
def data(self) -> CounterAllData: ...
def add_loadmanagement_prio_item(self, type: ComponentType, id: int) -> None: ...
Expand Down
9 changes: 8 additions & 1 deletion packages/control/counter_all/loadmanagement_prio.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import logging
from typing import Dict, Generator, List, Tuple
from typing import Dict, Generator, List, Optional, Tuple

from control.chargepoint.chargepoint import Chargepoint
from control.consumer.usage import ConsumerUsage, NOT_CONTROLLED
Expand All @@ -11,6 +11,13 @@


class LoadmanagementPrioMixin:
def get_loadmanagement_priority(self: LoadmanagementPrioProtocol,
type: ComponentType, id: int) -> Optional[int]:
for rank, entry in enumerate(self.data.get.loadmanagement_prios, start=1):
if self._has_loadmanagement_prio_item(type, id, [entry]):
return rank
return None

def add_loadmanagement_prio_item(self: LoadmanagementPrioProtocol, type: ComponentType, id: int) -> None:
self.data.get.loadmanagement_prios.append({"type": type.value, "id": id})

Expand Down
1 change: 0 additions & 1 deletion packages/control/ev/charge_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ def chargemode_factory() -> Chargemode:
class ChargeTemplateData:
id: int = 0
name: str = "Lade-Profil"
prio: bool = False # OBSOLET seit 2.3.0
load_default: bool = False
time_charging: TimeCharging = field(default_factory=time_charging_factory)
chargemode: Chargemode = field(default_factory=chargemode_factory)
Expand Down
2 changes: 1 addition & 1 deletion packages/control/ev/ev.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
""" EV-Logik
ermittelt, den Ladestrom, den das EV gerne zur Verfügung hätte.

In den control Parametern wird sich der Lademodus, Submodus, Priorität, Phasen und Stromstärke gemerkt,
In den control Parametern werden Lademodus, Submodus, Phasen und Stromstärke gemerkt,
mit denen das EV aktuell in der Regelung berücksichtigt wird. Bei der Ermittlung der benötigten Strom-
stärke wird auch geprüft, ob sich an diesen Parametern etwas geändert hat. Falls ja, muss das EV
in der Regelung neu priorisiert werden und eine neue Zuteilung des Stroms erhalten.
Expand Down
2 changes: 1 addition & 1 deletion packages/helpermodules/data_migration/data_migration.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ def conv_1_9_datetimes(datetime_str):
"id": vehicle_id,
"name": vehicle_name,
"chargemode": chargemode,
"prio": False,
"prio": 2,
"rfid": rfid
},
"time":
Expand Down
2 changes: 0 additions & 2 deletions packages/helpermodules/setdata.py
Original file line number Diff line number Diff line change
Expand Up @@ -548,8 +548,6 @@ def process_control_parameter_topics(self, msg):
self._validate_value(msg, str)
elif "/control_parameter/limit" in msg.topic:
self._validate_value(msg, "json")
elif "/control_parameter/prio" in msg.topic:
self._validate_value(msg, bool)
elif "/control_parameter/current_plan" in msg.topic:
self._validate_value(msg, int)
elif ("/control_parameter/min_current" in msg.topic or
Expand Down
13 changes: 7 additions & 6 deletions packages/helpermodules/update_config_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -373,24 +373,25 @@ def test_upgrade_datastore_142_ev_chargemode_conversion(ev0_prio: bool,
ev0_charge_template = ChargeTemplate()
ev0_charge_template.data.id = 0
ev0_charge_template.data.chargemode.selected = ev0_chargemode
ev0_charge_template.data.prio = ev0_prio
ev1_charge_template = ChargeTemplate()
ev1_charge_template.data.id = 1
ev1_charge_template.data.chargemode.selected = ev1_chargemode
ev1_charge_template.data.prio = ev1_prio
ev2_charge_template = ChargeTemplate()
ev2_charge_template.data.id = 2
ev2_charge_template.data.chargemode.selected = ev2_chargemode
ev2_charge_template.data.prio = ev2_prio

uc = UpdateConfig()
uc.all_received_topics = {
"openWB/vehicle/0/charge_template": 0,
"openWB/vehicle/1/charge_template": 1,
"openWB/vehicle/2/charge_template": 2,
"openWB/vehicle/template/charge_template/0": dataclass_utils.asdict(ev0_charge_template.data),
"openWB/vehicle/template/charge_template/1": dataclass_utils.asdict(ev1_charge_template.data),
"openWB/vehicle/template/charge_template/2": dataclass_utils.asdict(ev2_charge_template.data),
# Historische Payloads behalten das damalige Prioritätsfeld unabhängig vom aktuellen Datenmodell.
"openWB/vehicle/template/charge_template/0": {
**dataclass_utils.asdict(ev0_charge_template.data), "prio": ev0_prio},
"openWB/vehicle/template/charge_template/1": {
**dataclass_utils.asdict(ev1_charge_template.data), "prio": ev1_prio},
"openWB/vehicle/template/charge_template/2": {
**dataclass_utils.asdict(ev2_charge_template.data), "prio": ev2_prio},
"openWB/system/datastore_version": [131, 132],
}

Expand Down
Loading