feat: manual odometer baseline — Settings field computes baseline + trip distance, Dashboard shows (manual) label

This commit is contained in:
Mathieu Moran
2026-08-11 18:51:11 -04:00
parent 887a001723
commit 34253b3ffb
7 changed files with 58 additions and 30 deletions
+13 -2
View File
@@ -26,8 +26,11 @@ def _setting_bool(key, env_name=None, default=False):
return app_sql.get_setting(key, fallback) == "1"
def _number_value(setting_key, converter):
default = app_alerts.SETTING_DEFAULTS[setting_key]
def _number_value(setting_key, converter, fallback=None):
if fallback is not None:
default = fallback
else:
default = app_alerts.SETTING_DEFAULTS[setting_key]
try:
return converter(app_sql.get_setting(setting_key, default))
except (TypeError, ValueError):
@@ -53,6 +56,7 @@ def get_settings():
"ntfy_token_configured": bool(
app_sql.get_setting("alert_ntfy_token", "")
),
"odometer_baseline": _number_value("odometer_baseline", float, 0),
"alert_thresholds": {
field: _number_value(setting_key, converter)
for field, (
@@ -132,6 +136,10 @@ def update_settings(body):
if values["cellular_enabled"] and not apn:
errors["cellular_apn"] = "An APN is required when cellular is enabled."
values["odometer_baseline"] = _bounded_number(
body, "odometer_baseline", float, 0, 999_999, errors
)
ntfy_url = body.get("ntfy_url")
ntfy_token = body.get("ntfy_token")
if not isinstance(ntfy_url, str):
@@ -199,6 +207,9 @@ def update_settings(body):
for setting_key, _converter, _minimum, _maximum in _NUMBER_FIELDS.values():
settings[setting_key] = str(values[setting_key])
if values["odometer_baseline"] is not None:
settings["odometer_baseline"] = str(values["odometer_baseline"])
if values["clear_ntfy_url"]:
settings["alert_ntfy_url"] = ""
elif ntfy_url:
+6 -1
View File
@@ -457,6 +457,10 @@ def get_overview_stats():
video_count = sum(1 for _ in _av.list_local_videos().get("files", []))
except Exception:
video_count = 0
from modules import app_settings
base = app_settings._number_value("odometer_baseline", float, 0)
cumul = conn.execute("SELECT COALESCE(SUM(DISTANCE_KM), 0) FROM trips").fetchone()
computed = base + (cumul[0] if cumul else 0)
return {
"trip_count": row[0],
"total_km": row[1],
@@ -464,7 +468,8 @@ def get_overview_stats():
"all_time_max_speed": row[3],
"active_dtc": dtc_row[0] if dtc_row else 0,
"video_count": video_count,
"odometer_km": odo_row[0] if odo_row and odo_row[0] else None,
"odometer_km": computed if base > 0 else (odo_row[0] if odo_row and odo_row[0] else None),
"odometer_source": "manual" if base > 0 else "obd",
}