Transformer une BMW E90 325D (M57 diesel inline-6) en entite connectee avec telemetrie temps reel, agent IA autonome "Jarvis" et retroaction physique.
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.
BMW E90 325D 2007 — Moteur M57 diesel inline-6.
| Caracteristique | Detail |
|---|---|
| Modele | BMW 325D E90 (2007) |
| Moteur | M57 — diesel inline-6 cylindres |
| Bus CAN | 500 kbps, OBD-II standard |
| PIDs avances | Protocole UDS (BMW proprietaire) — temperature huile, pression common rail, DPF, pression turbo |
| Emplacement module | Coffre, pres de la batterie |
Chaque technologie a ete choisie pour une raison precise.
| Couche | Technologie | Justification |
|---|---|---|
| Frontend | React 19 + Vite 8 + TailwindCSS + Recharts | Dashboard SPA type Tesla, rendu temps reel, prototypage rapide |
| Backend | Symfony 8 (architecture hexagonale) | Rigueur temporelle, ecosysteme mature, Domain/Application/Infrastructure |
| Base de donnees | PostgreSQL + PostGIS | JSONB flexible, geographie native, partitionnement temporel |
| Temps reel | Mercure (SSE) | Push serveur, pas de polling client |
| Passerelle IoT | LilyGO T-A7670G (ESP32) | 4G + BLE + GPS en un seul module |
| Diagnostic | OBDLink CX (BLE) | BLE natif, stable sur bus CAN 500kbps |
| Eclairage | SUNKENET 20W RGBW Meteor | 1000 fibres 0.75mm, controleur BLE, deja installe |
| IA | Claude (licence entreprise MAX) | Agent autonome avec function calling — remplace OpenAI |
| Hosting | AWS (ECS/Fargate + RDS + SQS) | Scalable, infrastructure as code |
| Queue | RabbitMQ / SQS | Ingestion asynchrone de la telemetrie haute frequence |
Le flux de donnees du capteur BMW M57 au dashboard cloud.
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).
Decisions instantanees sur l'ESP32. Ex: RPM > 4000 → fibre optique SUNKENET rouge. Latence < 50ms.
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.
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.
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.
Le dashboard React 19 recoit les mises a jour en temps reel via Mercure SSE. Graphiques Recharts, carte GPS, jauges animees.
Chaque domaine est documente en detail.
Dashboard React 19 + Vite 8, composants Recharts, integration Mercure SSE, TailwindCSS dark mode.
React 19 + MercureAPI Symfony 8 hexagonale, PostgreSQL multi-tenant, agent IA Claude, queue SQS, securite JWT.
Symfony 8 + ClaudeLilyGO T-A7670G, OBDLink CX, kit fibre SUNKENET 20W RGBW, alimentation 12V/5V, BMW E90.
ElectroniqueCode ESP32, gestion BLE double (OBD + fibre), PIDs BMW M57 UDS, deep sleep, OTA updates.
C++ / ArduinoPas un simple chatbot, mais un agent proactif capable d'agir sur le vehicule et l'environnement de l'utilisateur.
Gmail/Outlook API, Google Calendar, SMS via SIM secondaire. Jarvis lit les emails, connait votre agenda, et anticipe vos besoins.
APIs externesApprentissage des habitudes utilisateur : lieux frequents, horaires de deplacement, preferences. Suggestions proactives basees sur le contexte.
ApprentissageRecherche station essence (API prix-carburants.gouv.fr), calcul d'itineraire, changement couleur fibre, envoi SMS/push, lecture email.
Claude AgentChangement couleur fibre optique SUNKENET, envoi SMS urgent, notifications push, reboot module a distance. L'IA agit, pas seulement conseille.
RetroactionApproche incrementale par phases.
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.
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.
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.
Queue d'ingestion (SQS) pour la telemetrie haute frequence. Partitionnement temporel PostgreSQL. Multi-tenant complet (auth, isolation des donnees). Application mobile (notifications push).
Architecture pensee pour croitre de 1 a 10 000+ utilisateurs.
Protection a chaque couche du systeme.
Connexion HTTPS avec verification d'empreinte du certificat SSL sur l'ESP32. Protection contre les attaques MITM.
TLSChaque module possede un token unique. Hash bcrypt stocke en base, token en NVS chiffre sur l'ESP32. Validation a chaque requete.
IoT AuthEndpoints dashboard proteges par JWT via LexikJWTAuthenticationBundle. Token renouvele via refresh token.
AuthToutes 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 SafetyPoint 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.
Liste complete des endpoints REST exposes par l'API Symfony 8.
| Methode | Endpoint | Auth | Description |
|---|---|---|---|
POST | /api/telemetry | X-Device-Token | Ingestion telemetrie depuis le module IoT |
GET | /api/telemetry/{device}/latest | JWT | Derniere telemetrie connue pour un device |
GET | /api/telemetry/{device}/history | JWT | Historique telemetrie avec filtres temporels |
GET | /api/trips | JWT | Liste des trajets enregistres (trace PostGIS) |
POST | /api/command | JWT | Envoi commande au module (fibre, reboot...) |
POST | /api/jarvis/chat | JWT | Envoyer une question a l'agent IA Jarvis |
GET | /api/jarvis/actions | JWT | Historique actions executees par Jarvis |
POST | /webhook/sms | X-Device-Token | Reception SMS entrant (webhook modem) |
GET | /api/fuel/stations | JWT | Stations essence proches (prix-carburants.gouv.fr) |
GET | /api/firmware/latest | X-Device-Token | Version firmware disponible pour OTA |
POST | /api/auth/login | Public | Authentification utilisateur, retourne JWT |
POST | /api/auth/refresh | Refresh Token | Renouvellement du token JWT |
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).
http://localhost:8080/api/doc/api/doc.json)#[OA\Tag], #[OA\Response], #[OA\Parameter] de NelmioApiDocBundleDemarrer l'environnement de developpement complet en quelques commandes.
git clone git@github.com:your-org/cartrack.git && cd cartrack
make install — installe les dependances backend (Composer) et frontend (npm).
make dev-docker — demarre PostgreSQL, Mercure Hub, et le serveur Symfony en mode dev.
make sim-dry — demarre le simulateur Python qui envoie des donnees telemetriques factices a l'API.
Ouvrir http://localhost:5174 dans le navigateur. Le dashboard React recoit les donnees en temps reel via Mercure.
Variables configurables dans les fichiers .env du backend et du frontend.
| Variable | Description | Valeur par defaut |
|---|---|---|
APP_ENV | Environnement Symfony (dev, prod, test) | dev |
APP_SECRET | Secret applicatif Symfony (CSRF, cookies) | vide (obligatoire) |
APP_SHARE_DIR | Repertoire de fichiers partages | var/share |
DEFAULT_URI | URI par defaut pour la generation d'URL CLI | http://localhost |
DATABASE_URL | DSN PostgreSQL (Doctrine) | postgresql://app:!ChangeMe!@127.0.0.1:5432/app |
JWT_SECRET_KEY | Chemin cle privee JWT (LexikJWTAuthenticationBundle) | config/jwt/private.pem |
JWT_PUBLIC_KEY | Chemin cle publique JWT | config/jwt/public.pem |
JWT_PASSPHRASE | Passphrase pour la cle JWT | genere a l'installation |
MERCURE_URL | URL du Hub Mercure (publication interne) | https://example.com/.well-known/mercure |
MERCURE_PUBLIC_URL | URL publique du Hub Mercure (souscription navigateur) | https://example.com/.well-known/mercure |
MERCURE_JWT_SECRET | Secret pour signer les JWT Mercure | a changer obligatoirement |
| Variable | Description | Valeur par defaut |
|---|---|---|
VITE_API_URL | URL de base de l'API Symfony | http://localhost:8080 |
VITE_MERCURE_URL | URL publique du Hub Mercure | http://localhost:3000/.well-known/mercure |
VITE_APP_NAME | Nom affiche dans le dashboard | CarTrack |