Python dans IN-SIGHT
Python est le langage principal de la stack d'analyse d'IN-SIGHT, présent aux deux extrémités du système : edge et cloud. Sa combinaison de productivité de développement, d'un écosystème scientifique mature (NumPy, SciPy, scikit-learn) et de compilation JIT (numba) le rend viable aussi bien pour le code embarqué du CM4 que pour les pipelines d'analyse sur Azure.
Edge — Raspberry CM4 (Python 3.11)
- Acquisition MEMS : Lecture SPI via
spidev à 6 667 Hz avec double buffer pour éviter les gaps.
- DSP :
scipy.signal pour les filtres IIR, fenêtres de Hann et FFT. Modules critiques compilés avec numba @jit pour réduire la latence de 40 ms à 4 ms.
- EKF : Implémentation NumPy vectorisée du Filtre de Kalman Étendu. Matrices d'état en mémoire contiguë (C-order) pour une efficacité de cache maximale.
- MQTT :
paho-mqtt avec reconnexion automatique et file persistante pour la résilience dans les tunnels.
Cloud — Azure Functions + AKS (Python 3.12)
- Pipeline d'ingestion : Les Azure Functions traitent les événements d'IoT Hub, les enrichissent avec des métadonnées de flotte et les écrivent dans ADX.
- EKF cloud : Exécution parallèle de l'EKF pour toute la flotte avec
Dask. Un worker par véhicule, mise à l'échelle automatique.
- API du portail :
FastAPI sert les données d'alertes et de tendances au frontend du portail.
- Modèles prédictifs :
scikit-learn pour les modèles de RUL (Random Forest, Gradient Boosting). Ré-entraînement mensuel avec les données historiques d'ADX.
KQL — Kusto Query Language
KQL est le langage de requête déclaratif d'Azure Data Explorer. Sa philosophie est pipe-based : le résultat de chaque opérateur s'écoule vers le suivant, à la manière des pipes Unix mais avec une sémantique de tables et des optimisations natives pour les séries temporelles.
KQL inclut des primitives spécialisées qui seraient complexes à implémenter en SQL standard : series_fit_line() pour la régression sur séries, series_decompose_anomalies() pour la détection automatique d'anomalies, make_series pour pivoter les données en tableaux temporels denses, et des fonctions de corrélation croisée entre signaux.
Requêtes clés dans IN-SIGHT
// Tendance de dégradation — 4 dernières semaines
telemetry
| where metric == "bearing_rms"
and vehicle_id == "TMB-5042"
and timestamp > ago(28d)
| make-series rms_avg = avg(value)
on timestamp
from ago(28d) to now()
step 1h
| extend anomalies = series_decompose_anomalies(
rms_avg, 1.5, -1, 'linefit')
| render anomalychart
// Résumé de santé de flotte en temps réel
telemetry
| where timestamp > ago(5m)
| summarize
last_rms = take_any(value),
alert_count = countif(alert_level != "OK")
by vehicle_id
| join kind=leftouter (
vehicles | project vehicle_id, line, depot
) on vehicle_id
| order by alert_count desc
Alertes programmées avec KQL
Azure Data Explorer permet de définir des scheduled queries : des requêtes KQL qui s'exécutent automatiquement toutes les N minutes et peuvent déclencher des notifications lorsque le résultat dépasse un seuil. IN-SIGHT utilise ce mécanisme pour détecter des tendances lentes que l'EKF local ne détecterait pas (l'EKF est optimal pour les anomalies soudaines ; les tendances graduelles sur des semaines nécessitent un contexte historique).
// Alerte de tendance — s'exécute toutes les 6 heures
telemetry
| where metric == "bearing_rms"
and timestamp between (ago(7d) .. ago(1d))
| make-series v = avg(value)
on timestamp step 6h
by vehicle_id
| extend (slope, intercept, rsq) =
series_fit_line_dynamic(v)
| where slope > 0.005 // dégradation > 0.5% RMS/heure
and rsq > 0.7 // tendance statistiquement significative
| project vehicle_id, slope, rsq