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
2 changes: 1 addition & 1 deletion packages/control/algorithm/filter_chargepoints_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def mock_consumer3() -> Consumer:
{"type": "vehicle", "id": 2}],
[1, 3, 2], id="required current 0 for cp 1"),
])
def test_get_loadmanagement_prios(
def test_get_loads_by_chargemodes(
required_current_1: int,
ev_1: int,
chargemode_filter: Tuple[Tuple[Optional[Chargemode], Chargemode]],
Expand Down
21 changes: 18 additions & 3 deletions packages/control/algorithm/integration_test/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,20 @@
from control.bat_all import BatAll
from control.chargepoint.chargepoint import Chargepoint
from control.chargepoint.chargepoint_template import CpTemplate
from control.consumer.consumer import Consumer
from control.counter_all.counter_all import CounterAll
from control.counter import Counter
from control.ev.ev import Ev
from control.io_device import IoActions
from control.pv import Pv
from control.chargepoint.chargepoint_state import ChargepointState
from test_utils.default_hierarchies import NESTED_HIERARCHY


@pytest.fixture(autouse=True)
def data_() -> None:
data.data_init(Mock())
data.data.consumer_data.update({"consumer7": Consumer(7)})
data.data.consumer_data["consumer7"].data.get.voltages = [230]*3
data.data.cp_data = {
"cp3": Chargepoint(3, None),
"cp4": Chargepoint(4, None),
Expand Down Expand Up @@ -50,12 +52,22 @@ def data_() -> None:
data.data.counter_data["counter6"].data.config.max_currents = [16]*3
data.data.counter_data["counter6"].data.config.max_total_power = 11000
data.data.counter_all_data = CounterAll()
data.data.counter_all_data.data.get.hierarchy = NESTED_HIERARCHY
data.data.counter_all_data.data.get.hierarchy = [{"id": 0, "type": "counter",
"children": [
{"id": 3, "type": "cp", "children": []},
{"id": 7, "type": "consumer", "children": []},
{"id": 6, "type": "counter",
"children": [
{"id": 4, "type": "cp", "children": []},
{"id": 5, "type": "cp", "children": []}]},
{"id": 1, "type": "inverter", "children": []},
{"id": 2, "type": "bat", "children": []}]}]
data.data.counter_all_data.data.get.loadmanagement_prios = [{
"type": "group",
"label": "Fahrzeuge",
"children": [
{"type": "vehicle", "id": 3}, {"type": "vehicle", "id": 4}, {"type": "vehicle", "id": 5}
{"type": "vehicle", "id": 3}, {"type": "vehicle", "id": 4}, {
"type": "vehicle", "id": 5}, {"type": "consumer", "id": 7}
]
}]
data.data.counter_all_data.data.config.consider_less_charging = True
Expand All @@ -81,3 +93,6 @@ def all_cp_not_charging():
data.data.cp_data[f"cp{i}"].data.get.currents = [0]*3
data.data.cp_data[f"cp{i}"].data.get.charge_state = False
data.data.cp_data[f"cp{i}"].data.control_parameter.state = ChargepointState.NO_CHARGING_ALLOWED
data.data.consumer_data["consumer7"].data.get.currents = [0]*3
data.data.consumer_data["consumer7"].data.get.charge_state = False
data.data.consumer_data["consumer7"].data.control_parameter.state = ChargepointState.NO_CHARGING_ALLOWED
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ def all_cp_instant_charging_1p():
control_parameter.required_current = 16
control_parameter.chargemode = Chargemode.INSTANT_CHARGING
control_parameter.submode = Chargemode.INSTANT_CHARGING
control_parameter = data.data.consumer_data["consumer7"].data.control_parameter
control_parameter.min_current = 0.5
control_parameter.required_current = 0.5
control_parameter.required_currents = [0.5, 0, 0]
control_parameter.chargemode = Chargemode.INSTANT_CHARGING
control_parameter.submode = Chargemode.INSTANT_CHARGING


@pytest.fixture()
Expand Down Expand Up @@ -80,8 +86,9 @@ def test_start_instant_charging(all_cp_instant_charging_1p, all_cp_not_charging,
assert data.data.cp_data["cp3"].data.set.current == 10
assert data.data.cp_data["cp4"].data.set.current == 6
assert data.data.cp_data["cp5"].data.set.current == 6
assert data.data.counter_data["counter0"].data.set.raw_power_left == 16250
assert data.data.counter_data["counter0"].data.set.raw_currents_left == [22, 24, 25]
assert data.data.consumer_data["consumer7"].data.set.current == 0.5
assert data.data.counter_data["counter0"].data.set.raw_power_left == 16135
assert data.data.counter_data["counter0"].data.set.raw_currents_left == [21.5, 24, 25]
assert data.data.counter_data["counter6"].data.set.raw_currents_left == [16, 6, 8]


Expand Down
16 changes: 13 additions & 3 deletions packages/control/algorithm/integration_test/pv_charging_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ def all_cp_pv_charging_3p():
control_parameter.chargemode = Chargemode.PV_CHARGING
control_parameter.submode = Chargemode.PV_CHARGING
control_parameter.phases = 3
control_parameter = data.data.consumer_data["consumer7"].data.control_parameter
control_parameter.min_current = 0.5
control_parameter.required_current = 0.5
control_parameter.required_currents = [0.5, 0, 0]
control_parameter.phases = 1
control_parameter.chargemode = Chargemode.PV_CHARGING
control_parameter.submode = Chargemode.PV_CHARGING


@pytest.fixture()
Expand Down Expand Up @@ -115,7 +122,7 @@ def assert_counter_set(params: ParamsExpectedCounterSet):
def test_start_pv_delay(all_cp_pv_charging_3p, all_cp_not_charging, monkeypatch):
# alle 3 im PV-laden, keine Ladung -> bei zwei die Verzögerung starten, für den 3. reicht es nicht
# setup
data.data.counter_data["counter0"].data.set.raw_power_left = 31975
data.data.counter_data["counter0"].data.set.raw_power_left = 32090
data.data.counter_data["counter0"].data.set.raw_currents_left = [32, 30, 31]
data.data.counter_data["counter6"].data.set.raw_currents_left = [16, 12, 14]
data.data.counter_data["counter0"].data.set.reserved_surplus = 0
Expand All @@ -126,15 +133,18 @@ def test_start_pv_delay(all_cp_pv_charging_3p, all_cp_not_charging, monkeypatch)
# evaluation
for i in range(3, 6):
assert data.data.cp_data[f"cp{i}"].data.set.current == 0
assert data.data.consumer_data["consumer7"].data.set.current == 0
assert data.data.cp_data[
"cp3"].data.control_parameter.timestamp_switch_on_off is None
assert data.data.cp_data[
"cp4"].data.control_parameter.timestamp_switch_on_off == 1652683252.0
assert data.data.cp_data[
"cp5"].data.control_parameter.timestamp_switch_on_off == 1652683252.0
assert data.data.counter_data["counter0"].data.set.raw_power_left == 31975
assert data.data.consumer_data[
"consumer7"].data.control_parameter.timestamp_switch_on_off == 1652683252.0
assert data.data.counter_data["counter0"].data.set.raw_power_left == 32090
assert data.data.counter_data["counter0"].data.set.surplus_power_left == -690
assert data.data.counter_data["counter0"].data.set.reserved_surplus == 9000
assert data.data.counter_data["counter0"].data.set.reserved_surplus == 9115


def test_pv_delay_expired(all_cp_pv_charging_3p, all_cp_not_charging, monkeypatch):
Expand Down
1 change: 1 addition & 0 deletions packages/helpermodules/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

class DEFAULT_COLORS(Enum):
CHARGEPOINT = "#007bff"
CONSUMER = "#9C65FF"
VEHICLE = "#17a2b8"
INVERTER = "#28a745"
COUNTER = "#dc3545"
Expand Down
6 changes: 6 additions & 0 deletions packages/helpermodules/measurement_logging/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,18 @@
from control.chargepoint.chargepoint_all import AllChargepoints
from control import bat_all, counter, pv_all, pv
from control import data
from control.consumer.consumer import Consumer
from control.consumer.consumer_all import AllConsumers
from modules.consumers.generic.mqtt.config import Mqtt


@pytest.fixture(autouse=True)
def data_module() -> None:
data.data_init(Event())
data.data.bat_data.update({"all": bat_all.BatAll(), "bat2": Bat(2)})
data.data.consumer_all_data = AllConsumers()
data.data.consumer_data.update({"consumer6": Consumer(6)})
data.data.consumer_data["consumer6"].data.module = Mqtt()
data.data.counter_data.update({"counter0": counter.Counter(0)})
data.data.cp_all_data = AllChargepoints()
data.data.cp_data.update({"cp4": chargepoint.Chargepoint(
Expand Down
4 changes: 3 additions & 1 deletion packages/helpermodules/measurement_logging/process_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,7 @@ def add_monthly_log(month: str, check_next_month: bool = False) -> None:
log.debug(f"Keine Logdatei für Monat {next_month} gefunden, "
f"füge letzten Datensatz von {month} ein: {entries[-1]['date']}")
names.update(content["names"])
colors.update(content["colors"])
except FILE_ERRORS:
log.debug(f"Kein Log für Monat {month} gefunden.")

Expand All @@ -338,6 +339,7 @@ def add_daily_log(day: str) -> None:

entries = []
names = {}
colors = {}
dates = []

# we have to find a valid data range
Expand Down Expand Up @@ -378,7 +380,7 @@ def add_daily_log(day: str) -> None:
log.exception(f"Fehler beim Zusammenstellen der Jahresdaten für Monat {next_date}")

# return our data
return {"entries": entries, "names": names}
return {"entries": entries, "names": names, "colors": colors}


def _analyse_energy_source(data, calc_cp: Optional[str] = None) -> Dict:
Expand Down
17 changes: 14 additions & 3 deletions packages/helpermodules/measurement_logging/write_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,14 @@ def create_entry(log_type: LogType, sh_log_data: LegacySmartHomeLogData, previou
for counter in data.data.counter_data.values():
try:
home_consumption_source_id = data.data.counter_all_data.data.config.home_consumption_source_id
if (home_consumption_source_id is None or counter.num != home_consumption_source_id):
if home_consumption_source_id is not None and counter.num == home_consumption_source_id:
continue
skip_counter = False
for consumer in data.data.consumer_data:
if counter.num == data.data.consumer_data[consumer].data.extra_meter:
skip_counter = True
break
if skip_counter is False:
counter_dict.update(
{f"counter{counter.num}": {
"imported": counter.data.get.imported,
Expand Down Expand Up @@ -380,7 +387,7 @@ def get_names(elements: Dict, sh_names: Dict, valid_names: Optional[Dict] = None
"""
names = sh_names
for group in elements.items():
if group[0] not in ("bat", "counter", "cp", "pv", "ev", "sh"):
if group[0] not in ("bat", "consumer", "counter", "cp", "pv", "ev", "sh"):
continue
for entry in group[1]:
# valid_names wird aus update_config übergeben, da dort noch kein Zugriff auf data möglich ist
Expand All @@ -396,6 +403,8 @@ def get_names(elements: Dict, sh_names: Dict, valid_names: Optional[Dict] = None
try:
if "ev" in entry:
names.update({entry: data.data.ev_data[entry].data.name})
elif "consumer" in entry:
names.update({entry: data.data.consumer_data[entry].data.module.name})
elif "cp" in entry:
names.update({entry: data.data.cp_data[entry].data.config.name})
elif "all" != entry:
Expand All @@ -416,13 +425,15 @@ def get_colors(elements: Dict) -> Dict:
"""
colors = {}
for group in elements.items():
if group[0] not in ("ev", "cp", "counter", "pv", "bat"):
if group[0] not in ("ev", "cp", "counter", "consumer", "pv", "bat"):
continue
for entry in group[1]:
if "all" != entry:
try:
if "ev" in entry:
colors.update({entry: data.data.ev_data[entry].data.color})
elif "consumer" in entry:
colors.update({entry: data.data.consumer_data[entry].data.module.color})
elif "cp" in entry:
colors.update({entry: data.data.cp_data[entry].data.config.color})
else:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ def test_get_names(daily_log_totals, monkeypatch):

# evaluation
assert names == {'bat2': "Speicher",
"consumer6": "MQTT-Verbraucher",
'counter0': "Zähler",
'cp3': "cp3",
'cp4': "neuer Ladepunkt",
Expand Down
10 changes: 8 additions & 2 deletions packages/modules/common/consumer_setup.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from typing import Generic, List, TypeVar
from typing import Generic, Optional, TypeVar, Tuple

from control.consumer.usage import ConsumerUsage
from helpermodules.constants import DEFAULT_COLORS


T = TypeVar("T")
Expand All @@ -13,11 +14,16 @@ def __init__(self,
id: int,
vendor: str,
configuration: T,
usage: List[ConsumerUsage]) -> None:
usage: Tuple[ConsumerUsage, ...],
color: Optional[str] = None) -> None:
self.name = name
self.info = {"manufacturer": None, "model": None}
self.type = type
self.id = id
self.configuration = configuration
self.vendor = vendor
self.usage = usage
if color:
self.color = color
else:
self.color = DEFAULT_COLORS.CONSUMER.value
9 changes: 5 additions & 4 deletions packages/modules/consumers/askoma/askoheat/config.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import Optional, Tuple

from control.consumer.consumer_data import ConsumerUsage
from helpermodules.auto_str import auto_str
Expand All @@ -24,7 +24,8 @@ def __init__(self,
type: str = "askoheat",
id: int = 0,
configuration: AskoheatConfiguration = None,
usage: List[ConsumerUsage] = [ConsumerUsage.SUSPENDABLE_TUNABLE,
ConsumerUsage.METER_ONLY]) -> None:
usage: Tuple[ConsumerUsage, ...] = (ConsumerUsage.SUSPENDABLE_TUNABLE,
ConsumerUsage.METER_ONLY),
**kwargs) -> None:
super().__init__(name, type, id, vendor=vendor_descriptor.configuration_factory(
).type, configuration=configuration or AskoheatConfiguration(), usage=usage)
).type, configuration=configuration or AskoheatConfiguration(), usage=usage, **kwargs)
9 changes: 5 additions & 4 deletions packages/modules/consumers/avm/avm/config.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import Optional, Tuple

from control.consumer.consumer_data import ConsumerUsage
from helpermodules.auto_str import auto_str
Expand Down Expand Up @@ -30,7 +30,8 @@ def __init__(self,
type: str = "avm",
id: int = 0,
configuration: AvmConfiguration = None,
usage: List[ConsumerUsage] = [ConsumerUsage.SUSPENDABLE_TUNABLE,
ConsumerUsage.METER_ONLY]) -> None:
usage: Tuple[ConsumerUsage, ...] = (ConsumerUsage.SUSPENDABLE_TUNABLE,
ConsumerUsage.METER_ONLY),
**kwargs) -> None:
super().__init__(name, type, id, vendor=vendor_descriptor.configuration_factory(
).type, configuration=configuration or AvmConfiguration(), usage=usage)
).type, configuration=configuration or AvmConfiguration(), usage=usage, **kwargs)
7 changes: 4 additions & 3 deletions packages/modules/consumers/generic/dac/config.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import Optional, Tuple

from control.consumer.consumer_data import ConsumerUsage
from helpermodules.auto_str import auto_str
Expand Down Expand Up @@ -27,6 +27,7 @@ def __init__(self,
type: str = "dac",
id: int = 0,
configuration: DacConfiguration = None,
usage: List[ConsumerUsage] = [ConsumerUsage.SUSPENDABLE_TUNABLE]) -> None:
usage: Tuple[ConsumerUsage, ...] = (ConsumerUsage.SUSPENDABLE_TUNABLE,),
**kwargs) -> None:
super().__init__(name, type, id, vendor=vendor_descriptor.configuration_factory(
).type, configuration=configuration or DacConfiguration(), usage=usage)
).type, configuration=configuration or DacConfiguration(), usage=usage, **kwargs)
13 changes: 7 additions & 6 deletions packages/modules/consumers/generic/http/config.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import List
from typing import Tuple

from control.consumer.consumer_data import ConsumerUsage
from helpermodules.auto_str import auto_str
Expand Down Expand Up @@ -40,9 +40,10 @@ def __init__(self,
type: str = "http",
id: int = 0,
configuration: HttpConfiguration = None,
usage: List[ConsumerUsage] = [ConsumerUsage.METER_ONLY,
ConsumerUsage.CONTINUOUS,
ConsumerUsage.SUSPENDABLE_ONOFF,
ConsumerUsage.SUSPENDABLE_TUNABLE]) -> None:
usage: Tuple[ConsumerUsage, ...] = (ConsumerUsage.METER_ONLY,
ConsumerUsage.CONTINUOUS,
ConsumerUsage.SUSPENDABLE_ONOFF,
ConsumerUsage.SUSPENDABLE_TUNABLE),
**kwargs) -> None:
super().__init__(name, type, id, vendor=vendor_descriptor.configuration_factory(
).type, configuration=configuration or HttpConfiguration(), usage=usage)
).type, configuration=configuration or HttpConfiguration(), usage=usage, **kwargs)
13 changes: 7 additions & 6 deletions packages/modules/consumers/generic/json/config.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import List
from typing import Tuple

