Python en IN-SIGHT
Python es el lenguaje principal del stack de análisis de IN-SIGHT, presente en ambos extremos del sistema: edge y nube. Su combinación de productividad de desarrollo, ecosistema científico maduro (NumPy, SciPy, scikit-learn) y capacidad de JIT compilation (numba) lo hace viable tanto para el código embebido del CM4 como para los pipelines de análisis en Azure.
Edge — Raspberry CM4 (Python 3.11)
- Adquisición MEMS: Lectura SPI a través de
spidev a 6.667 Hz con buffer doble para evitar gaps.
- DSP:
scipy.signal para filtros IIR, ventanas Hann y FFT. Módulos críticos compilados con numba @jit para reducir latencia de 40 ms a 4 ms.
- EKF: Implementación NumPy vectorizada del Filtro de Kalman Extendido. Matrices de estado en memoria contigua (C-order) para máxima eficiencia de caché.
- MQTT:
paho-mqtt con reconexión automática y cola persistente para resiliencia en túneles.
Cloud — Azure Functions + AKS (Python 3.12)
- Pipeline de ingestión: Azure Functions procesan los eventos de IoT Hub, enriquecen con metadatos de flota y escriben en ADX.
- EKF cloud: Ejecución paralela del EKF para toda la flota con
Dask. Un worker por vehículo, escalado automático.
- API del portal:
FastAPI sirve los datos de alertas y tendencias al frontend del portal.
- Modelos predictivos:
scikit-learn para modelos de RUL (Random Forest, Gradient Boosting). Re-entrenamiento mensual con datos históricos de ADX.
KQL — Kusto Query Language
KQL es el lenguaje de consulta declarativo de Azure Data Explorer. Su filosofía es pipe-based: el resultado de cada operador fluye al siguiente, similar a Unix pipes pero con semántica de tablas y optimizaciones nativas para series temporales.
KQL incluye primitivas especializadas que serían complejas de implementar en SQL estándar: series_fit_line() para regresión en series, series_decompose_anomalies() para detección automática de anomalías, make_series para pivotear datos en arrays temporales densos, y funciones de correlación cruzada entre señales.
Queries clave en IN-SIGHT
// Tendencia de deterioro — últimas 4 semanas
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
// Resumen de salud de flota en tiempo real
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
Alertas programadas con KQL
Azure Data Explorer permite definir scheduled queries: consultas KQL que se ejecutan automáticamente cada N minutos y pueden disparar notificaciones cuando el resultado supera un umbral. IN-SIGHT usa este mecanismo para detectar tendencias lentas que el EKF local no detectaría (el EKF es óptimo para anomalías súbitas; las tendencias graduales durante semanas requieren contexto histórico).
// Alerta de tendencia — se ejecuta cada 6 horas
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 // deterioro > 0.5% RMS/hora
and rsq > 0.7 // tendencia estadísticamente significativa
| project vehicle_id, slope, rsq