improve charging curve

This commit is contained in:
Florian Bezannier
2021-10-02 16:35:26 +02:00
parent 3758843639
commit 086a56b4dd
4 changed files with 44 additions and 22 deletions
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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):
+5 -3
View File
@@ -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):
+36 -16
View File
@@ -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))