From d6d14d03329054b78795f4bfc1d7aced8541bc0d Mon Sep 17 00:00:00 2001 From: Florian Bezannier Date: Mon, 10 May 2021 17:13:37 +0200 Subject: [PATCH] handle no trips or no charge, move utils.py to libs --- utils.py => libs/utils.py | 0 my_psacc.py | 2 +- server.py | 2 +- web/assets/clientside.js | 51 +++++++++++++++++++++------------------ web/db.py | 2 +- web/figures.py | 8 +++--- web/views.py | 27 ++++++++++++--------- 7 files changed, 48 insertions(+), 44 deletions(-) rename utils.py => libs/utils.py (100%) diff --git a/utils.py b/libs/utils.py similarity index 100% rename from utils.py rename to libs/utils.py diff --git a/my_psacc.py b/my_psacc.py index ee5cdd1..2803523 100644 --- a/my_psacc.py +++ b/my_psacc.py @@ -22,7 +22,7 @@ from otp.otp import load_otp, new_otp_session, save_otp, ConfigException, Otp from psa_connectedcar.rest import ApiException from mylogger import logger -from utils import rate_limit +from libs.utils import rate_limit from web.abrp import Abrp from web.db import Database diff --git a/server.py b/server.py index d878e7c..b775663 100755 --- a/server.py +++ b/server.py @@ -16,7 +16,7 @@ from libs.elec_price import ElecPrice from mylogger import my_logger from mylogger import logger from my_psacc import MyPSACC -from utils import is_port_in_use +from libs.utils import is_port_in_use from web.app import start_app, save_config CONFIG_NAME = "config.json" diff --git a/web/assets/clientside.js b/web/assets/clientside.js index d3710bf..42468bc 100644 --- a/web/assets/clientside.js +++ b/web/assets/clientside.js @@ -100,11 +100,13 @@ function update_figures(data, old_figure, x,y) { figure["data"][0]["lon"].push(...trip["positions"][y_label[0]]); figure["data"][0]["hovertext"].push(...Array(x_pos.length).fill(trip[y_label[1]]), null); } - var last_pos = trip["positions"][y_label[0]].length; - figure.layout.mapbox.center.lat = trip["positions"][x_label][last_pos - 1]; - figure.layout.mapbox.center.lon = trip["positions"][y_label[0]][last_pos - 1]; - figure.data[1].lat = [figure.layout.mapbox.center.lat] - figure.data[1].lon = [figure.layout.mapbox.center.lon] + if(trip){ + var last_pos = trip["positions"][y_label[0]].length; + figure.layout.mapbox.center.lat = trip["positions"][x_label][last_pos - 1]; + figure.layout.mapbox.center.lon = trip["positions"][y_label[0]][last_pos - 1]; + figure.data[1].lat = [figure.layout.mapbox.center.lat] + figure.data[1].lon = [figure.layout.mapbox.center.lon] + } } else { x_values = trips.map(a => a[x_label]) @@ -131,11 +133,8 @@ function update_table(data, tables){ function update_cards_value(data){ - res = {} - avg_co2=new Avg(); - avg_kw = new Avg(); - avg_time = new Avg() - avg_price = new Avg(); + var res = {} + var avg_co2=new Avg(), avg_kw = new Avg(),avg_time = new Avg(), avg_price = new Avg(); data["chargings"].forEach(function(charge){ diff = ((new Date(charge["stop_at"])) - (new Date(charge["start_at"])))/3600000; avg_kw.add_value(charge["kw"]); @@ -145,21 +144,25 @@ function update_cards_value(data){ avg_time.add_value(diff); } }) - total_distance = data["trips"][data["trips"].length-1]["mileage"]-data["trips"][0]["mileage"] - avg_kw = avg_kw.average(); - avg_co2 = avg_co2.average() - avg_price_kw = avg_price.average()/avg_kw; - - res["avg_consum_kw"] = Avg.get_average_key(data["trips"], "consumption_km") - res["avg_emission_kw"] = avg_co2; - res["avg_emission_km"] = res["avg_emission_kw"]*res["avg_consum_kw"]/100; - res["avg_chg_speed"] = avg_kw/avg_time.average() - res["elec_consum_kw"] = total_distance*res["avg_consum_kw"]/100; - res["elec_consum_price"] = avg_price_kw*res["elec_consum_kw"] - res["avg_consum_price"] = avg_price_kw*res["avg_consum_kw"] - //console.log(res); + if(data["chargings"].length>0){ + avg_kw = avg_kw.average(); + avg_co2 = avg_co2.average() + avg_price_kw = avg_price.average()/avg_kw; + res["avg_emission_kw"] = avg_co2; + res["avg_chg_speed"] = avg_kw/avg_time.average(); + } + if(data["trips"].length>0){ + var total_distance = data["trips"][data["trips"].length-1]["mileage"]-data["trips"][0]["mileage"] + res["avg_consum_kw"] = Avg.get_average_key(data["trips"], "consumption_km"); + res["elec_consum_kw"] = total_distance*res["avg_consum_kw"]/100; + } + if(data["trips"].length>0 && data["chargings"].length>0){ + res["avg_emission_km"] = res["avg_emission_kw"]*res["avg_consum_kw"]/100; + res["elec_consum_price"] = avg_price_kw*res["elec_consum_kw"] + res["avg_consum_price"] = avg_price_kw*res["avg_consum_kw"] + } for (const [key, value] of Object.entries(res)) { - document.getElementById(key).innerHTML=value.toPrecision(3); + document.getElementById(key).innerHTML=value.toPrecision(3); } } diff --git a/web/db.py b/web/db.py index b80fbb9..2a2e526 100644 --- a/web/db.py +++ b/web/db.py @@ -11,7 +11,7 @@ from geojson import Feature, Point, FeatureCollection from geojson import dumps as geo_dumps from mylogger import logger -from utils import get_temp +from libs.utils import get_temp NEW_BATTERY_COLUMNS = [["price", "INTEGER"], ["charging_mode", "TEXT"]] NEW_POSITION_COLUMNS = [["level_fuel", "INTEGER"], ["altitude", "INTEGER"]] diff --git a/web/figures.py b/web/figures.py index 67ae795..eb85b0c 100644 --- a/web/figures.py +++ b/web/figures.py @@ -24,9 +24,7 @@ consumption_fig_by_speed = ERROR_DIV consumption_fig_by_temp = ERROR_DIV table_fig = ERROR_DIV info = "" -battery_info = ERROR_DIV -battery_table = None -consumption_df_dict = None +battery_table = ERROR_DIV AVG_CHARGE_SPEED = "avg_chg_speed" AVG_EMISSION_KM = "avg_emission_km" @@ -52,8 +50,8 @@ SUMMARY_CARDS = {"Average consumption": {"text": [card_value_div(AVG_CONSUM_KW, # pylint: disable=too-many-locals def get_figures(car: Car): - global consumption_fig, consumption_df, trips_map, consumption_fig_by_speed, table_fig, info, battery_info, \ - battery_table, consumption_fig_by_temp, consumption_df_dict + global consumption_fig, consumption_df, trips_map, consumption_fig_by_speed, table_fig, info, \ + battery_table, consumption_fig_by_temp lats = [42, 41] lons = [1, 2] names = ["undefined", "undefined"] diff --git a/web/views.py b/web/views.py index 383aae7..6306936 100644 --- a/web/views.py +++ b/web/views.py @@ -11,7 +11,7 @@ from deepdiff import DeepDiff from flask import jsonify, request, Response as FlaskResponse import web.utils -from libs.car import Cars +from libs.car import Cars, Car from mylogger import logger from trip import Trips @@ -31,7 +31,7 @@ EMPTY_DIV = "empty-div" ABRP_SWITCH = 'abrp-switch' CALLBACK_CREATED = False -trips: Trips +trips: Trips = Trips() chargings: List[dict] min_date = max_date = min_millis = max_millis = step = marks = cached_layout = None @@ -232,8 +232,9 @@ def update_trips(): min_date = trips[0].start_at max_date = trips[-1].start_at figures.get_figures(trips[0].car) - except (StopIteration, AssertionError): + except (AssertionError, KeyError): logger.debug("No trips yet") + figures.get_figures(Car("vin","vid","brand")) try: chargings = Charging.get_chargings() assert len(chargings) > 0 @@ -288,6 +289,14 @@ def serve_layout(): logger.debug("Create new layout") fig_filter = Figure_Filter() try: + range_slider = dcc.RangeSlider( + id='date-slider', + min=min_millis, + max=max_millis, + step=step, + marks=marks, + value=[min_millis, max_millis], + ) summary_tab = [ dbc.Container(dbc.Row(id="summary-cards", children=create_card(figures.SUMMARY_CARDS)), fluid=True), @@ -304,19 +313,13 @@ def serve_layout(): fig_filter.src = {"trips": trips.get_trips_as_dict(), "chargings": chargings} dash_app.clientside_callback(*fig_filter.get_clientside_callback()) create_callback() - range_slider = dcc.RangeSlider( - id='date-slider', - min=min_millis, - max=max_millis, - step=step, - marks=marks, - value=[min_millis, max_millis], - ) - except (IndexError, TypeError, NameError): + except (IndexError, TypeError, NameError, AssertionError, NameError): summary_tab = figures.ERROR_DIV maps = figures.ERROR_DIV logger.warning("Failed to generate figure, there is probably not enough data yet", exc_info_debug=True) range_slider = html.Div() + figures.battery_table = figures.ERROR_DIV + data_div = html.Div([ *fig_filter.get_store(), range_slider,