mirror of
https://github.com/flobz/psa_car_controller.git
synced 2026-08-26 10:17:18 +00:00
Merge pull request #43 from jlayec/feature-hybrid_compatibility
update slider, DEBUGV for trip algo, fix without charge control
This commit is contained in:
+11
-1
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
|
||||
+1
-1
@@ -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):
|
||||
|
||||
+18
-8
@@ -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([
|
||||
|
||||
Reference in New Issue
Block a user