diff --git a/ChargeControl.py b/ChargeControl.py index 6686491..9b0b213 100644 --- a/ChargeControl.py +++ b/ChargeControl.py @@ -9,45 +9,6 @@ from MyPSACC import MyPSACC from MyLogger import logger from psa_connectedcar.rest import ApiException - -class ChargeControls: - - def __init__(self): - self.list: dict = {} - self._confighash = None - - def save_config(self, name="charge_config.json", force=False): - chd = {} - for key, el in self.list.items(): - chd[el.vin] = {"percentage_threshold": el.percentage_threshold, "stop_hour": el._stop_hour} - config_str = json.dumps(chd, sort_keys=True, indent=4).encode('utf-8') - new_hash = md5(config_str).hexdigest() - if force or self._confighash != new_hash : - with open(name, "wb") as f: - f.write(config_str) - self._confighash = new_hash - logger.info("save config change") - - def load_config(psacc:MyPSACC, name="charge_config.json"): - with open(name, "r") as f: - str = f.read() - chd = json.loads(str) - charge_control_list = ChargeControls() - for vin, el in chd.items(): - charge_control_list.list[vin] = ChargeControl(psacc,vin,**el) - return charge_control_list - - def get(self,vin): - try: - return self.list[vin] - except KeyError: - return None - - def start(self): - for vin, charge_control in self.list.items(): - charge_control.start() - - class ChargeControl: periodicity = 120 MQTT_TIMEOUT = 60 @@ -125,3 +86,41 @@ class ChargeControl: return chd +class ChargeControls: + + def __init__(self): + self.list: dict = {} + self._confighash = None + + def save_config(self, name="charge_config.json", force=False): + chd = {} + for key, el in self.list.items(): + chd[el.vin] = {"percentage_threshold": el.percentage_threshold, "stop_hour": el._stop_hour} + config_str = json.dumps(chd, sort_keys=True, indent=4).encode('utf-8') + new_hash = md5(config_str).hexdigest() + if force or self._confighash != new_hash : + with open(name, "wb") as f: + f.write(config_str) + self._confighash = new_hash + logger.info("save config change") + + def load_config(psacc:MyPSACC, name="charge_config.json"): + with open(name, "r") as f: + str = f.read() + chd = json.loads(str) + charge_control_list = ChargeControls() + for vin, el in chd.items(): + charge_control_list.list[vin] = ChargeControl(psacc,vin,**el) + return charge_control_list + + def get(self,vin) -> ChargeControl: + try: + return self.list[vin] + except KeyError: + return None + + def start(self): + for vin, charge_control in self.list.items(): + charge_control.start() + + diff --git a/MyPSACC.py b/MyPSACC.py index 25b0941..57cd1be 100644 --- a/MyPSACC.py +++ b/MyPSACC.py @@ -413,16 +413,24 @@ class MyPSACC: date = res.last_position.properties.updated_at mileage = res.timed_odometer.mileage level = res.energy[0]["level"] - try: - conn = get_db() - conn.execute("INSERT INTO position(Timestamp,VIN,longitude,latitude,mileage,level) VALUES(?,?,?,?,?,?)", - (date, vin, longitude, latitude, mileage, level)) - conn.commit() - logger.info(f"new position recorded for {vin}") - except sqlite3.IntegrityError: - logger.debug("position already saved") - finally: - conn.close() + charging_status = res.energy[0]['charging']['status'] + if mileage == 0: # fix a bug of the api + logger.error(f"The api return a wrong mileage for {vin} : {mileage}") + else: + try: + conn = get_db() + conn.execute("INSERT INTO position(Timestamp,VIN,longitude,latitude,mileage,level) VALUES(?,?,?,?,?,?)", + (date, vin, longitude, latitude, mileage, level)) + conn.commit() + logger.info(f"new position recorded for {vin}") + except sqlite3.IntegrityError: + logger.debug("position already saved") + finally: + conn.close() + if charging_status is "InProgress": + #create a new line + pass + elif charging_status is "Stopped" or "Finnished" @staticmethod def get_recorded_position(): diff --git a/web/app.py b/web/app.py index ecc9583..f1d8fe6 100644 --- a/web/app.py +++ b/web/app.py @@ -7,6 +7,7 @@ import locale from werkzeug import run_simple, DispatcherMiddleware +from ChargeControl import ChargeControls from MyLogger import logger from MyPSACC import MyPSACC @@ -38,7 +39,7 @@ def start_app(title, base_path, debug: bool, host, port): myp = None -chc = None +chc: ChargeControls = None def save_config(my_peugeot: MyPSACC): diff --git a/web/callback.py b/web/callback.py index f858c6d..1141719 100644 --- a/web/callback.py +++ b/web/callback.py @@ -1,18 +1,18 @@ import json -import sqlite3 import traceback from datetime import datetime, timezone import dash_bootstrap_components as dbc from dash.dependencies import Output, Input import dash_core_components as dcc import dash_html_components as html + from MyLogger import logger from flask import jsonify, request, Response as FlaskResponse from MyPSACC import MyPSACC from web import figures -from web.app import app, dash_app, myp, chc, save_config +from web.app import app, dash_app, myp, chc import web.db trips = None @@ -86,11 +86,11 @@ def charge_control(): charge_control = chc.get(vin) if charge_control is None: return jsonify("error: VIN not in list") - if 'hour' in request.args or 'minute' in request.args: + if 'hour' in request.args and 'minute' in request.args: charge_control.set_stop_hour([int(request.args["hour"]), int(request.args["minute"])]) if 'percentage' in request.args: charge_control.percentage_threshold = int(request.args['percentage']) - myp.save_config() + chc.save_config() return jsonify(charge_control.get_dict()) diff --git a/web/db.py b/web/db.py index cfb5eaa..4246542 100644 --- a/web/db.py +++ b/web/db.py @@ -19,9 +19,10 @@ def get_db(): conn.row_factory = sqlite3.Row conn.execute("CREATE TABLE IF NOT EXISTS position (Timestamp DATETIME PRIMARY KEY, VIN TEXT, longitude REAL, " "latitude REAL, mileage REAL, level INTEGER);") + conn.execute("CREATE TABLE IF NOT EXISTS battery (start_at DATETIME PRIMARY KEY,stop_at DATETIME, start_level, " + "end_level)") conn.create_function("update_trips", 0, update_callback) - conn.execute( - "CREATE TEMP TRIGGER IF NOT EXISTS update_trigger AFTER INSERT ON position BEGIN SELECT update_trips(); END;") - conn.commit() + conn.execute("CREATE TEMP TRIGGER IF NOT EXISTS update_trigger AFTER INSERT ON position BEGIN " + "SELECT update_trips(); END;") conn.commit() return conn diff --git a/web/figures.py b/web/figures.py index 2806018..6fac114 100644 --- a/web/figures.py +++ b/web/figures.py @@ -68,6 +68,7 @@ def get_figures(trips: List[Trip]): table_fig = dash_table.DataTable( id='trips-table', sort_action='native', + sort_by=[{'column_id': 'start_at', 'direction': 'desc'}], columns=[{'id': 'start_at', 'name': 'start at', 'type': 'datetime'}, {'id': 'duration', 'name': 'duration', 'type': 'numeric', 'format': deepcopy(nb_format).symbol_suffix(" min").precision(0)},