From 184cb3a0c7a7481c47009b79ba5c04c27788f3e0 Mon Sep 17 00:00:00 2001 From: jlayec Date: Wed, 24 Feb 2021 01:02:36 +0000 Subject: [PATCH] update trip algorithm for hybrid cars --- MyPSACC.py | 64 +++++++++++++++++++++++++++++++++++++++++++------- web/figures.py | 4 ++-- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/MyPSACC.py b/MyPSACC.py index 422fbff..d47e8cf 100644 --- a/MyPSACC.py +++ b/MyPSACC.py @@ -584,23 +584,68 @@ class MyPSACC: tr = Trip() #res = list(map(dict,res)) for x in range(0, len(res) - 2): - logger.debug(f"{res[x]['Timestamp']} mileage : {res[x]['mileage']}") + logger.debug(f"{res[x]['Timestamp']} mileage:{res[x]['mileage']} level:{res[x]['level']} level_fuel:{res[x]['level_fuel']}") next_el = res[x + 2] - if end["mileage"] - start["mileage"] == 0 or \ - (end["Timestamp"] - start["Timestamp"]).total_seconds() / 3600 > 10: # condition useless ??? - logger.debug(f"restart trip") + distance = end["mileage"] - start["mileage"] + duration = (end["Timestamp"] - start["Timestamp"]).total_seconds() / 3600 + try: + speed_average = distance / duration + except ZeroDivisionError: + speed_average = 0 + charge = end["level"] - start["level"] + if end["level_fuel"] != None and start["level_fuel"] != None: + refuel = end["level_fuel"] - start["level_fuel"] + else: + refuel = 0 + restart_trip = False + if refuel > 0: + restart_trip = True + logger.debug(f"refuel detected") + elif distance == 0 and charge > 2: + restart_trip = True + logger.debug(f"charge detected") + elif speed_average < 0.2 and duration > 0.05: # think again if duration is really needed + #end["mileage"] - start["mileage"] == 0 #or \ + #(end["Timestamp"] - start["Timestamp"]).total_seconds() / 3600 > 10: # condition useless ??? + restart_trip = True + logger.debug(f"low speed detected") + if restart_trip: start = end tr = Trip() + logger.debug(f"restart trip at {start['Timestamp']} {start['mileage']}km level:{start['level']} level_fuel:{start['level_fuel']}") else: distance = next_el["mileage"] - end["mileage"] # km duration = (next_el["Timestamp"] - end["Timestamp"]).total_seconds() / 3600 + try: + speed_average = distance / duration + except ZeroDivisionError: + speed_average = 0 charge = next_el["level"] - end["level"] if next_el["level_fuel"] != None and end["level_fuel"] != None: refuel = next_el["level_fuel"] - end["level_fuel"] else: - refuel = None - if ((distance == 0 and duration > 0.08) or duration > 2 or # check the speed to handle missing point - (refuel != None and refuel > 0) or (distance == 0 and charge > 0)): + refuel = 0 + end_trip = False + if refuel > 0: + end_trip = True + logger.debug(f"refuel detected") + elif distance == 0 and charge > 2: + end_trip = True + logger.debug(f"charge detected {charge}") + elif speed_average < 0.2 and duration > 0.05: + #(distance == 0 and duration > 0.08) or duration > 2 or # check the speed to handle missing point + end_trip = True + logger.debug(f"low speed detected") + elif duration > 2: + end_trip = True + logger.debug(f"too much time detected") + elif x == len(res)-3: # last record detected + # think if add point is needed + end = next_el + end_trip = True + logger.debug(f"last position found") + if end_trip: + logger.debug(f"stop trip at {end['Timestamp']} {end['mileage']}km level:{end['level']} level_fuel:{end['level_fuel']}") tr.distance = end["mileage"] - start["mileage"] # km if tr.distance > 0: tr.start_at = start["Timestamp"] @@ -617,8 +662,9 @@ class MyPSACC: tr.consumption_fuel_km = round(100 * tr.consumption_fuel / tr.distance,2) # L/100 km tr.mileage = end["mileage"] logger.debug( - f"Trip: {start['Timestamp']} {tr.distance:.1f}km {tr.duration:.2f}h {tr.speed_average:.0f}km/h " - f"{tr.consumption:.2f}kw {tr.consumption_km:.2f}kw/100km {tr.consumption_fuel}L {tr.consumption_fuel_km}L/100km {tr.mileage:.1f}km") + f"Trip: {tr.start_at} -> {tr.end_at} {tr.distance:.1f}km {tr.duration:.2f}h {tr.speed_average:.0f}km/h " + f"{tr.consumption:.2f}kw {tr.consumption_km:.2f}kw/100km {tr.consumption_fuel}L {tr.consumption_fuel_km}L/100km " + f"{tr.mileage:.1f}km") # filter bad value if tr.consumption_km < 70 and (tr.consumption_fuel_km == None or tr.consumption_fuel_km < 30): trips.append(tr) diff --git a/web/figures.py b/web/figures.py index c7c18ab..88d2bd8 100644 --- a/web/figures.py +++ b/web/figures.py @@ -80,8 +80,8 @@ def get_figures(trips: List[Trip], charging: List[dict]): 'format': deepcopy(nb_format).symbol_suffix(" kw/100km")}, {'id': 'consumption_fuel_km', 'name': 'average consumption fuel', 'type': 'numeric', 'format': deepcopy(nb_format).symbol_suffix(" L/100km")}, - {'id': 'distance', 'name': 'distance', 'type': 'numeric', 'format': nb_format.symbol_suffix(" km")}, - {'id': 'mileage', 'name': 'mileage', 'type': 'numeric', 'format': nb_format.symbol_suffix(" km")}], + {'id': 'distance', 'name': 'distance', 'type': 'numeric', 'format': nb_format.symbol_suffix(" km").precision(1)}, + {'id': 'mileage', 'name': 'mileage', 'type': 'numeric', 'format': nb_format.symbol_suffix(" km").precision(1)}], data=[tr.get_info() for tr in trips], ) # consumption_fig