from control.consumer.consumer_data import ConsumerUsage
from helpermodules.auto_str import auto_str
Expand Down Expand Up @@ -40,9 +40,10 @@ def __init__(self,
type: str = "json",
id: int = 0,
configuration: JsonConfiguration = None,
usage: List[ConsumerUsage] = [ConsumerUsage.METER_ONLY,
ConsumerUsage.CONTINUOUS,
ConsumerUsage.SUSPENDABLE_ONOFF,
ConsumerUsage.SUSPENDABLE_TUNABLE]) -> None:
usage: Tuple[ConsumerUsage, ...] = (ConsumerUsage.METER_ONLY,
ConsumerUsage.CONTINUOUS,
ConsumerUsage.SUSPENDABLE_ONOFF,
ConsumerUsage.SUSPENDABLE_TUNABLE),
**kwargs) -> None:
super().__init__(name, type, id, vendor=vendor_descriptor.configuration_factory(
).type, configuration=configuration or JsonConfiguration(), usage=usage)
).type, configuration=configuration or JsonConfiguration(), usage=usage, **kwargs)
13 changes: 7 additions & 6 deletions packages/modules/consumers/generic/mqtt/config.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import List
from typing import Tuple

from control.consumer.consumer_data import ConsumerUsage
from helpermodules.auto_str import auto_str
Expand All @@ -19,9 +19,10 @@ def __init__(self,
type: str = "mqtt",
id: int = 0,
configuration: MqttConfiguration = None,
usage: List[ConsumerUsage] = [ConsumerUsage.METER_ONLY,
ConsumerUsage.CONTINUOUS,
ConsumerUsage.SUSPENDABLE_ONOFF,
ConsumerUsage.SUSPENDABLE_TUNABLE]) -> None:
usage: Tuple[ConsumerUsage, ...] = (ConsumerUsage.METER_ONLY,
ConsumerUsage.CONTINUOUS,
ConsumerUsage.SUSPENDABLE_ONOFF,
ConsumerUsage.SUSPENDABLE_TUNABLE),
**kwargs) -> None:
super().__init__(name, type, id, vendor=vendor_descriptor.configuration_factory(
).type, configuration=configuration or MqttConfiguration(), usage=usage)
).type, configuration=configuration or MqttConfiguration(), usage=usage, **kwargs)
Loading
Loading