diff --git a/packages/control/chargelog/chargelog.py b/packages/control/chargelog/chargelog.py index 2071c3d49e..466662d00a 100644 --- a/packages/control/chargelog/chargelog.py +++ b/packages/control/chargelog/chargelog.py @@ -83,11 +83,18 @@ def collect_data(chargepoint): # Bisher geladene Energie ermitteln log_data.imported_since_plugged = get_value_or_default( lambda: chargepoint.data.get.imported - log_data.imported_at_plugtime, 0) + if get_value_or_default(lambda: log_data.exported_at_plugtime, 0) == 0: + log_data.exported_at_plugtime = get_value_or_default(lambda: chargepoint.data.get.exported, 0) + log_data.exported_since_plugged = get_value_or_default( + lambda: chargepoint.data.get.exported - log_data.exported_at_plugtime, 0) if get_value_or_default(lambda: log_data.imported_at_mode_switch, 0) == 0: log_data.imported_at_mode_switch = get_value_or_default(lambda: chargepoint.data.get.imported, 0) log.debug(f"imported_at_mode_switch {log_data.imported_at_mode_switch}") + if get_value_or_default(lambda: log_data.exported_at_mode_switch, 0) == 0: + log_data.exported_at_mode_switch = get_value_or_default(lambda: chargepoint.data.get.exported, 0) + if get_value_or_default(lambda: log_data.timestamp_mode_switch) is None: log_data.timestamp_mode_switch = now @@ -117,6 +124,8 @@ def collect_data(chargepoint): log_data.rfid = get_value_or_default(lambda: chargepoint.data.set.rfid) log_data.imported_since_mode_switch = get_value_or_default( lambda: chargepoint.data.get.imported - log_data.imported_at_mode_switch, 0) + log_data.exported_since_mode_switch = get_value_or_default( + lambda: chargepoint.data.get.exported - log_data.exported_at_mode_switch, 0) log_data.range_charged = _get_range_charged(log_data, charging_ev) else: timestamp_start_charging = get_value_or_default(lambda: log_data.timestamp_start_charging) @@ -134,7 +143,7 @@ def save_interim_data(chargepoint, charging_ev): try: log_data = chargepoint.data.set.log # Es wurde noch nie ein Auto zugeordnet - if log_data.imported_since_mode_switch == 0: + if log_data.imported_since_mode_switch == 0 and log_data.exported_since_mode_switch == 0: # Die Daten wurden schon erfasst. return save_data(chargepoint, charging_ev) @@ -161,7 +170,8 @@ def save_and_reset_data(chargepoint, charging_ev, immediately: bool = True): if chargepoint.data.get.power != 0: # Das Fahrzeug hat die Ladung noch nicht beendet. Der Logeintrag wird später erstellt. return - if chargepoint.data.set.log.imported_since_mode_switch > 0: + if (chargepoint.data.set.log.imported_since_mode_switch > 0 or + chargepoint.data.set.log.exported_since_mode_switch > 0): # Die Daten wurden noch nicht erfasst. save_data(chargepoint, charging_ev) chargepoint.reset_log_data() @@ -184,7 +194,8 @@ def _get_range_charged(log_data, charging_ev) -> float: charging_ev.data.get.range - log_data.range_at_start, 2)) else: return get_value_or_default(lambda: round( - (log_data.imported_since_mode_switch * charging_ev.ev_template.data.efficiency / + ((log_data.imported_since_mode_switch - log_data.exported_since_mode_switch) + * charging_ev.ev_template.data.efficiency / charging_ev.ev_template.data.average_consump), 2)) except Exception: log.exception("Fehler beim Berechnen der geladenen Reichweite") @@ -203,7 +214,8 @@ def save_data(chargepoint, charging_ev): EV, das an diesem Ladepunkt lädt. (Wird extra übergeben, da es u.U. noch nicht zugewiesen ist und nur die Nummer aus dem Broker in der LP-Klasse hinterlegt ist.) """ - if chargepoint.data.set.log.imported_since_mode_switch != 0: + if (chargepoint.data.set.log.imported_since_mode_switch != 0 or + chargepoint.data.set.log.exported_since_mode_switch != 0): new_entry = _create_entry(chargepoint, charging_ev) write_new_entry(new_entry) @@ -215,6 +227,10 @@ def _create_entry(chargepoint, charging_ev): chargepoint.data.get.imported - log_data.imported_at_plugtime, 2)) log_data.imported_since_mode_switch = get_value_or_default(lambda: round( chargepoint.data.get.imported - log_data.imported_at_mode_switch, 2)) + log_data.exported_since_plugged = get_value_or_default(lambda: round( + chargepoint.data.get.exported - log_data.exported_at_plugtime, 2)) + log_data.exported_since_mode_switch = get_value_or_default(lambda: round( + chargepoint.data.get.exported - log_data.exported_at_mode_switch, 2)) log_data.range_charged = _get_range_charged(log_data, charging_ev) power = 0 if log_data.timestamp_start_charging: @@ -240,6 +256,8 @@ def _create_entry(chargepoint, charging_ev): "serial_number": get_value_or_default(lambda: chargepoint.data.get.serial_number), "imported_at_start": get_value_or_default(lambda: log_data.imported_at_mode_switch), "imported_at_end": get_value_or_default(lambda: chargepoint.data.get.imported), + "exported_at_start": get_value_or_default(lambda: log_data.exported_at_mode_switch), + "exported_at_end": get_value_or_default(lambda: chargepoint.data.get.exported), }, "vehicle": { @@ -264,6 +282,8 @@ def _create_entry(chargepoint, charging_ev): "data": { "range_charged": log_data.range_charged, + "exported_since_mode_switch": log_data.exported_since_mode_switch, + "exported_since_plugged": log_data.exported_since_plugged, "imported_since_mode_switch": log_data.imported_since_mode_switch, "imported_since_plugged": log_data.imported_since_plugged, "power": power, @@ -336,6 +356,9 @@ def calculate_charged_energy_by_source(cp, processed_entries, reference_entries, raise TypeError(f"Unbekannter Referenz-Zeitpunkt {reference}") log.debug(f'power source {relative_energy_source}') log.debug(f"charged_energy {charged_energy}") + if charged_energy < 100: + # wenn nur entladen wurde, keine Anteile berechnen + return {source: 0 for source in ENERGY_SOURCES} return _get_charged_energy_by_source( relative_energy_source, charged_energy) diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index 29357161f3..328cfe899b 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -275,6 +275,9 @@ def remember_previous_values(self): def reset_log_data_chargemode_switch(self) -> None: reset_log = Log() # Wenn ein Zwischeneintrag, zB bei Wechsel des Lademodus, erstellt wird, Zählerstände nicht verwerfen. + reset_log.exported_at_mode_switch = self.data.get.exported + reset_log.exported_at_plugtime = self.data.set.log.exported_at_plugtime + reset_log.exported_since_plugged = self.data.set.log.exported_since_plugged reset_log.imported_at_mode_switch = self.data.get.imported reset_log.imported_at_plugtime = self.data.set.log.imported_at_plugtime reset_log.imported_since_plugged = self.data.set.log.imported_since_plugged diff --git a/packages/control/chargepoint/chargepoint_data.py b/packages/control/chargepoint/chargepoint_data.py index 6a4f435c3e..a9095f4087 100644 --- a/packages/control/chargepoint/chargepoint_data.py +++ b/packages/control/chargepoint/chargepoint_data.py @@ -74,6 +74,10 @@ class Log: charged_energy_by_source: Dict[str, float] = field(default_factory=empty_enery_source_dict_factory) costs: float = 0 end: Optional[float] = None + exported_at_mode_switch: float = 0 + exported_at_plugtime: float = 0 + exported_since_mode_switch: float = 0 + exported_since_plugged: float = 0 imported_at_mode_switch: float = 0 imported_at_plugtime: float = 0 imported_since_mode_switch: float = 0 diff --git a/packages/helpermodules/measurement_logging/process_log.py b/packages/helpermodules/measurement_logging/process_log.py index 60feb03e6a..25ba9d314c 100644 --- a/packages/helpermodules/measurement_logging/process_log.py +++ b/packages/helpermodules/measurement_logging/process_log.py @@ -38,9 +38,12 @@ def get_default_charge_log_columns() -> Dict: "vehicle_soc_at_end": False, "chargepoint_name": True, "chargepoint_serial_number": False, + "data_exported_since_mode_switch": False, "data_imported_since_mode_switch": True, + "chargepoint_exported_at_start": False, + "chargepoint_exported_at_end": False, "chargepoint_imported_at_start": False, - "chargepoint_imported_at_end": False + "chargepoint_imported_at_end": False, } diff --git a/packages/helpermodules/update_config.py b/packages/helpermodules/update_config.py index b5b0379be2..738fe363e6 100644 --- a/packages/helpermodules/update_config.py +++ b/packages/helpermodules/update_config.py @@ -57,7 +57,7 @@ class UpdateConfig: - DATASTORE_VERSION = 104 + DATASTORE_VERSION = 105 valid_topic = [ "^openWB/bat/config/bat_control_permitted$", @@ -2665,3 +2665,17 @@ def upgrade(topic: str, payload) -> None: return {topic: provider} self._loop_all_received_topics(upgrade) self._append_datastore_version(104) + + def upgrade_datastore_105(self) -> None: + def upgrade(topic: str, payload) -> None: + if "openWB/general/charge_log_data_config" == topic: + config = decode_payload(payload) + if config.get("data_exported_since_mode_switch") is None: + config["data_exported_since_mode_switch"] = False + if config.get("chargepoint_exported_at_start") is None: + config["chargepoint_exported_at_start"] = False + if config.get("chargepoint_exported_at_end") is None: + config["chargepoint_exported_at_end"] = False + return {topic: config} + self._loop_all_received_topics(upgrade) + self._append_datastore_version(105)