diff --git a/libs/config.py b/libs/config.py index cd58a8c..f39fd0f 100644 --- a/libs/config.py +++ b/libs/config.py @@ -50,7 +50,7 @@ class Config(metaclass=Singleton): self.myp: MyPSACC self.chc: ChargeControls self.config_name = DEFAULT_NAME - self.is_good: bool = False + self.is_good: bool = True self.offline = self.args.offline self.remote_control = not (self.args.remote_disable or self.offline) diff --git a/test/test_unit.py b/test/test_unit.py index a9ee274..342e4f2 100644 --- a/test/test_unit.py +++ b/test/test_unit.py @@ -20,7 +20,7 @@ from mylogger import my_logger from otp.otp import load_otp, save_otp from charge_control import ChargeControls from test.utils import DATA_DIR, record_position, latitude, longitude, date0, date1, date2, date3, record_charging, \ - vehicule_list, get_new_test_db, get_date + vehicule_list, get_new_test_db, get_date, date4 from trip import Trips from libs.utils import get_temp, parse_hour from web.db import Database @@ -106,7 +106,7 @@ class TestUnit(unittest.TestCase): def test_battery_curve(self): get_new_test_db() record_charging() - res = Database.get_battery_curve(Database.get_db(), date0, self.vehicule_list[0].vin) + res = Database.get_battery_curve(Database.get_db(), date0, date4, self.vehicule_list[0].vin) assert len(res) == 3 def test_sdk(self): diff --git a/web/db.py b/web/db.py index 8be44ba..085ee19 100644 --- a/web/db.py +++ b/web/db.py @@ -177,9 +177,11 @@ class Database: return update @staticmethod - def get_battery_curve(conn, start_at, vin): - return convert_sql_res(conn.execute("""SELECT date, level FROM battery_curve - WHERE start_at=? and VIN=?;""", (start_at, vin)).fetchall()) + def get_battery_curve(conn, start_at, stop_at, vin): + return convert_sql_res(conn.execute("""SELECT date, level, rate, autonomy + FROM battery_curve + WHERE start_at=? and date<=? and VIN=?;""", + (start_at, stop_at, vin)).fetchall()) @staticmethod def add_altitude_to_db(conn): diff --git a/web/figures.py b/web/figures.py index 8bd7943..dd74270 100644 --- a/web/figures.py +++ b/web/figures.py @@ -1,4 +1,5 @@ from copy import deepcopy +from statistics import mean import dash_bootstrap_components as dbc import dash_table @@ -159,24 +160,43 @@ def get_battery_curve_fig(row: dict, car: Car): start_date = dash_date_to_datetime(row["start_at"]) stop_at = dash_date_to_datetime(row["stop_at"]) conn = Database.get_db() - res = Database.get_battery_curve(conn, start_date, car.vin) + res = Database.get_battery_curve(conn, start_date, stop_at, car.vin) conn.close() - res.insert(0, {"level": row["start_level"], "date": start_date}) - if row["end_level"] is not None: - res.append({"level": row["end_level"], "date": stop_at}) battery_curves = [] - speed = 0 - start = 0 - for end in range(1, len(res)): - start_level = res[start]["level"] - end_level = res[end]["level"] - diff_level = end_level-start_level - diff_sec = (res[end]["date"] - res[start]["date"]).total_seconds() - if diff_sec > 0 and diff_level > 3: - speed = car.get_charge_speed(diff_level, diff_sec) - battery_curves.append({"level": start_level, "speed": speed}) - start = end - battery_curves.append({"level": row["end_level"], "speed": speed}) + if len(res) > 0: + battery_capacity = res[-1]["level"] * car.battery_power / 100 + km_by_kw = 0.8 * res[-1]["autonomy"] / battery_capacity + start = 0 + speeds = [] + + def speed_in_kw_from_km(row): + try: + speed = row["rate"] / km_by_kw + if speed > 0: + speeds.append(speed) + except (KeyError, TypeError): + pass + + for end in range(1, len(res)): + start_level = res[start]["level"] + end_level = res[end]["level"] + diff_level = end_level - start_level + diff_sec = (res[end]["date"] - res[start]["date"]).total_seconds() + speed_in_kw_from_km(res[end - 1]) + if diff_sec > 0 and diff_level > 3: + speed_in_kw_from_km(res[end]) + speed = car.get_charge_speed(diff_level, diff_sec) + if len(speeds) > 0: + speed = mean([*speeds, speed]) + speed = round(speed * 2) / 2 + battery_curves.append({"level": start_level, "speed": speed}) + start = end + speeds = [] + battery_curves.append({"level": row["end_level"], "speed": 0}) + else: + speed = car.get_charge_speed(row["end_level"]-row["start_level"], (stop_at-start_date).total_seconds()) + battery_curves.append({"level": row["start_level"], "speed": speed}) + battery_curves.append({"level": row["end_level"], "speed": speed}) fig = px.line(battery_curves, x="level", y="speed") fig.update_layout(xaxis_title="Battery %", yaxis_title="Charging speed in kW") return html.Div(Graph(figure=fig))