diff --git a/packages/control/chargelog/chargelog.py b/packages/control/chargelog/chargelog.py index 8af942716b..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: @@ -82,10 +83,13 @@ 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 = 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 = 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 @@ -102,7 +106,11 @@ 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 += now - log_data.timestamp_start_charging + log_data.timestamp_start_charging = None + 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") @@ -114,7 +122,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 +156,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 +207,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 +247,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_data.py b/packages/control/chargepoint/chargepoint_data.py index 4d433a8205..1e9bcff377 100644 --- a/packages/control/chargepoint/chargepoint_data.py +++ b/packages/control/chargepoint/chargepoint_data.py @@ -66,15 +66,18 @@ 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 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