BMW E90 325D — Systeme Vehiculaire Intelligent

CarTrack

Transformer une BMW E90 325D (M57 diesel inline-6) en entite connectee avec telemetrie temps reel, agent IA autonome "Jarvis" et retroaction physique.

4G
LilyGO T-A7670G
BLE
OBDLink CX + Fibre
100GB
FREE SIM / mois
10k+
Objectif utilisateurs
Jarvis
Agent IA Claude

01 Vision du Projet

Un systeme distribue complet, du bus CAN au dashboard cloud, avec un agent IA proactif.

L'objectif est de creer un pont intelligent entre les calculateurs internes d'une BMW E90 325D (moteur M57 diesel inline-6, 2007) et une interface utilisateur moderne. Le systeme capture les donnees en temps reel via OBD-II (standard + PIDs proprietaires BMW via protocole UDS), les transmet au cloud via 4G, les analyse avec un agent IA autonome ("Jarvis"), et permet une retroaction physique sur le vehicule (eclairage fibre optique SUNKENET, alertes SMS).

Le projet est concu comme multi-tenant des le depart, avec un objectif de scalabilite progressif : 1 utilisateur, puis 20, 100, 1 000, et enfin 10 000+ vehicules connectes simultanement.

Philosophie : Chaque composant est autonome et resilient. Si le cloud tombe, le module local continue de fonctionner. Si la batterie faiblit, le systeme se protege tout seul. L'IA n'est pas un simple chatbot — c'est un agent autonome capable de lire les emails, consulter le calendrier, trouver les stations essence pas cheres, et agir sur le vehicule de maniere proactive.

02 Vehicule Cible

BMW E90 325D 2007 — Moteur M57 diesel inline-6.

CaracteristiqueDetail
ModeleBMW 325D E90 (2007)
MoteurM57 — diesel inline-6 cylindres
Bus CAN500 kbps, OBD-II standard
PIDs avancesProtocole UDS (BMW proprietaire) — temperature huile, pression common rail, DPF, pression turbo
Emplacement moduleCoffre, pres de la batterie

03 Choix de la Stack

Chaque technologie a ete choisie pour une raison precise.

CoucheTechnologieJustification
FrontendReact 19 + Vite 8 + TailwindCSS + RechartsDashboard SPA type Tesla, rendu temps reel, prototypage rapide
BackendSymfony 8 (architecture hexagonale)Rigueur temporelle, ecosysteme mature, Domain/Application/Infrastructure
Base de donneesPostgreSQL + PostGISJSONB flexible, geographie native, partitionnement temporel
Temps reelMercure (SSE)Push serveur, pas de polling client
Passerelle IoTLilyGO T-A7670G (ESP32)4G + BLE + GPS en un seul module
DiagnosticOBDLink CX (BLE)BLE natif, stable sur bus CAN 500kbps
EclairageSUNKENET 20W RGBW Meteor1000 fibres 0.75mm, controleur BLE, deja installe
IAClaude (licence entreprise MAX)Agent autonome avec function calling — remplace OpenAI
HostingAWS (ECS/Fargate + RDS + SQS)Scalable, infrastructure as code
QueueRabbitMQ / SQSIngestion asynchrone de la telemetrie haute frequence

04 Architecture Globale

Le flux de donnees du capteur BMW M57 au dashboard cloud.

1

Capture

LilyGO interroge l'OBDLink CX via BLE — PIDs standard (010C RPM, 0105 temperature) + PIDs BMW proprietaires via UDS (temperature huile, pression common rail, DPF, pression turbo).

2

Analyse Locale

Decisions instantanees sur l'ESP32. Ex: RPM > 4000 → fibre optique SUNKENET rouge. Latence < 50ms.

3

Transmission

Compilation JSON [RPM, GPS, Vbatt, oil_temp, rail_pressure, dpf_soot, turbo_boost] et envoi HTTPS POST via modem 4G (SIM FREE 100GB/mois) vers l'API Symfony.

4

Persistance

