Le cycle fondamental du moteur : comment un déplacement GPS se transforme en données structurées. 25 cas d'usage couvrant l'ouverture, l'accumulation de métriques, la fermeture, la grace period, la classification, le suivi moteur et les labels chauffeur.
ended_at = stop.started_at (le trajet se termine au moment où le véhicule s'est immobilisé, pas au moment où le moteur détecte l'arrêt). La table trips impose une seule trip ouverte par véhicule via UNIQUE INDEX WHERE state = 'open'.
quality_flag = 'accepted' et qu'aucun trip n'est ouvert pour ce véhicule, un nouveau trip est créé.close_cause='stop' et ended_at = stop.started_at.fuel_start_pct est capturé depuis le capteur FLS, et can_fuel_consumed baseline depuis le compteur CAN cumulatif (si disponible). Ces valeurs servent de référence pour le calcul de consommation à la fermeture.fuel_consumed_liters (CAN delta ou FLS delta x capacite reservoir), fuel_efficiency_l100km, fillings_count et fillings_volume_liters (ravitaillements pendant le trip), idle_fuel_liters (CAN idle delta si disponible).can_fuel_consumed est mis a NULL et le calcul retombe sur FLS : (fuel_start_pct - fuel_end_pct) x tank_capacity_liters. Le delta négatif n'est JAMAIS traité comme zero.activeWaypointVisits). Si oui, started_in_waypoint_id est enregistré sur le trip. Permet d'afficher "Depart de Garoua" sans jointure waypoint_visits.ended_in_waypoint_id est enregistré. La carte de detail du trip affiche "arrive a Plaines" directement via FK.LAG(ended_at) et fenêtre de 14 400s. Ce n'est PAS matérialisé — c'est un paramètre de requête pour le Vehicle Diary et les rapports.trip_started (severity: info, status: closed) est publié vers la queue d'evaluation. Visible sur le dashboard fleet et le portail de suivi. Pas de WhatsApp par défaut.trip_completed (info, closed) est publié. Contient les métriques finales : distance, durée, consommation. Visible dashboard + portail.started_at = stationarySince (le moment réel d'immobilisation), PAS le timestamp de la position courante. Un gap de données ne décale pas le started_at.closing_grace, 120s). En DB, l'arrêt reste state='open'. Cela évite les faux départs (manoeuvre au parking, déplacement au poste de pesée).ended_at, fuel_delta_liters, idle_at_stop_seconds, engine_off_at_stop_seconds et duration_seconds sont enregistrés.is_authorized = true. Sinon, is_authorized = false. C'est un fait, pas un jugement.ignitionOnSeconds / ignitionOffSeconds. Le delta depuis lastIgnitionChangeAt est ajoute au compteur correspondant. À la fermeture, les valeurs sont persistees.fuel_delta_liters est calcule a partir de la télémétrie aux bornes de l'arrêt (FLS debut vs FLS fin). C'est un champ de commodité pour le journal de bord — la détection fine des drains/remplissages se fait en continu via le step 8b (fuel state machine).unauthorized_stop (warning) ne se déclenche PAS sur chaque arrêt non-enregistré. Elle est contextuelle :unauthorized_stop n'est pas acquitté (status='open') après 30 minutes, le cron l'escalade de warning à critical. Une nouvelle notification WhatsApp immédiate est envoyée. Les événements en status 'investigating' ou 'action_taken' ne sont PAS escaladés.unauthorized_stop associe a cet arrêt est automatiquement résolu : status = 'auto_resolved'. L'auto-résolution cible les status 'open' et 'investigating'. Les 'action_taken' nécessitent une résolution humaine.vehicle_id + timestamp à +/- 5 min.| # | Heure | Position | Vitesse | Action du moteur |
|---|---|---|---|---|
| P1 | 08:00:00 | Entrepôt Douala (4.0483, 9.7043) | 0 km/h |
STOP Arrêt ouvert (stationarySince = 07:57:00, il y a 180s). is_authorized=true (dépôt). SKIP Pas de trip ouvert → cold start, pas de trip zero-durée (UC #5). |
| P2 | 08:12:30 | Sortie entrepôt (4.0490, 9.7055) | 18 km/h |
STOP Mouvement détecté, distance = 140m → closing_grace (en mémoire, 120s). DB : arrêt reste state='open'. |
| P3 | 08:13:15 | Route Bonaberi (4.0512, 9.7080) | 42 km/h |
STOP Distance depuis arrêt = 450m > 200m → StopClosed. Durée : 15m30s. Moteur ON : 15m30s. TRIP TripOpened. started_in_waypoint_id = Entrepôt Douala. fuel_start_pct = 78%. EVENT trip_started publié (info, dashboard + portail). |
| P4 | 08:15:00 | Pont Wouri (4.0550, 9.7120) | 55 km/h |
TRIP TripExtended. +580m. driving_seconds += 105s. speed_range_1 += 105s. DIST accumulateDistance : +580m cumulatif. |
| P5-P25 | 08:15→09:45 | Route nationale N3, Douala → Edea | 60-85 km/h |
TRIP TripExtended x21. distance += ~120km. driving_seconds croissant. speed_range_1 (0-60) += quelques secondes, speed_range_2 (60-90) += majorite. DIST Accumulation continue. |
| P26 | 09:48:00 | Entrée Edea (3.8000, 10.1330) | 35 km/h | TRIP TripExtended. distance totale = 131.2 km. |
| P27 | 09:50:00 | Station Edea (3.7985, 10.1355) | 5 km/h | TRIP TripExtended. distance = 132.8 km. idle_seconds += (moteur ON, vitesse basse). |
| P28 | 09:50:30 | Station Edea (3.7984, 10.1356) | 0 km/h |
TRIP TripExtended. distance = 133.0 km. idle_seconds continue. SKIP Immobile, mais stationarySince = maintenant. Pas encore 180s. |
| P29-P32 | 09:51→09:53 | Station Edea (immobile) | 0 km/h |
TRIP TripExtended (idle). Accumulateur allumage : ignitionOnSeconds croissant. SKIP Immobile 150s. Pas encore 180s. |
| P33 | 09:53:30 | Station Edea (immobile, 180s) | 0 km/h |
STOP StopOpened. started_at = 09:50:30 (stationarySince). is_authorized=true (fuel_station). nearest_waypoint = Station Edea. TRIP TripClosed. ended_at = 09:50:30 (= stop.started_at). close_cause='stop'. ended_in_waypoint_id = Station Edea. distance = 133.0 km, driving_seconds = 5670s (1h34m30s), max_speed = 85 km/h. fuel_end_pct = 62%. fuel_consumed = 64L. efficiency = 48.1 L/100km. EVENT trip_completed publié. Accumulateur allumage demarre pour l'arrêt. |
| P34-P40 | 09:54→10:12 | Station Edea (immobile, remplissage) | 0 km/h |
STOP Arrêt ouvert. ignitionOnSeconds croissant (moteur ON pendant remplissage). FLS monte progressivement de 62% a 85% → fuel state machine détecte FuelFillingStarted/Ended. |
| P41 | 10:14:00 | Sortie station (3.7990, 10.1340) | 22 km/h | STOP Mouvement détecté. Distance = 180m → closing_grace (< 200m). |
| P42 | 10:14:45 | Route N3 direction Kribi (3.7995, 10.1310) | 38 km/h |
STOP Distance = 520m > 200m → StopClosed. Durée : 24m15s. idle_at_stop = 24m15s (moteur ON tout le long). fuel_delta = +92L. TRIP TripOpened (Trip #2). started_in_waypoint_id = Station Edea. fuel_start_pct = 85%. EVENT trip_started publié. Prochaine étape : Kribi. |