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
3 changes: 1 addition & 2 deletions packages/control/algorithm/filter_chargepoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,7 @@ def _group_loads_by_chargemode(chargemodes: Tuple[Tuple[Optional[str], str]],
def get_loads_by_chargemodes(chargemodes: Tuple[Tuple[Optional[Chargemode], Chargemode]]) -> List[Load]:
def _is_valid_for_chargemode(entity, chargemode, valid):
"""Helper function to validate entity against chargemode conditions."""
return (entity.data.control_parameter.required_current != 0 and
(entity.data.control_parameter.chargemode == chargemode[0] or chargemode[0] is None) and
return ((entity.data.control_parameter.chargemode == chargemode[0] or chargemode[0] is None) and
entity.data.control_parameter.submode == chargemode[1] and
entity not in valid)

Expand Down
2 changes: 1 addition & 1 deletion packages/control/chargepoint/control_parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
class ControlParameter:
chargemode: Chargemode_enum = field(default=Chargemode_enum.STOP, metadata={
"topic": "control_parameter/chargemode"})
current_plan: Optional[str] = field(default=None, metadata={"topic": "control_parameter/current_plan"})
current_plan: Optional[int] = field(default=None, metadata={"topic": "control_parameter/current_plan"})
failed_phase_switches: int = field(default=0, metadata={"topic": "control_parameter/failed_phase_switches"})
limit: Optional[LoadmanagementLimit] = field(default_factory=loadmanagement_limit_factory, metadata={
"topic": "control_parameter/limit"})
Expand Down
346 changes: 191 additions & 155 deletions packages/control/consumer/consumer.py

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/control/consumer/consumer_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def get_consumer_sum(self):
self.data.get.exported = exported
self.data.get.fault_state = fault_state
self.data.get.fault_str = NO_ERROR if fault_state == 0 else (
"Bitte die Statusmeldungen der Wechselrichter prüfen. "
"Bitte die Statusmeldungen der Verbraucher prüfen. "
"Es haben nicht alle Module aktuelle Zählerstände geliefert.")
except Exception:
log.exception("Fehler in der allgemeinen Verbaucher-Klasse")
84 changes: 13 additions & 71 deletions packages/control/consumer/consumer_data.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
from dataclasses import dataclass, field
from enum import Enum
from typing import Callable, Dict, List, Optional, Union
from typing import List, Optional
from control.chargemode import Chargemode
from control.chargepoint.control_parameter import ControlParameter, control_parameter_factory
from control.consumer.usage import ConsumerUsage
from dataclass_utils.factories import empty_list_factory
from helpermodules.abstract_plans import (ContinuousScheduledPlanConsumer, SuspendableScheduledPlanConsumer,
TimeChargingPlanConsumer)
from helpermodules.abstract_plans import ScheduledPlanConsumer, TimeChargingPlanConsumer
from helpermodules.constants import NO_ERROR
from modules.common.consumer_setup import ConsumerSetup

Expand All @@ -17,13 +16,8 @@ class EcoCharging:


@dataclass
class ScheduledContinuousCharging:
plans: List[ContinuousScheduledPlanConsumer] = field(default_factory=empty_list_factory)


@dataclass
class ScheduledSuspendableCharging:
plans: List[SuspendableScheduledPlanConsumer] = field(default_factory=empty_list_factory)
class ScheduledCharging:
plans: List[ScheduledPlanConsumer] = field(default_factory=empty_list_factory)


@dataclass
Expand Down Expand Up @@ -58,67 +52,16 @@ class Log:


@dataclass
class MeterOnlyConfig:
type: ConsumerUsage = ConsumerUsage.METER_ONLY


@dataclass
class SuspendableTunableDeviceConfig:
class Usage:
chargemode: Chargemode = Chargemode.INSTANT_CHARGING
eco_charging: EcoCharging = field(default_factory=lambda: EcoCharging())
scheduled_charging: ScheduledSuspendableCharging = field(default_factory=lambda: ScheduledSuspendableCharging())
scheduled_charging: ScheduledCharging = field(default_factory=lambda: ScheduledCharging())
time_charging: TimeCharging = field(default_factory=lambda: TimeCharging())
type: ConsumerUsage = ConsumerUsage.SUSPENDABLE_TUNABLE
reset_chargemode: ResetChargemode = field(default_factory=lambda: ResetChargemode())
wait_for_start_active: bool = True


@dataclass
class SuspendableOnOffDeviceConfig:
chargemode: Chargemode = Chargemode.INSTANT_CHARGING
eco_charging: EcoCharging = field(default_factory=lambda: EcoCharging())
scheduled_charging: ScheduledSuspendableCharging = field(default_factory=lambda: ScheduledSuspendableCharging())
time_charging: TimeCharging = field(default_factory=lambda: TimeCharging())
type: ConsumerUsage = ConsumerUsage.SUSPENDABLE_ONOFF
type: ConsumerUsage = ConsumerUsage.METER_ONLY
reset_chargemode: ResetChargemode = field(default_factory=lambda: ResetChargemode())
wait_for_start_active: bool = True


@dataclass
class ContinuousDeviceConfig:
chargemode: Chargemode = Chargemode.INSTANT_CHARGING
eco_charging: EcoCharging = field(default_factory=lambda: EcoCharging())
scheduled_charging: ScheduledContinuousCharging = field(default_factory=lambda: ScheduledContinuousCharging())
time_charging: TimeCharging = field(default_factory=lambda: TimeCharging())
type: ConsumerUsage = ConsumerUsage.CONTINUOUS
wait_for_start_active: bool = True
reset_chargemode: ResetChargemode = field(default_factory=lambda: ResetChargemode())


GET_DEFAULTS_BY_USAGE: Dict[ConsumerUsage, Union[MeterOnlyConfig,
SuspendableTunableDeviceConfig,
SuspendableOnOffDeviceConfig,
ContinuousDeviceConfig]] = {
ConsumerUsage.METER_ONLY: MeterOnlyConfig(),
ConsumerUsage.SUSPENDABLE_TUNABLE: SuspendableTunableDeviceConfig(),
ConsumerUsage.SUSPENDABLE_ONOFF: SuspendableOnOffDeviceConfig(),
ConsumerUsage.CONTINUOUS: ContinuousDeviceConfig(),
}

GET_CLASS_BY_USAGE: Dict[ConsumerUsage, Callable] = {
ConsumerUsage.METER_ONLY: MeterOnlyConfig,
ConsumerUsage.SUSPENDABLE_TUNABLE: SuspendableTunableDeviceConfig,
ConsumerUsage.SUSPENDABLE_ONOFF: SuspendableOnOffDeviceConfig,
ConsumerUsage.CONTINUOUS: ContinuousDeviceConfig,
}

GET_PLAN_CLASS_FOR_USAGE: Dict[ConsumerUsage, Callable] = {
ConsumerUsage.SUSPENDABLE_TUNABLE: SuspendableScheduledPlanConsumer,
ConsumerUsage.SUSPENDABLE_ONOFF: SuspendableScheduledPlanConsumer,
ConsumerUsage.CONTINUOUS: ContinuousScheduledPlanConsumer,
}


@dataclass
class ConsumerConfig:
connected_phases: int = 1
Expand Down Expand Up @@ -155,25 +98,24 @@ class Set:
plug_time: Optional[float] = field(default=None, metadata={"topic": "set/plug_time"})
required_power: float = 0
current_prev: float = 0
state_str_prev: str = ""
target_current: float = 0
charge_state_prev: bool = False
log: Log = field(default_factory=lambda: Log())
on_time: float = field(default=0, metadata={"topic": "set/on_time"})
power: Optional[float] = None
switch_interval_elapsed: bool = False
timestamp_last_current_set: float = field(default=0, metadata={"topic": "set/timestamp_last_current_set"})
wait_for_start_state: WaitForStartStates = field(
default=WaitForStartStates.WAIT_FOR_DEVICE_START, metadata={"topic": "set/wait_for_start_state"})


@dataclass
class ConsumerData:
module: ConsumerSetup = None
config: ConsumerConfig = field(default_factory=lambda: ConsumerConfig())
extra_meter: Optional[int] = None
usage: Union[MeterOnlyConfig,
SuspendableTunableDeviceConfig,
SuspendableOnOffDeviceConfig,
ContinuousDeviceConfig] = field(default_factory=lambda: MeterOnlyConfig())
control_parameter: ControlParameter = field(default_factory=control_parameter_factory)
get: Get = field(default_factory=lambda: Get())
set: Set = field(default_factory=lambda: Set())
module: ConsumerSetup = None
config: ConsumerConfig = field(default_factory=lambda: ConsumerConfig())
extra_meter: Optional[int] = None
usage: Usage = field(default_factory=lambda: Usage(), metadata={"topic": "usage"})
6 changes: 3 additions & 3 deletions packages/control/consumer/consumer_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
from control import data
from control.chargemode import Chargemode
from control.consumer.consumer import Consumer
from control.consumer.consumer_data import ContinuousDeviceConfig, WaitForStartStates
from control.consumer.consumer_data import WaitForStartStates
from control.consumer.usage import ConsumerUsage


@pytest.fixture(autouse=True)
Expand All @@ -17,7 +18,7 @@ def mock_data() -> None:
@pytest.fixture
def consumer() -> Consumer:
load = Consumer(1)
load.data.usage = ContinuousDeviceConfig()
load.data.usage.type = ConsumerUsage.CONTINUOUS
load.data.config.min_current = 6
load.data.config.max_power = 2300
load.data.config.connected_phases = 1
Expand Down Expand Up @@ -106,7 +107,6 @@ def test_wait_for_start_handler(
func_calls: int,
):
# setup
assert isinstance(consumer.data.usage, ContinuousDeviceConfig)
consumer.data.usage.wait_for_start_active = wait_for_start_active
consumer.data.set.wait_for_start_state = state
consumer.data.get.charge_state = charge_state
Expand Down
Loading