diff --git a/MyLogger.py b/MyLogger.py index 413f88f..a50f1a4 100644 --- a/MyLogger.py +++ b/MyLogger.py @@ -1,13 +1,23 @@ import logging from logging.handlers import RotatingFileHandler +DEBUG_LEVELV_NUM = 9 +logging.addLevelName(DEBUG_LEVELV_NUM, "DEBUGV") + +def debugv(self, message, *args, **kws): + self.log(DEBUG_LEVELV_NUM, message, *args, **kws) + + +logging.Logger.debugv = debugv + logger = logging.getLogger("log") def my_logger(file='activity.log', handler_level=logging.INFO): global logger - logger.setLevel(logging.DEBUG) + #logger.setLevel(logging.DEBUG) + logger.setLevel(handler_level) formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s') file_handler = RotatingFileHandler(file, 'a', 1000000, 1, encoding='utf8') file_handler.setLevel(handler_level) diff --git a/Trip.py b/Trip.py index c242a07..4bfcf26 100644 --- a/Trip.py +++ b/Trip.py @@ -6,8 +6,6 @@ from Car import Cars from MyLogger import logger from web.db import get_db -DEBUG = False - class Points(): def __init__(self, latitude, longitude): @@ -88,9 +86,8 @@ class Trips(list): tr = Trip() # res = list(map(dict,res)) for x in range(0, len(res) - 2): - if DEBUG: - logger.debug("%s mileage:%f level:%d level_fuel:%f", - {res[x]['Timestamp']}, res[x]['mileage'], res[x]['level'], res[x]['level_fuel']) + logger.debugv("%s mileage:%.1f level:%s level_fuel:%s", + res[x]['Timestamp'], res[x]['mileage'], res[x]['level'], res[x]['level_fuel']) next_el = res[x + 2] distance = end["mileage"] - start["mileage"] duration = (end["Timestamp"] - start["Timestamp"]).total_seconds() / 3600 @@ -106,24 +103,20 @@ class Trips(list): restart_trip = False if refuel > 0: restart_trip = True - if DEBUG: - logger.debug(f"refuel detected") + logger.debugv("refuel detected") elif distance == 0 and charge > 2: restart_trip = True - if DEBUG: - logger.debug("charge detected") + logger.debugv("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 - if DEBUG: - logger.debug("low speed detected") + logger.debugv("low speed detected") if restart_trip: start = end tr = Trip() - if DEBUG: - logger.debug("restart trip at %d %f km level:%f level_fuel:%f", start['Timestamp'], - start['mileage'], start['level'], start['level_fuel']) + logger.debugv("restart trip at %s mileage:%.1f level:%s level_fuel:%s", + start['Timestamp'], start['mileage'], start['level'], start['level_fuel']) else: distance = next_el["mileage"] - end["mileage"] # km duration = (next_el["Timestamp"] - end["Timestamp"]).total_seconds() / 3600 @@ -139,32 +132,26 @@ class Trips(list): end_trip = False if refuel > 0: end_trip = True - if DEBUG: - logger.debug("refuel detected") + logger.debugv("refuel detected") elif distance == 0 and charge > 2: end_trip = True - if DEBUG: - logger.debug("charge detected") + logger.debugv("charge detected") 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 - if DEBUG: - logger.debug("low speed detected") + logger.debugv("low speed detected") elif duration > 2: end_trip = True - if DEBUG: - logger.debug("too much time detected") + logger.debugv("too much time detected") elif x == len(res) - 3: # last record detected # think if add point is needed end = next_el end_trip = True - if DEBUG: - logger.debug("last position found") + logger.debugv("last position found") if end_trip: - if DEBUG: - logger.debug("stop trip at %s %fkm level:%f level_fuel:%f", - end['Timestamp'], end['mileage'], end['level'], end['level_fuel']) + logger.debugv("stop trip at %s mileage:%.1f level:%s level_fuel:%s", + end['Timestamp'], end['mileage'], end['level'], end['level_fuel']) tr.distance = end["mileage"] - start["mileage"] # km if tr.distance > 0: tr.start_at = start["Timestamp"] @@ -178,21 +165,21 @@ class Trips(list): if start["level_fuel"] is not None and end["level_fuel"] is not None: diff_level_fuel = start["level_fuel"] - end["level_fuel"] tr.consumption_fuel = round(diff_level_fuel / 100 * fuel_capacity, 2) # L - tr.consumption_fuel_km = round(100 * tr.consumption_fuel / tr.distance, - 2) # L/100 km + tr.consumption_fuel_km = round(100 * tr.consumption_fuel / tr.distance, 2) # L/100 km + else: + tr.consumption_fuel = 0 + tr.consumption_fuel_km = 0 tr.mileage = end["mileage"] - if DEBUG: - logger.debug("Trip: %s %.1fkm %.2fh %.0fkm/h %.2fkWh %:.2fkWh/100km %sL " - "%sL/100km %:.1fkm", tr.start_at, tr.end_at, tr.distance, tr.duration, - tr.speed_average, tr.consumption, tr.consumption_km, - tr.consumption_fuel, tr.consumption_fuel_km, tr.mileage) + logger.debugv("Trip: %s -> %s %.1fkm %.2fh %.0fkm/h %.2fkWh %.2fkWh/100km %.2fL %.2fL/100km %.1fkm", + tr.start_at, tr.end_at, tr.distance, tr.duration, + tr.speed_average, tr.consumption, tr.consumption_km, + tr.consumption_fuel, tr.consumption_fuel_km, tr.mileage) # filter bad value if tr.consumption_km < 70 and ( - tr.consumption_fuel_km == None or tr.consumption_fuel_km < 30): + tr.consumption_fuel_km is None or tr.consumption_fuel_km < 30): trips.append(tr) else: - if DEBUG: - logger.debug("trip discarded") + logger.debugv("trip discarded") start = next_el tr = Trip() else: diff --git a/server.py b/server.py index 65b21de..1ab5f84 100755 --- a/server.py +++ b/server.py @@ -40,6 +40,10 @@ if __name__ == "__main__": raise RuntimeError("This application requires Python 3.6+") parser = parse_args() args = parser.parse_args() + try: + args.debug=int(args.debug) + except ValueError: + pass my_logger(handler_level=args.debug) logger.info("server start") if args.config: @@ -63,9 +67,6 @@ if __name__ == "__main__": client_password = input("mypeugeot password: ") web.app.myp.connect(client_email, client_password) logger.info(str(web.app.myp.get_vehicles())) - if args.offline: - logger.info("offline mode") - else: if args.remote_disable: logger.info("mqtt disabled") else: @@ -79,5 +80,5 @@ if __name__ == "__main__": Thread(target=web.app.myp.refresh_vehicle_info).start() save_config(web.app.myp) - t1 = Thread(target=start_app, args=["My car info", args.base_path, args.debug < 20, args.listen, int(args.port)]) + t1 = Thread(target=start_app, args=["My car info", args.base_path, logger.level < 20, args.listen, int(args.port)]) t1.start() diff --git a/web/app.py b/web/app.py index 54985f6..aaed20e 100644 --- a/web/app.py +++ b/web/app.py @@ -44,7 +44,7 @@ def start_app(title, base_path, debug: bool, host, port): myp = None -chc: ChargeControls +chc: ChargeControls = None def save_config(my_peugeot: MyPSACC): diff --git a/web/callback.py b/web/callback.py index b3c7c93..0464ff3 100644 --- a/web/callback.py +++ b/web/callback.py @@ -18,6 +18,7 @@ import web.db trips: Trips chargings: dict +min_date = max_date = min_millis = max_millis = step = marks = None @dash_app.callback(Output('trips_map', 'figure'), @@ -26,6 +27,9 @@ chargings: dict Output('consumption', 'children'), Output('tab_trips', 'children'), Output('tab_battery', 'children'), + Output('date-slider', 'max'), + Output('date-slider', 'step'), + Output('date-slider', 'marks'), Input('date-slider', 'value')) def display_value(value): mini = datetime.fromtimestamp(value[0], tz=timezone.utc) @@ -37,7 +41,8 @@ def display_value(value): filtered_chargings = MyPSACC.get_chargings(mini, maxi) figures.get_figures(filtered_trips, filtered_chargings) consumption = "Average consumption: {:.1f} kWh/100km".format(float(figures.consumption_df.mean(numeric_only=True))) - return figures.trips_map, figures.consumption_fig, figures.consumption_fig_by_speed, consumption, figures.table_fig, figures.battery_info + return figures.trips_map, figures.consumption_fig, figures.consumption_fig_by_speed, consumption, figures.table_fig, figures.battery_info, \ + max_millis, step, marks @app.route('/getvehicles') @@ -126,24 +131,29 @@ def update_trips(): chargings = MyPSACC.get_chargings() except: logger.error("update_trips: %s", traceback.format_exc()) + # update for slider + global min_date, max_date, min_millis, max_millis, step, marks + try: + min_date = trips[0].start_at + max_date = trips[-1].start_at + min_millis = figures.unix_time_millis(min_date) + max_millis = figures.unix_time_millis(max_date) + step = (max_millis - min_millis) / 100 + marks = figures.get_marks_from_start_end(min_date, max_date) + except: + logger.error("update_trips (slider): %s", traceback.format_exc()) try: web.db.callback_fct = update_trips update_trips() - min_date = trips[0].start_at - max_date = trips[-1].start_at - min_millis = figures.unix_time_millis(min_date) - max_millis = figures.unix_time_millis(max_date) - step = (max_millis - min_millis) / 100 figures.get_figures(trips, chargings) data_div = html.Div([dcc.RangeSlider( id='date-slider', min=min_millis, max=max_millis, step=step, - marks=figures.get_marks_from_start_end(min_date, - max_date), + marks=marks, value=[min_millis, max_millis], ), html.Div([