Symfony stocke en PostgreSQL (table telemetry avec JSONB + PostGIS). Schema multi-tenant pour isoler les donnees par utilisateur. Queue SQS pour l'ingestion haute frequence.

5

Intelligence — Jarvis

Agent IA Claude avec function calling. Analyse les tendances, consulte les emails/calendrier, cherche les stations essence (API prix-carburants.gouv.fr), envoie des suggestions proactives via Mercure ou SMS.

6

Visualisation

Le dashboard React 19 recoit les mises a jour en temps reel via Mercure SSE. Graphiques Recharts, carte GPS, jauges animees.

05 Modules du Projet

Chaque domaine est documente en detail.

06 Jarvis — Agent IA Autonome

Pas un simple chatbot, mais un agent proactif capable d'agir sur le vehicule et l'environnement de l'utilisateur.

Connecteurs

Gmail/Outlook API, Google Calendar, SMS via SIM secondaire. Jarvis lit les emails, connait votre agenda, et anticipe vos besoins.

APIs externes

Knowledge Graph

Apprentissage des habitudes utilisateur : lieux frequents, horaires de deplacement, preferences. Suggestions proactives basees sur le contexte.

Apprentissage

Tools (Function Calling)

Recherche station essence (API prix-carburants.gouv.fr), calcul d'itineraire, changement couleur fibre, envoi SMS/push, lecture email.

Claude Agent

Actions Vehicule

Changement couleur fibre optique SUNKENET, envoi SMS urgent, notifications push, reboot module a distance. L'IA agit, pas seulement conseille.

Retroaction

07 Roadmap (4 Phases)

Approche incrementale par phases.

Phase 1 — MVP Web (livrable projet M2)

Dashboard React 19 temps reel (RPM, vitesse, temperature, graphiques GPS). API Symfony 8 : ingestion + historique + push Mercure. PostgreSQL multi-tenant. Simulateur firmware Python (deja construit). Deploiement AWS (ECS + RDS) avec domaine reel.

Phase 2 — Hardware

Commande et integration du LilyGO T-A7670G. Firmware de base : lecture OBD, envoi vers l'API. Mapping des PIDs specifiques BMW M57 (protocole UDS). Controle BLE du kit fibre optique SUNKENET.

Phase 3 — Jarvis AI

Connecteur email (Gmail/Outlook API). Connecteur calendrier (Google Calendar). Integration API prix-carburants.gouv.fr. Agent Claude avec tools (function calling). Suggestions proactives basees sur les habitudes.

Phase 4 — Scale

Queue d'ingestion (SQS) pour la telemetrie haute frequence. Partitionnement temporel PostgreSQL. Multi-tenant complet (auth, isolation des donnees). Application mobile (notifications push).

08 Scalabilite

Architecture pensee pour croitre de 1 a 10 000+ utilisateurs.

1
Prototype perso
20
Beta testers
100
Early adopters
1k
Lancement public
10k+
Objectif final

09 Securite

Protection a chaque couche du systeme.

🔒

HTTPS + Fingerprint

Connexion HTTPS avec verification d'empreinte du certificat SSL sur l'ESP32. Protection contre les attaques MITM.

TLS
🔑

X-Device-Token

Chaque module possede un token unique. Hash bcrypt stocke en base, token en NVS chiffre sur l'ESP32. Validation a chaque requete.

IoT Auth
🛡

JWT Utilisateur

Endpoints dashboard proteges par JWT via LexikJWTAuthenticationBundle. Token renouvele via refresh token.

Auth

Validation IA

Toutes les function calls de l'agent Claude sont validees par Symfony avant execution. L'IA ne peut pas envoyer de commandes arbitraires au vehicule.

AI Safety

Point critique : Ce projet est un systeme distribue. La difficulte reside dans la gestion de la latence et de la stabilite electrique. Soigner l'alimentation 12V → 5V avec un convertisseur DC-DC et des condensateurs de filtrage pour absorber les parasites de l'alternateur du M57.

API Overview

Liste complete des endpoints REST exposes par l'API Symfony 8.

