Bêta précoce (0.1.0), pas encore pour un process critique. Voir la roadmap
PNeX logo

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.

Flow de maintenance prédictive : pompe simulée, détection d'anomalie, prévision, alertes ntfy et métriques

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,
  };
}

La fonction de pompe simulée et ses deux ports de sortie

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.

Réglages de la détection d'anomalie

MéthodeDétecteQuand l'utiliser
Valeur aberrante (z-score robuste)Pics et chutes isolésLe choix sûr par défaut : sans modèle, insensible aux valeurs aberrantes qu'elle cherche
Hors bande de prévisionValeurs hors de la bande prévueSéries avec tendance ou cycle journalier (renseigner la saison)
Changement de régimeChangement 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églages de la prévision : tendance linéaire, fenêtre 120, horizon 1000, seuil 80

RéglageExemplePourquoi
ModèleTendance linéaireDérive lente et usure. Le lissage exponentiel convient aux séries saisonnières
Fenêtre120 échantillonsHistorique récent utilisé pour l'ajustement — plus court = réadaptation plus rapide après une maintenance
Horizon1000 pasJusqu'où regarder ; un pas = l'intervalle habituel entre deux échantillons
Seuil / Franchissement si80, au-dessusLe 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 variable vibration ;
  • franchissement → trigger de Bearing breach alert, délai (s) → une petite fonction qui l'arrondit en minutes → la variable minutes du template Bearing temperature forecast to reach 80 °C in about {{ minutes }} min.

Nœud Notification : canal ntfy, template, anti-spam 1 message / 10 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

La notification ntfy sur le téléphone

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.

Dashboard : température du roulement, franchissement prévu, vibration et historique

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é.

On this page