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
5 changes: 3 additions & 2 deletions packages/control/chargepoint/chargepoint_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,9 @@ class Get:
current_branch: Optional[str] = None
current_commit: Optional[str] = None
currents: List[float] = field(default_factory=currents_list_factory)
daily_imported: float = 0
daily_exported: float = 0
daily_imported: float = field(default=0, metadata={"topic": "get/daily_imported"})
daily_exported: float = field(default=0, metadata={"topic": "get/daily_exported"})
error_code: Optional[int] = None
error_timestamp: Optional[int] = None
evse_current: Optional[float] = None
# kann auch zur Laufzeit geändert werden
Expand Down
17 changes: 9 additions & 8 deletions packages/control/pv.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,15 @@ def config_factory() -> Config:

@dataclass
class Get:
currents: List[float] = field(default_factory=currents_list_factory)
daily_exported: float = 0
monthly_exported: float = 0
yearly_exported: float = 0
exported: float = 0
fault_state: int = 0
fault_str: str = ""
power: float = 0
currents: List[float] = field(default_factory=currents_list_factory, metadata={
"topic": "get/currents"})
daily_exported: float = field(default=0, metadata={"topic": "get/daily_exported"})
monthly_exported: float = field(default=0, metadata={"topic": "get/monthly_exported"})
yearly_exported: float = field(default=0, metadata={"topic": "get/yearly_exported"})
exported: float = field(default=0, metadata={"topic": "get/exported"})
fault_state: int = field(default=0, metadata={"topic": "get/fault_state"})
fault_str: str = field(default="", metadata={"topic": "get/fault_str"})
power: float = field(default=0, metadata={"topic": "get/power"})


