ClOS est un tableau de bord automobile modulaire en Python/PySide6, conçu pour fonctionner sur Raspberry Pi ou sur poste de développement.
Le projet centralise la télémétrie véhicule (CAN/OBD), les services embarqués (session, diagnostics, monitoring) et une interface QML temps réel.
- Lecture CAN via
python-can(SocketCAN) avec décodage de signaux. - Diagnostic OBD (scan de défauts) intégré au bus CAN.
- Interface QML (PySide6) avec pages de conduite, services et réglages.
- Gestion de session trajet (pause/reprise/fin) et export de synthèse.
- Calculs de statistiques trajet (distance, consommation, coût, maintenance).
- Services optionnels: son moteur, LED BLE, monitoring système.
- Mode simulation (
--mock) pour développer sans véhicule.
main.py: point d'entrée, initialisation des services et lancement UI/CLI.src/api.py: état partagé thread-safe entre services et interface.src/orchestrator.py: cycle de vie des services (start/stop, health).src/services/: services métiers (CAN, diag, stats, puissance, etc.).src/qt_bridge.py: pont Qt entre backend Python et frontend QML.frontend/: interface QML (vues, pages, composants).data/: profils véhicule, configuration, sauvegardes et trajets.
Le projet inclut un système de logs asynchrone à faible overhead:
- fichier JSONL rotatif:
data/logs/clios.log.jsonl - trace fatale:
data/logs/fatal_tracebacks.log - buffer mémoire des derniers événements (consultable depuis l'UI)
- hooks globaux (
sys.excepthook,threading.excepthook,faulthandler) - export d'un bundle de diagnostic depuis la page Journal système
cd /path/to/CliOS
python3 -m pip install -r requirements.txtpython3 -u main.py --ui guipython3 -u main.py --ui gui --mockpython3 -u main.py --ui cli --mock# Niveau de logs
python3 -u main.py --ui gui --mock --log-level DEBUG
# Autoriser une version PySide6 non recommandée
python3 -u main.py --ui gui --mock --allow-unsupported-pyside- profils:
data/config/profiles.json - configurations véhicule:
data/config/*.json - définitions CAN:
data/can/*.json - sauvegardes dashboard:
data/dash_save/*.json - exports trajets:
data/trips*/trip_*.json
Le service Export scanne périodiquement les périphériques montés et déclenche un export quand il trouve un fichier clos_export.json à la racine de la clé USB.
- Brancher la clé USB.
- Créer un fichier
clos_export.jsonà la racine de la clé. - Mettre un contenu JSON valide, par exemple:
{
"target_folder": "ClOS_Exports"
}target_folder est optionnel (défaut: ClOS_Exports).
- Le service parcourt le
data_dirconfiguré côté backend. - Seuls les fichiers
.jsonsont copiés. - La copie est atomique (
.tmppuis renommage) pour éviter les fichiers partiels. - Si l'option
delete_afterest activée dans l'UI, la source locale est supprimée après copie.
- Par défaut: export uniquement si le fichier a changé (signature
nom|taille|mtime_ns). - Action manuelle possible dans la page Services: bouton
Ré-exporter tout(paramètrereexport_all).
Deux historiques sont conservés:
- Historique local (persisté dans le save profil):
- clé:
services.Export.history_v2 - emplacement physique:
data/dash_save/*.json(profil actif)
- clé:
- Historique sur clé USB:
- fichier:
.clios_export_history.json - emplacement:
<target_folder>/.clios_export_history.json
- fichier:
Ces historiques évitent les doublons et permettent de reprendre proprement les exports.
- Vérifier que
clos_export.jsonest bien à la racine de la clé (pas dans un sous-dossier). - Vérifier que le JSON est valide.
- Vérifier que le service
Exportest activé dans la page Services. - Vérifier les logs dans
data/logs/clios.log.jsonl.
- utiliser des versions PySide6 homogènes (
PySide6,PySide6-Addons,PySide6-Essentials,shiboken6) - valider la disponibilité de la sortie audio avant d'activer le service son
- privilégier le mode
--mockpour isoler l'interface pendant les tests
- Créer une branche de travail.
- Appliquer les changements avec validation locale.
- Ouvrir une Pull Request avec une description technique claire.
Projet distribué sous licence GPLv3 (voir LICENSE).
