diff --git a/packages/control/chargepoint/chargepoint_data.py b/packages/control/chargepoint/chargepoint_data.py index f47e698735..5ba70c5473 100644 --- a/packages/control/chargepoint/chargepoint_data.py +++ b/packages/control/chargepoint/chargepoint_data.py @@ -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 diff --git a/packages/control/pv.py b/packages/control/pv.py index c44f06fd5d..6dec696046 100644 --- a/packages/control/pv.py +++ b/packages/control/pv.py @@ -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: diff --git a/packages/control/pv_all.py b/packages/control/pv_all.py index 59cd0aec6c..63a0047b89 100644 --- a/packages/control/pv_all.py +++ b/packages/control/pv_all.py @@ -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: @@ -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: @@ -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") diff --git a/packages/helpermodules/changed_values_handler.py b/packages/helpermodules/changed_values_handler.py index 073223e514..e191f5851d 100644 --- a/packages/helpermodules/changed_values_handler.py +++ b/packages/helpermodules/changed_values_handler.py @@ -85,6 +85,8 @@ 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(): @@ -92,6 +94,8 @@ def pub_changed_values(self): 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) diff --git a/packages/helpermodules/measurement_logging/update_yields.py b/packages/helpermodules/measurement_logging/update_yields.py index 02ecccbc08..23b1a8a251 100644 --- a/packages/helpermodules/measurement_logging/update_yields.py +++ b/packages/helpermodules/measurement_logging/update_yields.py @@ -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__) @@ -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(): @@ -89,9 +63,9 @@ 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") @@ -99,19 +73,6 @@ def _update_pv_monthly_yields(): 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 @@ -133,7 +94,7 @@ 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: @@ -141,7 +102,7 @@ def _update_pv_yearly_yields(): 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") diff --git a/packages/helpermodules/update_config.py b/packages/helpermodules/update_config.py index 1b47c24931..9838d0fc16 100644 --- a/packages/helpermodules/update_config.py +++ b/packages/helpermodules/update_config.py @@ -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),