Maintenance prédictive
Détection d'anomalies et prévision de franchissement de seuil sur n'importe quelle mesure, dans un flow
Deux nœuds de flow transforment n'importe quelle mesure numérique en alerte précoce, sans modèle à entraîner ni pile data science :
- Détection d'anomalie signale les valeurs qui ne ressemblent pas au comportement récent de la série — un pic, une chute, un changement de régime — sans seuil fixe.
- Prévision extrapole la série et indique quand elle franchira un seuil : température de roulement, perte de charge d'un filtre, tension de batterie, niveau de cuve.
Les deux tournent dans le moteur de flows (Rust pur), gardent un historique par série dans Valkey (il survit aux redéploiements) et exposent une sortie booléenne faite pour piloter une Notification.
Cette page construit l'exemple complet ci-dessous sur des données simulées, sans aucun matériel : une pompe dont la vibration fait un pic toutes les 90 s et dont le roulement chauffe lentement vers 80 °C.

1. Simuler les mesures
Pas de capteur sous la main ? Une fonction peut générer des séries réalistes. Un nœud Inject sans payload émet l'horodatage courant chaque seconde ; la fonction en tire deux mesures, une par port de sortie :
// @output vibration number "Pump vibration (mm/s): noise, with a spike every 90 s"
// @output bearing_temp number "Bearing temperature (°C): slow drift from 55 to 85 °C over 30 min"
function handle(inputs, msg) {
// Simulated sensors driven by the inject timestamp (ms).
const t = Math.floor(Number(msg.payload) / 1000);
const spike = t % 90 < 2 ? 9 : 0;
const vibration = 2 + (Math.random() - 0.5) * 0.6 + spike;
// 30-minute cycle: the bearing heats up, then is "replaced".
const bearingTemp = 55 + (t % 1800) / 60 + (Math.random() - 0.5) * 0.4;
return {
vibration: Math.round(vibration * 100) / 100,
bearing_temp: Math.round(bearingTemp * 100) / 100,
};
}
Avec un vrai appareil, remplacer inject + fonction par un nœud Device (read) sur la pin, ou tout nœud qui produit un nombre.
2. Détecter les anomalies
Câbler vibration sur Détection d'anomalie. Le nœud chauffe (30 échantillons par
défaut), puis évalue chaque valeur par rapport à la fenêtre de sa série.

| Méthode | Détecte | Quand l'utiliser |
|---|---|---|
| Valeur aberrante (z-score robuste) | Pics et chutes isolés | Le choix sûr par défaut : sans modèle, insensible aux valeurs aberrantes qu'elle cherche |
| Hors bande de prévision | Valeurs hors de la bande prévue | Séries avec tendance ou cycle journalier (renseigner la saison) |
| Changement de régime | Changement durable de niveau ou de variabilité | Après une panne, une intervention, un réglage — un signal par changement |
Sorties : détail (valeur, score, bande attendue) et anomalie (true / false).
Dans l'exemple, chaque pic de vibration obtient un score d'environ 38 pour un seuil de
3,5 ; le bruit ne le franchit jamais.
3. Prévoir le franchissement
Câbler bearing_temp sur Prévision, choisir le modèle et fixer le seuil.

| Réglage | Exemple | Pourquoi |
|---|---|---|
| Modèle | Tendance linéaire | Dérive lente et usure. Le lissage exponentiel convient aux séries saisonnières |
| Fenêtre | 120 échantillons | Historique récent utilisé pour l'ajustement — plus court = réadaptation plus rapide après une maintenance |
| Horizon | 1000 pas | Jusqu'où regarder ; un pas = l'intervalle habituel entre deux échantillons |
| Seuil / Franchissement si | 80, au-dessus | Le niveau à surveiller |
Sorties : détail (points prévus avec bandes de confiance, date de franchissement),
franchissement (true quand le seuil est prévu dans l'horizon) et délai (s)
(secondes avant le franchissement prévu).
Dans l'exemple, à 66,7 °C et +1 °C par minute, le nœud prévoit le franchissement dans 791 s — la réponse exacte est 800 s — puis le délai décompte avec l'horloge.
L'horizon décide de la précocité de l'alerte. La valeur par défaut (48 pas) ne regarde que 48 s en avant sur une série échantillonnée chaque seconde : l'augmenter pour les phénomènes lents, ou échantillonner moins souvent (une Prévision alimentée une fois par minute avec un horizon de 1000 pas regarde 16 heures en avant).
4. Alerter sur le téléphone
Câbler les sorties booléennes sur le trigger d'un nœud Notification, et les valeurs sur les variables du template :
- anomalie → trigger de Vibration spike alert,
vibration→ sa variablevibration; - franchissement → trigger de Bearing breach alert, délai (s) → une petite
fonction qui l'arrondit en minutes → la variable
minutesdu templateBearing temperature forecast to reach 80 °C in about {{ minutes }} min.

Régler l'anti-spam (ici 1 message par 10 minutes) : une prévision reste en franchissement tant que la tendance tient.
Screenshot coming soon
public/screenshots/v0.1/v0.1/en/phone/ntfy-predict.webp — capture scenario: scripts/capture/run.mjs
5. Suivre sur un dashboard
Ajouter des nœuds Metric sur les mesures et sur le délai : ils apparaissent comme
sources flow_<id> dans les dashboards — jauge pour la
température, valeur pour le franchissement prévu, mini graphiques pour la dérive et les
pics.

Bon à savoir
- Une série par topic de message : un seul nœud peut surveiller plusieurs mesures si leurs messages portent des topics différents.
- L'historique survit aux redéploiements (Valkey, conservé 30 jours).
- Des nombres uniquement : les booléens valent 1/0 ; un payload objet est lu via le réglage Clé de la valeur. Tout le reste est rejeté, jamais deviné.
- Le badge du nœud et le nœud Debug montrent le dernier résultat ; un horizon long alourdit le détail (un point par pas), le Debug en affiche alors un aperçu tronqué.

