From c0771f7a3e8cbae3e87f9f5f0a2f7c601e92bdfe Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Tue, 2 Sep 2025 13:22:18 +0200 Subject: [PATCH 1/4] time charged only if plug state true --- packages/control/chargelog/chargelog.py | 29 ++++++++++++------- packages/control/chargepoint/chargepoint.py | 1 + .../control/chargepoint/chargepoint_data.py | 3 +- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/packages/control/chargelog/chargelog.py b/packages/control/chargelog/chargelog.py index 8af942716b..bd14777f9f 100644 --- a/packages/control/chargelog/chargelog.py +++ b/packages/control/chargelog/chargelog.py @@ -82,7 +82,8 @@ def collect_data(chargepoint): if log_data.imported_at_mode_switch == 0: log_data.imported_at_mode_switch = chargepoint.data.get.imported log.debug(f"imported_at_mode_switch {chargepoint.data.get.imported}") - # Bei einem Wechsel das Lademodus wird ein neuer Eintrag erstellt. + if log_data.timestamp_mode_switch is None: + log_data.timestamp_mode_switch = timecheck.create_timestamp() if chargepoint.data.get.charge_state: if log_data.timestamp_start_charging is None: log_data.timestamp_start_charging = timecheck.create_timestamp() @@ -102,7 +103,9 @@ def collect_data(chargepoint): # f"counter {chargepoint.data.get.imported}") log_data.range_charged = get_value_or_default(lambda: log_data.imported_since_mode_switch / charging_ev.ev_template.data.average_consump * 100) - log_data.time_charged = timecheck.get_difference_to_now(log_data.timestamp_start_charging)[0] + else: + if log_data.timestamp_start_charging is not None: + log_data.time_charged += timecheck.create_timestamp() - log_data.timestamp_start_charging Pub().pub(f"openWB/set/chargepoint/{chargepoint.num}/set/log", asdict(log_data)) except Exception: log.exception("Fehler im Ladelog-Modul") @@ -114,7 +117,7 @@ def save_interim_data(chargepoint, charging_ev, immediately: bool = True): # Es wurde noch nie ein Auto zugeordnet if charging_ev == -1: return - if log_data.timestamp_start_charging is None: + if log_data.imported_since_mode_switch == 0: # Die Daten wurden schon erfasst. return if not immediately: @@ -148,7 +151,7 @@ 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.timestamp_start_charging: + if chargepoint.data.set.log.imported_since_mode_switch > 0: # Die Daten wurden noch nicht erfasst. save_data(chargepoint, charging_ev, immediately) chargepoint.reset_log_data() @@ -199,16 +202,22 @@ def _create_entry(chargepoint, charging_ev, immediately: bool = True): log_data.range_charged = get_value_or_default(lambda: round( (log_data.imported_since_mode_switch * charging_ev.ev_template.data.efficiency / charging_ev.ev_template.data.average_consump), 2)) - log_data.time_charged, duration = timecheck.get_difference_to_now(log_data.timestamp_start_charging) power = 0 - if duration > 0: + if log_data.timestamp_start_charging: + time_charged = get_value_or_default(lambda: log_data.time_charged + + (timecheck.create_timestamp() - log_data.timestamp_start_charging), 0) + else: + time_charged = get_value_or_default(lambda: log_data.time_charged, 0) + time_charged_readable = f"{int(time_charged / 3600)}:{int((time_charged % 3600) / 60):02d}" + if time_charged > 0: # power calculation needs to be fixed if useful: # log_data.imported_since_mode_switch / (duration / 3600) - power = get_value_or_default(lambda: round(log_data.imported_since_mode_switch / duration, 2)) + power = get_value_or_default(lambda: round(log_data.imported_since_mode_switch / (time_charged / 3600), 2)) calculate_charge_cost(chargepoint, True) energy_source = get_value_or_default(lambda: analyse_percentage(get_log_from_date_until_now( - log_data.timestamp_start_charging)["totals"])["energy_source"]) + log_data.timestamp_mode_switch)["totals"])["energy_source"]) costs = round(log_data.costs, 2) + new_entry = { "chargepoint": { @@ -233,10 +242,10 @@ def _create_entry(chargepoint, charging_ev, immediately: bool = True): "time": { "begin": get_value_or_default(lambda: datetime.datetime.fromtimestamp( - log_data.timestamp_start_charging).strftime("%m/%d/%Y, %H:%M:%S")), + log_data.timestamp_mode_switch).strftime("%m/%d/%Y, %H:%M:%S")), "end": get_value_or_default(lambda: datetime.datetime.fromtimestamp( timecheck.create_timestamp()).strftime("%m/%d/%Y, %H:%M:%S")), - "time_charged": get_value_or_default(lambda: log_data.time_charged) + "time_charged": time_charged_readable }, "data": { diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index 1d707162b1..8d0f9c9741 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -305,6 +305,7 @@ def reset_log_data_chargemode_switch(self) -> None: 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 + reset_log.timestamp_mode_switch = self.data.set.log.timestamp_mode_switch self.data.set.log = reset_log Pub().pub(f"openWB/set/chargepoint/{self.num}/set/log", asdict(self.data.set.log)) diff --git a/packages/control/chargepoint/chargepoint_data.py b/packages/control/chargepoint/chargepoint_data.py index 4d433a8205..986de2856c 100644 --- a/packages/control/chargepoint/chargepoint_data.py +++ b/packages/control/chargepoint/chargepoint_data.py @@ -73,8 +73,9 @@ class Log: imported_since_mode_switch: float = 0 imported_since_plugged: float = 0 range_charged: float = 0 - time_charged: str = "00:00" + time_charged: float = 0 timestamp_start_charging: Optional[float] = None + timestamp_mode_switch: Optional[float] = None ev: int = -1 prio: bool = False rfid: Optional[str] = None From 65df768fb4779772977577e77f3e23cb39a12163 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Tue, 2 Sep 2025 14:46:52 +0200 Subject: [PATCH 2/4] fix --- packages/control/chargelog/chargelog.py | 1 + packages/control/chargepoint/chargepoint.py | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/control/chargelog/chargelog.py b/packages/control/chargelog/chargelog.py index bd14777f9f..c631bf9d10 100644 --- a/packages/control/chargelog/chargelog.py +++ b/packages/control/chargelog/chargelog.py @@ -106,6 +106,7 @@ def collect_data(chargepoint): else: if log_data.timestamp_start_charging is not None: log_data.time_charged += timecheck.create_timestamp() - log_data.timestamp_start_charging + log_data.timestamp_start_charging = None Pub().pub(f"openWB/set/chargepoint/{chargepoint.num}/set/log", asdict(log_data)) except Exception: log.exception("Fehler im Ladelog-Modul") diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index 8d0f9c9741..1d707162b1 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -305,7 +305,6 @@ def reset_log_data_chargemode_switch(self) -> None: 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 - reset_log.timestamp_mode_switch = self.data.set.log.timestamp_mode_switch self.data.set.log = reset_log Pub().pub(f"openWB/set/chargepoint/{self.num}/set/log", asdict(self.data.set.log)) From a2887772b7b170e4e4a62b96eaa20ed0959d5e2b Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 10 Sep 2025 13:34:34 +0200 Subject: [PATCH 3/4] charge start and end --- packages/control/chargelog/chargelog.py | 3 +++ packages/control/chargepoint/chargepoint_data.py | 2 ++ 2 files changed, 5 insertions(+) diff --git a/packages/control/chargelog/chargelog.py b/packages/control/chargelog/chargelog.py index c631bf9d10..6adb760aa9 100644 --- a/packages/control/chargelog/chargelog.py +++ b/packages/control/chargelog/chargelog.py @@ -87,6 +87,8 @@ def collect_data(chargepoint): if chargepoint.data.get.charge_state: if log_data.timestamp_start_charging is None: log_data.timestamp_start_charging = timecheck.create_timestamp() + if log_data.begin is None: + log_data.begin = timecheck.create_timestamp() if charging_ev.soc_module: log_data.range_at_start = charging_ev.data.get.range log_data.soc_at_start = charging_ev.data.get.soc @@ -107,6 +109,7 @@ def collect_data(chargepoint): if log_data.timestamp_start_charging is not None: log_data.time_charged += timecheck.create_timestamp() - log_data.timestamp_start_charging log_data.timestamp_start_charging = None + log_data.end = timecheck.create_timestamp() Pub().pub(f"openWB/set/chargepoint/{chargepoint.num}/set/log", asdict(log_data)) except Exception: log.exception("Fehler im Ladelog-Modul") diff --git a/packages/control/chargepoint/chargepoint_data.py b/packages/control/chargepoint/chargepoint_data.py index 986de2856c..1e9bcff377 100644 --- a/packages/control/chargepoint/chargepoint_data.py +++ b/packages/control/chargepoint/chargepoint_data.py @@ -66,8 +66,10 @@ class ConnectedVehicle: @dataclass class Log: + begin: Optional[float] = None chargemode_log_entry: str = "_" costs: float = 0 + end: Optional[float] = None imported_at_mode_switch: float = 0 imported_at_plugtime: float = 0 imported_since_mode_switch: float = 0 From b3fb5efe9c30b9da8ddee267d270c33403454b4d Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 29 Oct 2025 07:12:55 +0100 Subject: [PATCH 4/4] review: use variable for now --- packages/control/chargelog/chargelog.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/control/chargelog/chargelog.py b/packages/control/chargelog/chargelog.py index 6adb760aa9..b974b3ea27 100644 --- a/packages/control/chargelog/chargelog.py +++ b/packages/control/chargelog/chargelog.py @@ -69,6 +69,7 @@ def collect_data(chargepoint): Ladepunkt, dessen Logdaten gesammelt werden """ try: + now = timecheck.create_timestamp() log_data = chargepoint.data.set.log charging_ev = chargepoint.data.set.charging_ev_data if chargepoint.data.get.plug_state: @@ -83,12 +84,12 @@ def collect_data(chargepoint): log_data.imported_at_mode_switch = chargepoint.data.get.imported log.debug(f"imported_at_mode_switch {chargepoint.data.get.imported}") if log_data.timestamp_mode_switch is None: - log_data.timestamp_mode_switch = timecheck.create_timestamp() + log_data.timestamp_mode_switch = now if chargepoint.data.get.charge_state: if log_data.timestamp_start_charging is None: - log_data.timestamp_start_charging = timecheck.create_timestamp() + log_data.timestamp_start_charging = now if log_data.begin is None: - log_data.begin = timecheck.create_timestamp() + log_data.begin = now if charging_ev.soc_module: log_data.range_at_start = charging_ev.data.get.range log_data.soc_at_start = charging_ev.data.get.soc @@ -107,9 +108,9 @@ def collect_data(chargepoint): charging_ev.ev_template.data.average_consump * 100) else: if log_data.timestamp_start_charging is not None: - log_data.time_charged += timecheck.create_timestamp() - log_data.timestamp_start_charging + log_data.time_charged += now - log_data.timestamp_start_charging log_data.timestamp_start_charging = None - log_data.end = timecheck.create_timestamp() + log_data.end = now Pub().pub(f"openWB/set/chargepoint/{chargepoint.num}/set/log", asdict(log_data)) except Exception: log.exception("Fehler im Ladelog-Modul")