MethodeEndpointAuthDescription
POST/api/telemetryX-Device-TokenIngestion telemetrie depuis le module IoT
GET/api/telemetry/{device}/latestJWTDerniere telemetrie connue pour un device
GET/api/telemetry/{device}/historyJWTHistorique telemetrie avec filtres temporels
GET/api/tripsJWTListe des trajets enregistres (trace PostGIS)
POST/api/commandJWTEnvoi commande au module (fibre, reboot...)
POST/api/jarvis/chatJWTEnvoyer une question a l'agent IA Jarvis
GET/api/jarvis/actionsJWTHistorique actions executees par Jarvis
POST/webhook/smsX-Device-TokenReception SMS entrant (webhook modem)
GET/api/fuel/stationsJWTStations essence proches (prix-carburants.gouv.fr)
GET/api/firmware/latestX-Device-TokenVersion firmware disponible pour OTA
POST/api/auth/loginPublicAuthentification utilisateur, retourne JWT
POST/api/auth/refreshRefresh TokenRenouvellement du token JWT

Swagger / OpenAPI

La documentation interactive de l'API est generee automatiquement par NelmioApiDocBundle et accessible via Swagger UI.

Acces : Swagger UI est disponible a l'adresse /api/doc en environnement de developpement. Il documente tous les endpoints, les schemas de requete/reponse, les codes d'erreur et les methodes d'authentification (JWT et X-Device-Token).

  • URL locale : http://localhost:8080/api/doc
  • Format : OpenAPI 3.0 (JSON disponible a /api/doc.json)
  • Annotations : Les controllers Symfony utilisent les attributs #[OA\Tag], #[OA\Response], #[OA\Parameter] de NelmioApiDocBundle
  • Try it out : Swagger UI permet de tester les endpoints directement depuis le navigateur avec un JWT

Quick Start Dev

Demarrer l'environnement de developpement complet en quelques commandes.

1

Cloner le depot

git clone git@github.com:your-org/cartrack.git && cd cartrack

2

Installer les dependances

make install — installe les dependances backend (Composer) et frontend (npm).

3

Lancer Docker

make dev-docker — demarre PostgreSQL, Mercure Hub, et le serveur Symfony en mode dev.

4

Lancer le simulateur firmware

make sim-dry — demarre le simulateur Python qui envoie des donnees telemetriques factices a l'API.

5

Ouvrir le dashboard

Ouvrir http://localhost:5174 dans le navigateur. Le dashboard React recoit les donnees en temps reel via Mercure.

Variables d'Environnement

Variables configurables dans les fichiers .env du backend et du frontend.

Backend (Symfony)

VariableDescriptionValeur par defaut
APP_ENVEnvironnement Symfony (dev, prod, test)dev
APP_SECRETSecret applicatif Symfony (CSRF, cookies)vide (obligatoire)
APP_SHARE_DIRRepertoire de fichiers partagesvar/share
DEFAULT_URIURI par defaut pour la generation d'URL CLIhttp://localhost
DATABASE_URLDSN PostgreSQL (Doctrine)postgresql://app:!ChangeMe!@127.0.0.1:5432/app
JWT_SECRET_KEYChemin cle privee JWT (LexikJWTAuthenticationBundle)config/jwt/private.pem
JWT_PUBLIC_KEYChemin cle publique JWTconfig/jwt/public.pem
JWT_PASSPHRASEPassphrase pour la cle JWTgenere a l'installation
MERCURE_URLURL du Hub Mercure (publication interne)https://example.com/.well-known/mercure
MERCURE_PUBLIC_URLURL publique du Hub Mercure (souscription navigateur)https://example.com/.well-known/mercure
MERCURE_JWT_SECRETSecret pour signer les JWT Mercurea changer obligatoirement

Frontend (Vite)

VariableDescriptionValeur par defaut
VITE_API_URLURL de base de l'API Symfonyhttp://localhost:8080
VITE_MERCURE_URLURL publique du Hub Mercurehttp://localhost:3000/.well-known/mercure
VITE_APP_NAMENom affiche dans le dashboardCarTrack