← Retour aux réalisations

Stage 1ère année · Aspen NDB

Dashboard
Sauron — Ligne 27

SQL PostgreSQL Node-RED Grafana JavaScript Industrie pharmaceutique

Présentation

Contexte du stage

Stage de 1ère année réalisé du 26 mai au 23 juin 2026 chez Aspen Notre Dame de Bondeville (Aspen NDB), site industriel pharmaceutique produisant des principes actifs et des seringues préremplies. J'ai intégré le service Applications de la DSI, en charge des outils IT et OT (systèmes industriels) du site.

Ma mission principale a porté sur Sauron, une solution interne développée pour centraliser et analyser les données de performance industrielle, en remplacement d'un ancien système basé sur des fichiers Excel devenu coûteux, rigide et obsolète.

Architecture

De la collecte à la visualisation

Le projet repose sur une chaîne complète, de la donnée brute au tableau de bord :

API IP21 Node-RED PostgreSQL Grafana

Un flux Node-RED que j'ai conçu s'exécute automatiquement chaque jour à 5h : il extrait les données de production, les transforme en JavaScript, génère dynamiquement les requêtes SQL, puis les insère dans la base PostgreSQL (OEE_Ligne27) via un mécanisme d'UPSERT évitant les doublons.

Mission principale

Tableau de bord Grafana — Ligne 27

La Ligne 27 conditionne des seringues préremplies. J'ai développé le dashboard Grafana de suivi en temps réel : production journalière, taux de rejet, état des équipements (THERMO, ASS, ETUY, VIGNET), OEE sur l'heure glissante, production par shift et production hebdomadaire.

J'ai écrit l'ensemble des requêtes SQL du dashboard en m'appuyant sur les lignes déjà en production, corrigé plusieurs bugs (valeurs nulles mal gérées, erreurs de format sur les données horaires, erreurs de calcul des totaux), puis optimisé les requêtes pour réduire le temps de réponse.

Extrait de code

Requête Production J-1

Récupère les trois périodes de la veille (matin, après-midi, soir) avec nombre de seringues et efficacité.

production_j1.sql
-- Production de la veille, triée par intervalle
SELECT intervalle, nb_seringues, efficacite
FROM l27_totaux_jour
WHERE date_jour = CURRENT_DATE - 1
ORDER BY intervalle;

Optimisation — État des équipements

La première version imbriquait une sous-requête ORDER BY ... LIMIT 1 dans un COALESCE, forçant PostgreSQL à exécuter deux étapes. Je l'ai restructurée pour intégrer directement le tri dans la requête principale.

etat_equipements.sql — avant / après
-- AVANT : sous-requête imbriquée dans un COALESCE
SELECT COALESCE(
  (SELECT valeur FROM ip21_tags
   WHERE tag = 'THERMO'
   ORDER BY timestamp DESC LIMIT 1), 0
);

-- APRÈS : tri intégré directement dans la requête principale
SELECT valeur
FROM ip21_tags
WHERE tag = 'THERMO'
ORDER BY timestamp DESC
LIMIT 1;

Problème résolu

Le décalage horaire de production (5h → 5h)

Chez Aspen, une journée de production ne commence pas à minuit mais à 5h du matin. Sans en tenir compte, les indicateurs J-1 et hebdomadaires devenaient incohérents entre eux.

J'ai mis en place un décalage horaire de 5 heures directement dans le script Node-RED : les données entre 00h et 05h sont automatiquement rattachées à la journée précédente, ce qui a aligné les calculs de cumul journalier et les agrégations hebdomadaires sur la réalité terrain.

Résultats

Optimisations et gains obtenus

Le plus gros levier de performance a été la création d'index sur les colonnes les plus utilisées en filtre et en tri :

index.sql
CREATE INDEX idx_marche_timestamp ON "table_marche"(timestamp DESC);
CREATE INDEX idx_libelle_timestamp ON "l27_autre_valeurs"(libelle, timestamp DESC);
CREATE INDEX idx_date_intervalle ON l27_totaux_jour(date_jour, intervalle);
  • Performance — requêtes plus rapides, accès direct aux données via les index
  • Stabilité — requêtes simplifiées, moins de risques d'erreur, meilleure compatibilité Grafana
  • Maintenance — code plus lisible et plus facile à reprendre

Organisation

Méthode Agile & outils de suivi

L'équipe fonctionnait en Agile : points journaliers chaque matin, suivi des tâches sur Fabriq, tableau de gestion de projet sur Planificator et communication via Microsoft Teams. Ce découpage en petites itérations m'a permis d'avancer progressivement et de m'appuyer sur les retours de l'équipe.

Tableau de synthèse

Compétences validées
Gérer les sauvegardes — mise en place d'un historique fiable des données de production Gérer le patrimoine informatique
Planifier les activités et suivre l'avancement du projet Travailler en mode projet
Déployer un service et accompagner les utilisateurs Mettre à disposition un service informatique

Stack technique

SQL / PostgreSQL — requêtes et optimisation par index
Node-RED — flux d'automatisation et transformation de données
JavaScript — scripts de transformation dans Node-RED
Grafana — conception de tableaux de bord industriels
Méthode Agile — points journaliers, Fabriq, Planificator