def get_factory() -> Get:
Expand Down
35 changes: 17 additions & 18 deletions packages/control/pv_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,18 @@
der sonst in das Netz eingespeist werden würde.
"""

from dataclasses import asdict, dataclass, field
from dataclasses import dataclass, field
import logging

from control import data
from helpermodules.constants import NO_ERROR
from helpermodules.pub import Pub

log = logging.getLogger(__name__)


@dataclass
class Config:
configured: bool = False
configured: bool = field(default=False, metadata={"topic": "config/configured"})


def config_factory() -> Config:
Expand All @@ -25,13 +24,13 @@ def config_factory() -> Config:

@dataclass
class Get:
daily_exported: float = 0
fault_str: str = NO_ERROR
fault_state: int = 0
monthly_exported: float = 0
yearly_exported: float = 0
exported: float = 0
power: float = 0
daily_exported: float = field(default=0, metadata={"topic": "get/daily_exported"})
fault_str: str = field(default=NO_ERROR, metadata={"topic": "get/fault_str"})
fault_state: int = field(default=0, metadata={"topic": "get/fault_state"})
monthly_exported: float = field(default=0, metadata={"topic": "get/monthly_exported"})
yearly_exported: float = field(default=0, metadata={"topic": "get/yearly_exported"})
exported: float = field(default=0, metadata={"topic": "get/exported"})
power: float = field(default=0, metadata={"topic": "get/power"})


def get_factory() -> Get:
Expand Down Expand Up @@ -69,22 +68,22 @@ def calc_power_for_all_components(self) -> None:
if module.data.get.fault_state == 0 and limit.message is not None:
# Fehlermeldung nicht überschreiben
module.data.get.fault_str = limit.message
Pub().pub(f"openWB/set/pv/{module.num}/get/fault_str", limit.message)
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. "
"Es haben nicht alle Module aktuelle Zählerstände geliefert.")
self.data.get.power = power
Pub().pub("openWB/set/pv/get/power", self.data.get.power)
self.data.get.exported = exported
Pub().pub("openWB/set/pv/get/exported", self.data.get.exported)
Pub().pub("openWB/set/pv/get/fault_state", self.data.get.fault_state)
Pub().pub("openWB/set/pv/get/fault_str", self.data.get.fault_str)
self.data.config.configured = True
Pub().pub("openWB/set/pv/config/configured", self.data.config.configured)
else:
self.data.config.configured = False
Pub().pub("openWB/set/pv/config/configured", self.data.config.configured)
{Pub().pub("openWB/pv/get/"+k, 0) for (k, _) in asdict(self.data.get).items()}
# prevent stale PV values when no inverter modules are configured
self.data.get.power = 0
self.data.get.exported = 0
self.data.get.fault_state = 0
self.data.get.fault_str = NO_ERROR
self.data.get.daily_exported = 0
self.data.get.monthly_exported = 0
self.data.get.yearly_exported = 0
except Exception:
log.exception("Fehler im allgemeinen PV-Modul")
4 changes: 4 additions & 0 deletions packages/helpermodules/changed_values_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,17 @@ def pub_changed_values(self):
data.data.counter_all_data.data)
self._update_value("openWB/set/optional/", self.prev_data.optional_data.data,
data.data.optional_data.data)
self._update_value("openWB/set/pv/", self.prev_data.pv_all_data.data,
data.data.pv_all_data.data)
for key, value in data.data.cp_data.items():
self._update_value(f"openWB/set/chargepoint/{value.num}/", self.prev_data.cp_data[key].data, value.data)
for key, value in data.data.bat_data.items():
self._update_value(f"openWB/set/bat/{value.num}/", self.prev_data.bat_data[key].data, value.data)
for key, value in data.data.counter_data.items():
self._update_value(f"openWB/set/counter/{value.num}/",
self.prev_data.counter_data[key].data, value.data)
for key, value in data.data.pv_data.items():
self._update_value(f"openWB/set/pv/{value.num}/", self.prev_data.pv_data[key].data, value.data)
# chargepoint, ev template, autolock, time and scheduled charging plans mutable_by_algorithm immer false
except Exception as e:
log.exception(e)
Expand Down
77 changes: 19 additions & 58 deletions packages/helpermodules/measurement_logging/update_yields.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
import json
import logging
from pathlib import Path
from typing import Dict, List
from typing import Dict

from control import data
from control.chargepoint.chargepoint import Chargepoint
from control.ev.ev import Ev
from control.pv_all import PvAll
from control.pv import Pv
from helpermodules import timecheck
from helpermodules.measurement_logging.process_log import get_totals
from helpermodules.pub import Pub

log = logging.getLogger(__name__)

Expand All @@ -27,43 +22,22 @@ def update_daily_yields(entries):


def update_module_yields(module: str, totals: Dict) -> None:
try:
def update_imported_exported(daily_imported: float, daily_exported: float) -> None:
module_data.data.get.daily_imported = daily_imported
module_data.data.get.daily_exported = daily_exported
if module == "cp":
topic = "chargepoint"
else:
topic = module
if isinstance(module_data, (Ev, Pv, Chargepoint)):
Pub().pub(f"openWB/set/{topic}/{module_data.num}/get/daily_imported", daily_imported)
Pub().pub(f"openWB/set/{topic}/{module_data.num}/get/daily_exported", daily_exported)
elif isinstance(module_data, PvAll):
# wird im changed_values_handler an den Broker gesendet
Pub().pub(f"openWB/set/{topic}/get/daily_imported", daily_imported)
Pub().pub(f"openWB/set/{topic}/get/daily_exported", daily_exported)
except Exception:
log.exception(f"Fehler beim Veröffentlichen der Tageserträge für {module}")

def update_exported(daily_exported: float) -> None:
module_data.data.get.daily_exported = daily_exported
if module in m:
Pub().pub(f"openWB/set/pv/{module_data.num}/get/daily_exported", daily_exported)
else:
Pub().pub("openWB/set/pv/get/daily_exported", daily_exported)

for m in totals[module]:
if m in getattr(data.data, f"{module}_data") or m == "all":
if m == "all":
module_data = getattr(data.data, f"{module}_all_data")
try:
if m in getattr(data.data, f"{module}_data") or m == "all":
if m == "all":
module_data = getattr(data.data, f"{module}_all_data")
else:
module_data = getattr(data.data, f"{module}_data")[m]
if module == "pv":
module_data.data.get.daily_exported = totals[module][m]["energy_exported"]
else:
module_data.data.get.daily_imported = totals[module][m]["energy_imported"]
module_data.data.get.daily_exported = totals[module][m]["energy_exported"]
else:
module_data = getattr(data.data, f"{module}_data")[m]
if module == "pv":
update_exported(totals[module][m]["energy_exported"])
else:
update_imported_exported(totals[module][m]["energy_imported"], totals[module][m]["energy_exported"])
else:
log.info(f"Modul {m} wurde zwischenzeitlich gelöscht und wird daher nicht mehr aufgeführt.")
log.info(f"Modul {m} wurde zwischenzeitlich gelöscht und wird daher nicht mehr aufgeführt.")
except Exception:
log.exception(f"Fehler beim Aktualisieren der Tageserträge für Modul {m} vom Typ {module}.")


def update_pv_monthly_yearly_yields():
Expand All @@ -89,29 +63,16 @@ def _update_pv_monthly_yields():
monthly_yield = data.data.pv_data[f"pv{pv_module.num}"].data.get.exported - \
entry["pv"][f"pv{pv_module.num}"]["exported"]
pv_all_monthly_yield += monthly_yield
Pub().pub(f"openWB/set/pv/{pv_module.num}/get/monthly_exported", monthly_yield)
data.data.pv_data[f"pv{pv_module.num}"].data.get.monthly_exported = monthly_yield
break
Pub().pub("openWB/set/pv/get/monthly_exported", pv_all_monthly_yield)
data.data.pv_all_data.data.get.monthly_exported = pv_all_monthly_yield
except FileNotFoundError:
# am Tag der Ersteinrichtung gibt es noch kein Monatslog-File, das wird erst um Mitternacht erstellt.
log.debug("No monthly logfile found for calculation of monthly yield")
except Exception:
log.exception("Fehler beim Veröffentlichen der monatlichen Erträge für PV")


def pub_yearly_module_yield(sorted_path_list: List[str], pv_module: Pv):
for path in sorted_path_list:
with open(path, "r") as f:
monthly_log = json.load(f)
for entry in monthly_log["entries"]:
# erster Eintrag mit PV im Jahr,falls WR erst im laufenden Jahr hinzugefügt wurden
if entry["pv"].get(f"pv{pv_module.num}"):
yearly_yield = data.data.pv_data[f"pv{pv_module.num}"].data.get.exported - \
entry["pv"][f"pv{pv_module.num}"]["exported"]
Pub().pub(f"openWB/set/pv/{pv_module.num}/get/yearly_exported", yearly_yield)
return


def _update_pv_yearly_yields():
""" veröffentlicht die jährlichen Erträge für PV
für pv_all nicht die Differenz aus den Logs nehmen, sondern die Summe der Module. Wenn unterjährig ein Modul
Expand All @@ -133,15 +94,15 @@ def _update_pv_yearly_yields():
yearly_yield = data.data.pv_data[f"pv{pv_module.num}"].data.get.exported - \
entry["pv"][f"pv{pv_module.num}"]["exported"]
pv_all_yearly_yield += yearly_yield
Pub().pub(f"openWB/set/pv/{pv_module.num}/get/yearly_exported", yearly_yield)
data.data.pv_data[f"pv{pv_module.num}"].data.get.yearly_exported = yearly_yield
found_pv = True
break
if found_pv:
break
else:
# am Tag der Ersteinrichtung gibt es noch kein Monatslog-File, das wird erst um Mitternacht erstellt.
log.debug("No monthly logfile found for calculation of yearly yield")
Pub().pub("openWB/set/pv/get/yearly_exported", pv_all_yearly_yield)
data.data.pv_all_data.data.get.yearly_exported = pv_all_yearly_yield
except Exception:
log.exception("Fehler beim Veröffentlichen der jährlichen Erträge für PV")

Expand Down
1 change: 1 addition & 0 deletions packages/helpermodules/update_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -644,6 +644,7 @@ class UpdateConfig:
("openWB/optional/monitoring/config", NO_MODULE),
("openWB/optional/ocpp/config", dataclass_utils.asdict(OcppConfig())),
("openWB/optional/rfid/active", False),
("openWB/pv/config/configured", False),
("openWB/system/backup_password", None),
("openWB/system/backup_cloud/config", NO_MODULE),
("openWB/system/backup_cloud/backup_before_update", True),
Expand Down
Loading