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
21 changes: 18 additions & 3 deletions packages/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,12 @@ def data_() -> None:
store=Mock(spec=LoggingValueStore,
delegate=Mock(spec=LoggingValueStore,
state=ChargepointState(currents=[30, 0, 0],
power=6900))))),
power=6900,
plug_state=False,
charge_state=False,
imported=None,
exported=None,
phases_in_use=0))))),
"cp4": Mock(spec=Chargepoint, data=Mock(spec=ChargepointData,
config=Mock(spec=Config, phase_1=2),
get=Mock(spec=Get, currents=[0, 15, 15], power=6900,
Expand All @@ -138,7 +143,12 @@ def data_() -> None:
store=Mock(spec=LoggingValueStore,
delegate=Mock(spec=LoggingValueStore,
state=ChargepointState(currents=[0, 15, 15],
power=6900))))),
power=6900,
plug_state=False,
charge_state=False,
imported=None,
exported=None,
phases_in_use=0))))),
"cp5": Mock(spec=Chargepoint, data=Mock(spec=ChargepointData,
config=Mock(spec=Config, phase_1=3),
get=Mock(spec=Get, currents=[10]*3, power=6900,
Expand All @@ -149,7 +159,12 @@ def data_() -> None:
store=Mock(spec=LoggingValueStore,
delegate=Mock(spec=LoggingValueStore,
state=ChargepointState(currents=[10]*3,
power=6900)))))}
power=6900,
plug_state=False,
charge_state=False,
imported=None,
exported=None,
phases_in_use=0)))))}
data.data.bat_data.update({"bat2": Mock(spec=Bat, num=2, data=Mock(spec=BatData, get=Mock(
spec=BatGet, power=-5000, daily_imported=7000, daily_exported=3000, imported=12000, exported=10000,
currents=None, fault_state=0),
Expand Down
5 changes: 4 additions & 1 deletion packages/control/bat_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,10 @@ def calc_power_for_all_components(self):
for battery in data.data.bat_data.values():
try:
if battery.data.get.fault_state < 2:
power += battery.data.get.power
try:
power += battery.data.get.power
except Exception:
log.exception(f"Fehler im Bat-Modul {battery.num}")
imported += battery.data.get.imported
exported += battery.data.get.exported
soc_sum += battery.data.get.soc
Expand Down
13 changes: 7 additions & 6 deletions packages/control/chargepoint/chargepoint_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,14 @@ def get_cp_sum(self):
"""
imported, exported, power = 0, 0, 0
try:
for cp in data.data.cp_data:
for cp in data.data.cp_data.values():
try:
imported = imported + cp.data.get.imported
exported = exported + cp.data.get.exported
except Exception:
log.exception("Fehler in der allgemeinen Ladepunkt-Klasse für Ladepunkt "+cp)
try:
if "cp" in cp:
chargepoint = data.data.cp_data[cp]
power = power + chargepoint.data.get.power
imported = imported + chargepoint.data.get.imported
exported = exported + chargepoint.data.get.exported
power = power + cp.data.get.power
except Exception:
log.exception("Fehler in der allgemeinen Ladepunkt-Klasse für Ladepunkt "+cp)
self.data.get.power = power
Expand Down
39 changes: 20 additions & 19 deletions packages/control/pv_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,27 +58,28 @@ def calc_power_for_all_components(self) -> None:
exported = 0
power = 0
fault_state = 0
for module in data.data.pv_data:
for module in data.data.pv_data.values():
try:
if "pv" in module:
module_data = data.data.pv_data[module].data
if module_data.get.fault_state < 2:
power += module_data.get.power
exported += module_data.get.exported
else:
if fault_state < module_data.get.fault_state:
fault_state = module_data.get.fault_state
limit_value = data.data.io_actions.stepwise_control(data.data.pv_data[module].num)
if limit_value is not None and data.data.pv_data[module].data.get.fault_state == 0:
msg = (
f"Leistung begrenzt auf {int(limit_value * 100)}%"
if limit_value < 1
else "Keine Leistungsbegrenzung aktiv."
)
data.data.pv_data[module].data.get.fault_str = msg
Pub().pub(f"openWB/set/pv/{data.data.pv_data[module].num}/get/fault_str", msg)
if module.data.get.fault_state < 2:
try:
power += module.data.get.power
except Exception:
log.exception(f"Fehler im allgemeinen PV-Modul für pv{module.num}")
exported += module.data.get.exported
else:
if fault_state < module.data.get.fault_state:
fault_state = module.data.get.fault_state
limit_value = data.data.io_actions.stepwise_control(module.num)
if limit_value is not None and module.data.get.fault_state == 0:
msg = (
f"Leistung begrenzt auf {int(limit_value * 100)}%"
if limit_value < 1
else "Keine Leistungsbegrenzung aktiv."
)
module.data.get.fault_str = msg
Pub().pub(f"openWB/set/pv/{module.num}/get/fault_str", msg)
except Exception:
log.exception("Fehler im allgemeinen PV-Modul für "+str(module))
log.exception(f"Fehler im allgemeinen PV-Modul für pv{module.num}")
if fault_state == 0:
self.data.get.exported = exported
Pub().pub("openWB/set/pv/get/exported", self.data.get.exported)
Expand Down
1 change: 1 addition & 0 deletions packages/helpermodules/utils/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
from helpermodules.utils._get_default import get_default
from helpermodules.utils._thread_handler import joined_thread_handler, thread_handler
from helpermodules.utils.processing_counter import ProcessingCounter
6 changes: 6 additions & 0 deletions packages/helpermodules/utils/_get_default.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import inspect


def get_default(cls, param):
sig = inspect.signature(cls.__init__)
return sig.parameters[param].default
64 changes: 35 additions & 29 deletions packages/modules/chargepoints/external_openwb/chargepoint_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from control import data
from helpermodules import pub, timecheck
from helpermodules.broker import BrokerClient
from helpermodules.utils import get_default
from helpermodules.utils.error_handling import CP_ERROR, ErrorTimerContext
from helpermodules.utils.topic_parser import decode_payload
from modules.chargepoints.external_openwb.config import OpenWBSeries
Expand Down Expand Up @@ -44,6 +45,8 @@ def set_current(self, current: float) -> None:
hostname=self.config.configuration.ip_address)

def get_values(self) -> None:
def parse_received_topics(value: str):
return received_topics.get(f"{topic_prefix}{value}", get_default(ChargepointState, value))
with SingleComponentUpdateContext(self.fault_state):
with self.client_error_context:
ip_address = self.config.configuration.ip_address
Expand Down Expand Up @@ -81,35 +84,38 @@ def on_message(client, userdata, message):
if received_topics:
log.debug(f"Empfange MQTT Daten für Ladepunkt {self.config.id}: {received_topics}")
topic_prefix = f"openWB/internal_chargepoint/{self.config.configuration.duo_num}/get/"
chargepoint_state = ChargepointState(
power=received_topics.get(f"{topic_prefix}power"),
phases_in_use=received_topics.get(f"{topic_prefix}phases_in_use"),
imported=received_topics.get(f"{topic_prefix}imported"),
exported=received_topics.get(f"{topic_prefix}exported"),
serial_number=received_topics.get(f"{topic_prefix}serial_number"),
powers=received_topics.get(f"{topic_prefix}powers"),
voltages=received_topics.get(f"{topic_prefix}voltages"),
currents=received_topics.get(f"{topic_prefix}currents"),
power_factors=received_topics.get(f"{topic_prefix}power_factors"),
plug_state=received_topics.get(f"{topic_prefix}plug_state"),
charge_state=received_topics.get(f"{topic_prefix}charge_state"),
rfid=received_topics.get(f"{topic_prefix}rfid"),
rfid_timestamp=received_topics.get(f"{topic_prefix}rfid_timestamp"),
frequency=received_topics.get(f"{topic_prefix}frequency"),
soc=received_topics.get(f"{topic_prefix}soc"),
soc_timestamp=received_topics.get(f"{topic_prefix}soc_timestamp"),
vehicle_id=received_topics.get(f"{topic_prefix}vehicle_id"),
evse_current=received_topics.get(f"{topic_prefix}evse_current"),
max_evse_current=received_topics.get(f"{topic_prefix}max_evse_current"),
version=received_topics.get(f"{topic_prefix}version"),
current_branch=received_topics.get(f"{topic_prefix}current_branch"),
current_commit=received_topics.get(f"{topic_prefix}current_commit")
)
self.store.set(chargepoint_state)
if received_topics.get(f"{topic_prefix}fault_state") == 2:
self.fault_state.error(received_topics.get(f"{topic_prefix}fault_str"))
elif received_topics.get(f"{topic_prefix}fault_state") == 1:
self.fault_state.warning(received_topics.get(f"{topic_prefix}fault_str"))
try:
chargepoint_state = ChargepointState(
power=received_topics[f"{topic_prefix}power"],
phases_in_use=received_topics[f"{topic_prefix}phases_in_use"],
imported=received_topics[f"{topic_prefix}imported"],
exported=received_topics[f"{topic_prefix}exported"],
serial_number=parse_received_topics("serial_number"),
powers=parse_received_topics("powers"),
voltages=parse_received_topics("voltages"),
currents=received_topics[f"{topic_prefix}currents"],
power_factors=parse_received_topics("power_factors"),
plug_state=received_topics[f"{topic_prefix}plug_state"],
charge_state=received_topics[f"{topic_prefix}charge_state"],
rfid=parse_received_topics("rfid"),
rfid_timestamp=parse_received_topics("rfid_timestamp"),
frequency=parse_received_topics("frequency"),
soc=parse_received_topics("soc"),
soc_timestamp=parse_received_topics("soc_timestamp"),
vehicle_id=parse_received_topics("vehicle_id"),
evse_current=parse_received_topics("evse_current"),
max_evse_current=parse_received_topics("max_evse_current"),
version=parse_received_topics("version"),
current_branch=parse_received_topics("current_branch"),
current_commit=parse_received_topics("current_commit")
)
self.store.set(chargepoint_state)
if received_topics[f"{topic_prefix}fault_state"] == 2:
self.fault_state.error(received_topics[f"{topic_prefix}fault_str"])
elif received_topics[f"{topic_prefix}fault_state"] == 1:
self.fault_state.warning(received_topics[f"{topic_prefix}fault_str"])
except KeyError:
raise KeyError("Es wurden nicht alle notwendigen Daten empfangen.")
else:
self.fault_state.warning(f"Keine MQTT-Daten für Ladepunkt {self.config.name} empfangen. Noch keine "
"Daten nach dem Start oder Ladepunkt nicht erreichbar.")
Expand Down
Loading