Jeremy Lagache

Le Live Blog

Je documente ici le développement de mes projets, les choix techniques, les fonctionnalités, les problèmes rencontrés et les pivots. LivePLC (supervision SCADA industrielle), Hataline (GMAO), Qwipment (gestion équipements par QR codes). Trois outils nés d'un même besoin terrain.

Articles mis à jour régulièrement par Jeremy Lagache

LivePLC, "Et pourquoi pas ?"

Le contexte

Cela fait cinq ans que dans l'usine où je travaille, les ordres de commandes sont transmis à la ligne de production par saisie manuelle des opérateurs. Cinq ans d'erreurs de saisie possibles, de produits non conformes, de frictions quotidiennes que tout le monde a fini par accepter comme une fatalité. Sans compter les lenteurs qui s'étaient glissées progressivement dans nos systèmes de supervision suite à l'accumulation de mises à jour et à l'ajout de fonctionnalités et d'outils de production, les valeurs tardaient à se rafraîchir.

Automaticien et technicien de maintenance depuis plus de vingt ans, je suis par nature à la recherche de solutions concrètes. Avant de me lancer seul, j'avais pourtant essayé la voie officielle : la maison mère dispose d'une équipe d'ingénieurs spécialisés dans ce type de sujets. Nous avons eu un contact direct avec eux, partagé toutes les données, les programmes, les spécifications. Un an plus tard ... rien. Probablement une question de priorités, de rotation du personnel, ou simplement le fait qu'ils travaillent principalement sur des environnements Siemens récents plutôt que sur des installations Schneider vieillissantes qui n'étaient pas vraiment dans leurs habitudes ... ou alors à la recherche d'une vision plus globale de remplacement des automates et des supervisions sans que l'on sache vraiment où cela en est. J'ai donc décidé de m'atteler moi-même au problème.

Il me fallait pour ça deux choses :

1 Récupérer les données SAP

Les fichiers contenant les ordres de production sont exportés automatiquement sur un serveur sous forme de fichiers textes.

Parser texte · terrain connu
2 Transférer vers la supervision

Transférer ces données formatées vers le poste de supervision, qui communique avec un automate Schneider.

Communication PC <> automate Schneider Premium · terrain inconnu

Plutôt que de passer par l'approche classique dans l'industrie pour ce type d'application: un programme compilé en Delphi ou en C++ interfacé avec l'automate, je me suis demandé si je ne pouvais pas utiliser des outils plus ouverts et modernes : Node.js côté serveur, React côté interface, comme il s'agit d'outils tendances que j'avais commencé à utiliser l'année précédente pour un projet personnel d'application de gestion de la maintenance.

La motivation : résoudre un problème concret, et découvrir qu'il y avait quelque chose de plus grand à construire

Deux heures de recherche plus tard, ce que je croyais devoir me prendre deux semaines s'est résumé à un constat : "Mais c'est juste ça ?" Depuis mon ordinateur personnel, avec une petite interface rudimentaire, je pouvais lire et écrire directement des mots mémoire %MWxxxx sur un automate Schneider Premium. Et là, tout s'est enchaîné très vite dans ma tête.

"Et pourquoi pas ?", Si je peux parler à un automate depuis mon PC en quelques heures, qu'est-ce que je peux construire avec quelques semaines de travail ?

J'avais maintenant la conviction que je pouvais faire quelque chose de plus grand. Pas seulement résoudre ce problème de saisie, mais m'attaquer à une frustration que je traîne depuis des années dans mon métier : les outils de supervision industriels coûtent une fortune, tournent sur des plateformes propriétaires verrouillées, dès que nous devons remplacer un PC avec une version supérieure de l'environnement système alors il faut migrer vers une nouvelle version du logiciel HMI avec des licences à mettre à jour, des heures de migration du programme de supervision à prévoir, des outils de licence nécessitant autant de formation que pour l'utilisation du logiciel lui-même, et dès qu'on veut personnaliser quelque chose au-delà de ce que l'éditeur a prévu, c'est soit impossible, soit une semaine de développement dans un langage des années 90. J'ai utilisé WinCC, InTouch, des outils solides, mais fermés, et souvent inaccessibles pour les petites structures à cause de leur coûts.

L'idée s'est imposée : et si je construisais une interface de supervision aussi flexible qu'un site web, connectée directement aux automates, et accessible depuis n'importe quel écran, y compris le smartphone qu'on a dans la poche en atelier ? En cas de remplacement d'un poste, plus besoin de migrer, plus besoin de tout réinstaller pendant des heures par un ingénieur système. Là avec ce système : un navigateur et une adresse web locale, et c'est reparti !

La vision et le plan d'action

Technicien de maintenance devant une cuve industrielle

Au départ, le cas d'usage central n'était pas le grand écran de supervision en salle de contrôle. C'était le technicien de maintenance qui se déplace sur la ligne. Quand on est sous un convoyeur, dans une armoire électrique, à 50 mètres de l'écran de contrôle, pouvoir sortir son smartphone ou sa tablette de sa poche pour vérifier la valeur d'un capteur ou l'état d'un variateur, c'est un vrai gain de temps.

Les contraintes fixées dès le départ

  • Zéro client lourd : tout fonctionne depuis un navigateur standard, y compris sur smartphone.
  • Multi-utilisateurs simultanés : le Responsable Maintenance depuis son bureau, le Technicien depuis l'atelier.
  • Multi-protocoles : Modbus TCP, Siemens S7, OPC UA, les automates réels, pas seulement les modèles récents.
  • Déployable sur du matériel modeste : Raspberry Pi 4, NUC, ou VM partagée pour le backend, un smartphone ou n'importe quel navigateur pour le frontend, et pourquoi pas pour la partie backend si besoin pour les installations légères.
  • Prise en main rapide : simplifier au maximum la création ou la modification des pages, générer et visualiser rapidement les valeurs d'un automate.
  • Installation rapide : un serveur qui centralise toutes les données et un poste client équipé simplement d'un navigateur internet. En cas de dépannage d'un poste client, il n'y aura pas plus rapide.

Le choix de la stack technique

Node.js + Express pour le backend, l'écosystème npm dispose des librairies pour Modbus (jsmodbus), S7 (nodes7), OPC UA (node-opcua), et Socket.io y est chez lui pour le temps réel.

React 19 + Vite + TailwindCSS pour le frontend. React pour la gestion d'état et le système de composants. TailwindCSS parce que je n'avais pas envie de perdre du temps avec le CSS pour des dizaines de widgets différents. SQLite embarquée pour la persistance courante, la finalité étant principalement de la visualisation et du contrôle, pas de l'archivage, et plus tard InfluxDB pour l'historique des données si le besoin se fait exprimer.

ARCHITECTURE TECHNIQUE GLOBALE NAVIGATEUR React 19 + Vite TailwindCSS Visualiser graphiquement les tags Dashboard dynamique Chrome · Firefox · Mobile Socket.io / HTTP NODE.JS BACKEND Express + Socket.io SQLite · 22 tables 80+ routes HTTP · JWT Polling REACTIVE · FAST · SLOW 3 drivers protocoles Licence RSA · gestion pages alarmes · utilisateurs · appareils Raspberry Pi 4 · NUC · VM MODBUS TCP Automates Modbus Port 502 · MW · Coils · Input Regs SIEMENS S7 CPU S7-300 / 400 / 1200 Port 102 · DB · M · Q · I OPC UA Serveurs OPC UA Port 4840 · Subscribe · Nodes Tous les clients reçoivent les données simultanément · Polling configurable 100 ms – 10 s · SQLite embarqué
Architecture technique globale de LivePLC

La page Settings, table de tags et les premiers Visual Tags

Les bases sont posées : le backend Node.js tourne, Socket.io diffuse en temps réel, et deux protocoles sont déjà connectés, Modbus TCP (port 502) et Siemens S7 (ISO-TSAP, port 102). Avant de pouvoir afficher quoi que ce soit, il faut nommer les données : chaque registre automate à lire ou écrire doit être déclaré avec son adresse, son protocole, son type et sa vitesse de polling.

La page Settings, un cockpit protégé

Je commence par la page Settings qui doit être protégée par un code PIN. Elle centralise toute la configuration du système en sections qui permettent d'adresser les éléments à lire/écrire, où et comment le faire : automates, appareils réseau, tags système. Puis, peu de temps après, le reste s'impose : les visual tags pour définir comment afficher les tags sur le poste, des tendances pour suivre l'évolution des valeurs, des recettes qui me permettront d'ajouter des fonctions "par lot" au module de création des tags, des grafcets et enfin des alarmes. Toute l'infrastructure se configure ici avant d'aller construire les pages de supervision.

La table de tags système

Chaque tag déclare son PLC d'appartenance, son type de registre (MW, MF, MD, M, I, Q, DB pour S7…), son adresse, son label affiché et son cycle de polling. Une case à cocher "Mode Réactif" force le tag dans le cycle à 150 ms, utile pour les boutons et sorties directes. Un bouton Test Lecture permet de vérifier immédiatement la valeur lue sur l'automate depuis le formulaire.

Settings v1, section Tags système, liste

Les Visual Tags, première couche de représentation graphique

Un Visual Tag est une couche de présentation posée au-dessus d'un tag système : on lui choisit un type graphique, et il affiche la valeur en temps réel. La logique de détection est automatique selon le type de registre :

📊
Analogique
Registres mots (MW, MF, MD). Types disponibles : Texte, Jauge (demi-cercle), Barre, Thermomètre. Avec mise à l'échelle configurable (raw → unité physique).
🔘
Digital (TOR)
Bits ou extraction de bit d'un mot (M, Q, MW:0…). Types disponibles : LED, Texte, Bouton, Switch. Avec labels et couleurs OFF/ON configurables.

Un visual tag se configure en Settings, nom, tag source, type graphique, unité, décimales, couleurs. Une fois créé, il apparaît dans la sidebar de l'éditeur de pages du dashboard, prêt à être glissé-déposé sur n'importe quelle page de supervision.

Settings v1, section Visual Tags, formulaire de création
LivePLC v1, runtime, premier résultat
📝
Évolution naturelle vers les widgets Les Visual Tags dans Settings, c'était une première étape logique, mais qui créait une friction : il fallait aller en Settings, créer le visual tag, puis retourner sur le dashboard pour l'utiliser. Dès que le mode édition du dashboard s'est enrichi, la question s'est posée d'elle-même : pourquoi ne pas configurer la représentation graphique directement au moment du dépôt sur la page ? Les visual tags ont alors laissé place aux composants "widgets" autonomes et configurables à la volée, et Settings a perdu cette section au profit d'une expérience beaucoup plus fluide.

Architecture des données en temps réel

Le cœur du runtime devra reposer sur un polling cyclique côté backend, couplé à Socket.io pour pousser les valeurs vers tous les clients connectés simultanément.

🔴
REACTIVE, 150 ms
Tags marqués is_command = 1. Boutons, sorties, commandes directes. La réactivité prime.
🟢
FAST, 500 ms
Tags process standard : températures, pressions, débits. La majorité des mesures.
🔵
SLOW, 1 000 ms
Tags d'onglets inactifs, recettes, données rarement consultées.

La gestion des pages et du routage

LivePLC est une SPA (Single Page Application). Les pages de supervision sont stockées en base de données, chaque page a un identifiant, un département associé, une liste de widgets avec leurs positions et configurations. Le frontend charge la configuration via l'API, instancie les widgets, et commence à consommer les données via Socket.io.

Départements, services et appareils autorisés

Assez tôt, j'ai réalisé qu'une usine ne peut pas avoir un seul écran de supervision partagé par tout le monde. Il fallait une notion de département, une zone logique regroupant des pages, des utilisateurs et des droits.

Chaque département peut être protégé par un code PIN. Les appareils (tablettes, PC opérateurs) sont enregistrés avec un UUID unique et se voient assigner un département et une page d'accueil. Quand une tablette est reconnue, elle accède directement à son contexte.

Interface runtime sur PC, page de supervision avec widgets temps réel
Même page en mode portable, layout colonne unique sur smartphone

Les alarmes intégrées au runtime

Le moteur d'alarmes évalue en permanence des conditions sur les tags (seuils, fronts, combinaisons logiques). Quand une alarme se déclenche, elle apparaît dans la barre d'alarmes en haut, avec son niveau de criticité et un son configurable. L'acquittement est tracé dans un journal.

Déclenchement et acquittement d'alarme, barre alarmes, journal d'historique
💡
Détail d'implémentation Socket.io diffuse un objet realtimeData { [tag_id]: valeur } à tous les clients. Chaque widget s'abonne uniquement aux IDs qui le concernent via un sélecteur React mémorisé, pas de re-render global à chaque mise à jour.

Le dashboard de LivePLC, une petite supervision temps réel qui rentre dans la poche

Les premiers prototypes de LivePLC étaient entièrement pensés pour une lecture verticale sur petit écran. Les pages s'affichaient comme une liste de widgets empilés les uns sous les autres, en défilement vertical, exactement comme une page web mobile. Simple, efficace, et accessible depuis n'importe quel téléphone sur le réseau wifi de l'usine.

Prototype v1,  Zone Moussage sur smartphone, janvier 2026
Prototype v1, supervision Zone Moussage (séquence de démarrage), janvier 2026
LivePLC v1 en production,  circuits tôle sup, URL réseau visible
Tôle sup, circuits électriques en temps réel. URL 192.168.2.70:5173 visible : c'est en production, sur le réseau de l'usine.

Le runtime, c'est le mode principal d'utilisation de LivePLC : l'écran que voit l'opérateur en atelier. Il affiche les valeurs des capteurs, les états des machines, les alarmes actives. Contrairement au mode création, le runtime est en lecture-écriture contrôlée, on peut envoyer des commandes aux automates, mais on ne peut pas modifier la mise en page.

LivePLC v1, runtime
LivePLC v1, runtime
📝
Édition, Un mois plus tard, première comparaison terrain

Un mois après les premières lignes de code, LivePLC est testé sur le réseau de l'usine.

C'est le moment de mettre les deux côte à côte : la supervision propriétaire installée depuis des années, et ma version embarquée sur smartphone.

La vidéo est cliquable, cliquez dessus !
Supervision propriétaire,  compilée, exclusivement sous Windows
Supervision propriétaire, compilée, exclusivement sous Windows, impossible à personnaliser
LivePLC, un navigateur Android suffit. Même page, mêmes données, depuis le smartphone en atelier

Le layout portable-first, de la bonne idée à la limitation évidente

Dès les premières semaines, le layout de LivePLC était entièrement basé sur un système de grille verticale à 12 colonnes, inspiré de Bootstrap. L'idée était simple et cohérente avec le projet initial : les pages s'éditent depuis un PC, mais elles sont conçues pour être lues sur un smartphone. Donc on compose verticalement, et tout s'adapte automatiquement. C'est ce modèle qui a tenu pendant les premières semaines, avant que les limites sur écran PC ne se fassent sentir.

Objectif du jour : concevoir un layout adapté au smartphone du technicien, éditable confortablement depuis un PC

Le principe : React-Grid-Layout sur 12 colonnes

J'ai utilisé React-Grid-Layout (RGL), une librairie de drag & drop sur grille. La surface d'édition est découpée en 12 colonnes. Chaque widget occupe une largeur exprimée en nombre de colonnes (w) et une hauteur en unités de grille (h). La position est définie par x (colonne de départ) et y (ligne).

Un widget "pleine largeur" a w: 12. Un demi-écran, w: 6. Et surtout : quand on ajoute un widget en mode portable, il est automatiquement initialisé à w: 12, pleine largeur, pour s'adapter au petit écran sans configuration supplémentaire. RGL gère l'empilement automatique des widgets vers le bas (y: Infinity).

Éditeur grille RGL, surface 12 colonnes avec widgets empilés verticalement

Comment on édite une page mobile depuis un PC

Une subtilité importante : on crée les pages depuis un écran PC, mais on pré-visualise le résultat sur smartphone. L'éditeur affiche donc la grille dans un conteneur dont la largeur simule un smartphone (environ 390px). On glisse les widgets, on les redimensionne, et on voit en direct comment ça va se présenter sur le téléphone de l'opérateur.

RGL calcule les positions en unités relatives (colonnes/lignes). Quand l'application s'ouvre sur un vrai smartphone, les colonnes se redimensionnent proportionnellement à la largeur réelle de l'écran. Un widget w: 6 occupe exactement la moitié de n'importe quel téléphone, qu'il soit en 360px ou 430px de large.

Les limites qui sont apparues très vite

Le système fonctionne très bien pour son usage prévu : la visualisation mobile. Mais très rapidement, je me suis dit qu'on pourrait utiliser LivePLC également sur des écrans fixes de supervision en salle de contrôle, des moniteurs 24 ou 27 pouces en Full HD.

Et là, le layout grille vertical montre ses limites. Sur un écran 1920×1080, avoir tous les widgets en colonne unique pleine largeur, c'est une catastrophe ergonomique. L'espace horizontal est gaspillé, on doit scroller verticalement pour voir toutes les informations, et on perd complètement la vue synoptique qu'on peut avoir avec un vrai SCADA.

⚠️
Le constat brutal Un synoptique de process industriel, tuyauteries, cuves, convoyeurs positionnés en 2D, est physiquement impossible à faire avec une grille verticale. Le positionnement libre en pixels est une nécessité absolue pour ce type d'interface.

La conclusion s'est imposée : il fallait deux modes de layout distincts et équivalents. Et il fallait qu'une même page puisse avoir les deux simultanément, avec conversion automatique dans les deux sens. Mais avant cela, j'ai déjà une liste TODO qui s'agrandit d'heure en heure. J'y reviendrai donc plus tard avec le basculement Mode Fixe ↔ Mode Portable.

🎯
Ma priorité maintenant : faire évoluer les visual tags vers des widgets autonomes, trouver un système de suivi de leur mise à jour pour ne pas perturber les projets déjà en cours de production et m'assurer que tout soit fluide, simple d'accès même pour un novice...

Barre d'outils, versioning des composants et propriétés intégrées

Les deux modes de layout n'existaient pas encore à cette étape, le pivot est arrivé quelques semaines plus tard. Le versioning et le Resource Monitor ont été les ajouts majeurs de cette session. L'objectif du versioning : que chaque widget soit une unité autonome qui se décrit elle-même, et que l'éditeur n'ait jamais à connaître les propriétés spécifiques de chaque composant. L'enjeu derrière était plus profond : que le code du Dashboard ne serve plus qu'à implémenter ses propres fonctionnalités d'édition, qu'il devienne générique, que sa charge soit minimisée pour rester réactif à mesure que la bibliothèque de widgets grossit. Sans cette architecture, chaque nouveau widget aurait alourdi le composant central. Avec elle, le Dashboard peut embarquer n'importe quel widget futur sans en avoir connaissance à l'avance.

Barre d'outils, catégories de widgets, panneau de propriétés, widget sélectionné

Objectif du jour : rendre le Dashboard générique en découplant la définition des widgets de l'éditeur, et mesurer l'impact des pages sur les performances du navigateur

Le WIDGET_REGISTRY, source de vérité unique

Chaque widget est enregistré dans WIDGET_REGISTRY, un dictionnaire central. Une entrée associe un type ("GaugeWidget") à : son composant React, sa version, ses valeurs par défaut, sa liste de propriétés configurables.

WIDGET_REGISTRY = {
  "GaugeWidget": {
    component: GaugeWidget,
    version: "2.1",
    defaultConfig: { min: 0, max: 100, unit: "" },
    defaultW: 3, defaultH: 3,
    definition: {
      properties: [
        { key: "min", type: "number", label: "Minimum" },
        { key: "max", type: "number", label: "Maximum" },
        { key: "unit", type: "string", label: "Unité" },
      ]
    }
  }
}

Quand LivePLC charge une page, si la version stockée en base est inférieure à la version du registry, une migration automatique est proposée, les nouvelles propriétés reçoivent alors leurs valeurs par défaut. Objectif : un ancien projet doit rester compatible avec toutes les versions de LivePLC et des widgets pour permettre des migrations et améliorations en douceur.

Le panneau de propriétés auto-généré

Le panneau de propriétés côté éditeur est généré dynamiquement depuis la liste definition.properties du widget sélectionné. Les types de propriétés gérés :

  • tag, sélecteur avec autocomplétion sur les tags disponibles
  • number, champ numérique avec validation
  • string, texte libre
  • color, color picker avec palette industrielle
  • boolean, toggle on/off
  • select, liste déroulante
  • tagList, multi-sélection de tags (graphiques multi-courbes)

Les modifications sont visibles en live preview immédiatement, sans sauvegarder. C'est un détail d'UX qui change complètement le rythme de travail.

Panneau de propriétés, sélecteur de tag, color picker, live preview

Les modèles de widgets

Un modèle c'est une configuration de widget sauvegardée avec un nom. On le crée depuis n'importe quel widget configuré. Les modèles apparaissent dans la barre d'outils dans une section dédiée. Glisser un modèle sur la page instancie le widget avec toutes ses propriétés prêtes, y compris en mode fixe avec les dimensions appropriées.

La fonctionnalité "Importer depuis l'autre mode", qui sera expliquée dans le prochain article, s'appuie aussi sur ce système : les widgets importés conservent leur configuration (couleurs, seuils, tags associés), seules les positions changent.

Une multitude de modèles pour un seul composant :

Section Modèles dans la barre d'outils, liste avec aperçu, bouton Sauver comme modèle

Mais aussi la possibilité de créer des blocs personnalisés en sélectionnant les widgets dans le layout, pratique pour les réutiliser sur d'autres pages :

Sélection de widgets pour création d'un bloc personnalisé
Bloc personnalisé disponible dans la barre d'outils
Gain en pratique Sur un projet avec 12 lignes de production identiques : configurer la ligne 1, sauvegarder les widgets en modèles, dupliquer la page 11 fois en remplaçant les IDs de tags. Les deux modes (fixe et portable) sont dupliqués ensemble.

Le Resource Monitor, s'assurer que les pages restent réactives

L'un des problèmes que je voulais explicitement éviter avec LivePLC, c'est la latence. Pas la latence réseau vers les automates, ça, c'est gérable, mais la latence d'affichage, ce gel d'une seconde où l'interface décroche quand on navigue entre pages. C'est exactement ce qu'on ressent avec beaucoup de logiciels de supervision existants, et c'est souvent ce qui pousse les opérateurs à râler, et pour de bonnes raisons.

Pour mesurer ça objectivement, j'ai développé le Performances Monitor en parallèle du versioning. Accessible via le bouton "Stats Système" dans la barre de navigation, il s'affiche en superposition sur n'importe quelle page visualisée sans la perturber :

Bouton Stats Système dans la barre de navigation LivePLC
Le bouton "Stats Système" dans la barre de navigation, accessible en mode édition, invisible en mode runtime
Performances Monitor,  panneau principal avec FPS, DOM, ping, payload
Panneau principal sur une page active : 13 FPS, 39 widgets, 1099 nœuds DOM, 28 tags PLC, 4 ms de ping, 6.99 Ko/payload, ici on voit le problème : 13 FPS, page un peu trop chargée pour le hardware qui l'exécute, ou peut-être quelques optimisations à prévoir...
Performances Monitor,  vue graphiques, évolution RAM, FPS et DOM dans le temps
Vue "Évolution dans le temps", 34 points loggués. RAM max 96 Mo, FPS max 60, DOM max 1181 nœuds. Dernière page : "Suivi des débits"

Le DOM : le point de tension inattendu

Le panneau affiche en temps réel six indicateurs clés pour la page ouverte :

🖼️ FPS (Moteur UI)
Images par seconde du rendu React. En dessous de 30 fps sur une page statique, il y a un problème.
🧩 Widgets / Renders/s
Nombre de widgets actifs et fréquence de re-render. Un widget qui se redessine trop souvent consomme inutilement.
🌳 Nœuds DOM
Nombre d'éléments HTML dans la page. C'est le principal indicateur de lourdeur, 1062 dans l'exemple ci-dessous.
📡 Ping / Socket/s
Latence réseau vers le serveur et fréquence des messages Socket.io, le lien direct avec la réactivité terrain.
📦 Payload (Ko)
Poids des données reçues par socket. Trop élevé = trop de tags ou trop de données non utiles pour cette page.
🔖 Tags PLC
Nombre de tags automates actuellement actifs sur la page, directement lié à la charge réseau.

Le DOM : le point de tension inattendu

En développant cet outil, j'ai mis le doigt sur quelque chose que je ne mesurais pas jusqu'ici : dans un navigateur, chaque élément HTML visible est un nœud dans le DOM (Document Object Model). Plus une page a de nœuds, plus le moteur de rendu travaille à chaque mise à jour, même si les nœuds qui changent sont peu nombreux. Sur la capture ci-dessus, on voit 1062 nœuds DOM pour une page de supervision en production : un chiffre à surveiller, car au-delà d'un certain seuil les animations et les mises à jour commencent à saccader.

Concrètement : une page avec 40 widgets bien conçus peut être plus légère qu'une page avec 15 widgets mal optimisés, si ces 15 widgets génèrent chacun une centaine de nœuds imbriqués. Le Performances Monitor rend ce phénomène visible et mesurable sans quitter l'interface.

C'est pourquoi j'ai choisi de le fournir directement dans LivePLC, pas dans une console de développeur. La personne qui construit les pages de supervision doit pouvoir vérifier que ce qu'elle crée ne va pas ralentir le système en production. La réactivité d'une page n'est pas seulement une question d'infrastructure : c'est aussi une question de conception.

⚙️
Log et Snapshot Le bouton "Démarrer Log" enregistre l'évolution des métriques dans le temps et les affiche sous forme de graphiques. "Snapshot" capture l'état actuel comme référence pour comparer deux versions d'une même page, avant/après optimisation d'un widget.

Le pivot architectural, Mode Fixe PC et Mode Portable indépendants sur la même page

🔀
Décision clé, datée exactement par mes archives
Archive 01/03/2026 : "Corrections bugs DisplayWidget et début évolution dashboard pour différencier page Fixe de page Mobile"
Archive 02/03/2026 : "Ajout vues Mode Fixe et Mode Portable pour améliorer l'expérience mobile petits écrans, harmonisation des thèmes et propriétés pages avec settings onglet général"
Ce refactoring est probablement la modification architecturale la plus importante du projet. Il a nécessité de repenser le modèle de données des pages et d'implémenter deux moteurs de rendu distincts sur la même surface d'édition.

Le 1er mars 2026, en corrigeant des bugs sur le DisplayWidget, j'ai commencé à différencier les pages selon leur destination, écran PC ou smartphone. Le lendemain, les deux modes coexistaient sur la même page. Une page LivePLC peut désormais avoir simultanément une version PC et une version portable, totalement indépendantes l'une de l'autre.

Settings, configuration page PC et mode portable

Objectif du jour : résoudre le conflit entre la vue synoptique PC et la liste mobile, sans créer les pages deux fois

Mode Fixe (PC), positionnement absolu en pixels

Le mode fixe abandonne complètement la grille RGL. Les widgets sont positionnés librement sur un canevas de résolution fixe, Full HD (1920×1080) par défaut, configurable par page (HD, 4K, résolution personnalisée). Chaque widget possède un objet absPos: { x, y, w, h } en pixels dans sa configuration.

C'est le mode synoptique par excellence. On place les éléments exactement où on le souhaite, on superpose des images de fond de process, on positionne des jauges à côté de leurs équipements sur un plan d'implantation. Pas de contrainte de grille, une liberté totale.

Le déplacement et le redimensionnement se font avec des poignées de déplacement directement sur le widget, avec snapping optionnel sur des guides magnétiques (lignes de repère horizontales et verticales).

Synoptique en mode fixe, superposition image process, jauges positionnées

Mode Portable (Mobile), grille RGL 12 colonnes, inchangé

Le mode portable, lui, reste le même, la grille React-Grid-Layout à 12 colonnes décrite dans l'article précédent. Les widgets sont empilables verticalement, adaptables à toutes les tailles d'écran. La seule différence : c'est maintenant un mode optionnel, activable page par page.

⬛ Mode Fixe (PC)

  • Position absolue X, Y en pixels
  • Canevas de résolution fixe (configurable)
  • Positionnement libre, superposition possible
  • Parfait pour synoptiques et tableaux de bord complexes
  • Stocké dans items[].config.absPos
  • Rendu : div absolument positionnée sur canvas

📱 Mode Portable (Mobile)

  • Position en colonnes/lignes RGL (1-12)
  • Largeur fluide selon l'écran réel
  • Empilage automatique, scroll vertical
  • Parfait pour supervision terrain et maintenance
  • Stocké dans portableItems[]
  • Rendu : React-Grid-Layout responsive

Le modèle de données : items + portableItems

C'est là que réside l'élégance de la solution. Une page LivePLC stocke deux listes indépendantes de widgets :

  • items[], la liste des widgets du mode Fixe (PC), avec leurs positions absolues en pixels.
  • portableItems[], la liste des widgets du mode Portable (mobile), avec leurs positions en unités de grille RGL.

Un widget peut exister dans les deux modes avec des configurations visuelles différentes (tailles, positions), ou seulement dans l'un des deux. La propriété hasPortable dans la configuration de la page indique si une version mobile a été créée.

Côté éditeur, la variable activeItemsKey bascule entre 'items' et 'portableItems' selon le mode actif. Toutes les opérations (ajout, déplacement, suppression, sauvegarde) s'appliquent à la liste active.

La détection automatique du mode au runtime

Au runtime (en dehors de l'édition), LivePLC détecte automatiquement quel mode utiliser :

  • Si l'écran est petit ET que la page a un mode portable (hasPortable: true) → mode portable activé automatiquement.
  • Si l'écran est grand OU que la page n'a pas de version portable → mode fixe.
  • Si la page est elle-même configurée en mode grille (layoutMode: 'grid') → mode portable sur tous les écrans.

Concrètement : un opérateur qui consulte depuis sa tablette de supervision HD voit le layout PC. Le technicien de maintenance qui ouvre le même lien sur son smartphone voit le layout mobile. Sans aucune configuration supplémentaire.

Layout fixe PC
Layout portable smartphone
Même URL, deux rendus : côte à côte layout fixe PC (gauche) et layout portable smartphone (droite)

La génération d'un mode depuis l'autre, sans recréer la page

La fonctionnalité que je préfère dans ce système : le bouton "Importer depuis l'autre mode". Il permet de générer automatiquement une version portable depuis une page fixe déjà construite, ou inversement.

Fixe → Portable : les widgets de items[] sont copiés dans portableItems[]. Chaque widget est initialisé à w: 12 (pleine largeur) et y: Infinity, RGL les empile automatiquement dans l'ordre. On obtient une version mobile fonctionnelle en un clic, à affiner ensuite si nécessaire.

Portable → Fixe : les positions en colonnes/lignes sont converties en pixels absolus via convertGridToAbsolute(). Les widgets sont placés dans une grille régulière sur le canevas PC. Moins précis qu'une création manuelle, mais ça permet de partir d'une bonne base.

// Import depuis l'autre mode (simplifié)
const sourceKey = isPortableMode ? 'items' : 'portableItems';

if (isPortableMode) {
    // Vers portable : w=12, y=Infinity → RGL empile automatiquement
    newItem.x = (idx * 2) % 12;
    newItem.y = Infinity;
} else {
    // Vers fixe : conversion colonnes → pixels
    itemsToImport = convertGridToAbsolute(items, canvasWidth);
}
💡
En pratique sur un projet Workflow typique : je construis la page PC (synoptique complet en mode fixe), puis je génère la version mobile en un clic, et j'ajuste uniquement les widgets qui ne s'affichent pas bien en colonne, généralement les synoptiques complexes que je remplace par des jauges individuelles.

Du tag visuel au widget partie 1 : Les tags visuels, l'abstraction entre le PLC et l'opérateur

Dans la toute première version de LivePLC, les widgets affichaient les données telles quelles : une adresse Modbus, une valeur brute, un label générique. Du genre %MF4294 = 30745.08. Utile pour déboguer, mais inutilisable pour un opérateur qui ne connaît pas les adresses mémoire de son automate.

Liste des tags système v1,  adresses Modbus brutes visibles
Avant les tags visuels, la liste des variables avec leurs adresses PLC brutes (%MF4304, %MW4276:3…)
Après tags visuels,  affichage avec labels lisibles et unités
Après, les mêmes données, mais avec des labels lisibles, des unités et une plage de valeurs

Idée du jour : créer une couche d'abstraction entre les adresses PLC brutes et l'affichage opérateur, que l'interface ne parle plus en registres, mais en valeurs métier

Ce qu'est un tag visuel

Un tag visuel lie une adresse PLC à un affichage compréhensible. Il contient : un nom lisible ("Niveau cuve polyol 1"), une unité (kg, °C, %, V…), une plage min/max pour le scaling, des seuils colorés (vert normal, orange avertissement, rouge alarme), et le nombre de décimales à afficher.

Mais ce qui en fait un concept fondateur, c'est l'effet multiplicateur : une fois le tag visuel configuré, je peux l'utiliser dans n'importe quel widget. Une jauge, un thermomètre, un afficheur numérique, un mini-trend, tous liront exactement la même définition. Si je corrige l'unité ou les seuils, tous les widgets se mettent à jour automatiquement, sur toutes les pages, dans les deux modes de layout.

Les deux captures ci-dessus montrent concrètement la différence : à gauche, la liste des variables brutes avec leurs adresses Modbus, c'est ce que voit un développeur. À droite, les mêmes données après la couche de tags visuels, c'est ce que voit un opérateur ou un technicien.

💡
L'insight central L'adresse PLC n'a pas à exister dans l'interface utilisateur. C'est le rôle des tags visuels de faire cette translation. Cette séparation entre "ce que lit l'automate" et "ce que voit l'opérateur" est ce qui rend LivePLC configurable sans connaître la programmation automate.

Du tag visuel au widget partie 2 : Des chiffres aux images, jauges, thermomètres et cuves

Afficher des valeurs sous forme de liste, c'est utile, ça m'a servi pendant les premières semaines. Mais une interface de supervision devrait montrer les choses, pas juste les lister. Quand un opérateur regarde la temperature d'un four de préchauffage, il devrait voir "60°C sur une jauge rouge" et comprendre immédiatement que c'est en zone normale, pas lire "60.3" et chercher mentalement si c'est bien ou non.

Ce jour-là, j'ai construit les premiers widgets vraiment visuels : la jauge circulaire, le thermomètre, la barre de niveau et la cuve animée.

Thermomètres en production,  60.3°C et 40.9°C en temps réel
Préchauffage tôle, deux thermomètres en temps réel (60.3°C et 40.9°C). Ce sont des données réelles, lues depuis l'automate.
Niveaux cuves polyol,  barres de niveau avec valeurs en kg
Niveaux cuves polyol, barres de remplissage avec valeur en kg. Une cuve sélectionnée pour production (ON), l'autre non.

Objectif du jour : passer des listes de valeurs brutes aux représentations visuelles, une interface de supervision doit montrer, pas seulement lister

La jauge circulaire

C'est le widget de référence pour les mesures analogiques. L'arc de cercle se colore selon les zones configurées : vert pour la plage normale, orange pour les avertissements, rouge pour les alarmes. Les seuils sont définis dans le tag visuel, pas dans le widget lui-même, ce qui veut dire qu'une jauge créée à partir d'un tag bien configuré est prête à l'emploi sans réglage supplémentaire.

Le thermomètre et la cuve

Le thermomètre est une variante verticale avec une représentation plus intuitive pour les températures. La cuve (TankWidget) mérite un mot particulier : elle a une animation de vague légère qui rend la lecture du niveau plus naturelle, on "voit" le liquide plutôt que de lire un pourcentage.

Les modèles de widgets

Une fonctionnalité ajoutée ce même jour : les modèles. Un modèle est une configuration de widget sauvegardée avec un nom. Une fois le thermomètre bien configuré pour les températures de préchauffage (plage 0-150°C, vert 20-90°C, alarme à 100°C), je le sauvegarde comme modèle. Sur la prochaine page, je glisse le modèle et le widget est prêt, je n'ai qu'à changer le tag source.

📝
Les captures ci-dessus sont issues de la v1 en production réelle. Les données visibles (températures, niveaux) sont celles de la ligne à ce moment précis. C'est l'avantage d'un outil fait sur le terrain : les premiers tests sont sur de vraies données, pas sur des simulations.

Du tag visuel au widget partie 3 : Un bouton de commande ou écrire sur l'automate depuis un navigateur

Visualiser, c'est la moitié du travail d'une supervision. L'autre moitié, c'est agir : démarrer un moteur, changer une consigne, ouvrir une vanne. Ce jour-là j'ai ajouté les premiers widgets de commande, dont le slider de consigne, et c'est à ce moment que j'ai réalisé que l'écriture vers un PLC depuis un navigateur méritait d'être traitée avec soin.

Objectif du jour : permettre à l'opérateur d'agir sur les automates depuis l'interface, avec les mécanismes de sécurité adaptés à un contexte industriel

La logique d'écriture

Quand un opérateur déplace un slider, une valeur doit partir vers l'automate. Côté backend, le tag doit être déclaré en mode RW (lecture-écriture) ou W (écriture seule). La route POST /api/write reçoit la valeur, appelle writeTag() sur le handler du bon protocole, et l'automate reçoit la consigne en quelques millisecondes.

Les écritures ne suivent pas les cycles de polling. Elles sont événementielles, déclenchées par l'interaction de l'utilisateur, pas par une boucle. La seule limite de vitesse est la latence réseau entre le serveur Node.js et l'automate.

Le slider : écrire sur relâchement, pas en continu

Paramétrage du widget slider
Widgets sliders et boutons de commande

Pour une consigne de température ou de vitesse, envoyer la valeur à chaque pixel de déplacement du slider serait contre-productif. J'ai configuré le slider pour écrire uniquement au relâchement, quand l'opérateur lâche le curseur, la valeur part une seule fois. Pendant le glissement, un affichage local montre la valeur visée sans rien envoyer à l'automate.

Ce détail est important en contexte industriel : une consigne qui change 50 fois par seconde pendant un glissement de souris peut déclencher des oscillations sur le système de régulation. L'écriture sur relâchement supprime ce risque.

La confirmation double-appui pour les commandes critiques

Paramétrage bouton action avec confirmation double-appui

Le bouton momentané envoie 1 pendant l'appui et 0 au relâchement, comme un bouton-poussoir câblé. Pour les commandes critiques (démarrage moteur, ouverture vanne process), une boîte de confirmation en deux étapes s'intercale entre le clic et l'envoi.

Sur smartphone, ce mécanisme est essentiel : un faux contact tactile sur un bouton "Démarrer" en mode portable est bien plus probable que sur une souris. La confirmation double-appui rend ce risque négligeable.

💡
Règle d'or pour les commandes Toute la logique de sécurité (valider que le tag est RW, limiter les valeurs dans la plage, confirmation critique) est côté backend Node.js, jamais dans le code React. Le frontend peut être inspecté et modifié dans le navigateur ; le backend, non.

Du tag visuel au widget partie 4 : Les bonnes bases sont en place, un développement de nouveaux composants à vitesse grand V pour passer visuellement au niveau supérieur

Une fois le WIDGET_REGISTRY en place et le panneau de propriétés auto-généré, créer un nouveau widget devient une affaire de quelques heures. La base est solide : chaque composant sait se configurer, se versionner, se migrer. Il n'y a plus qu'à construire dessus.

Les semaines suivantes voient défiler les nouveaux composants à un rythme soutenu :

📝
TextWidget 13/02
Texte statique avec templates de mise en forme, idéal pour les étiquettes et titres de zones.
TextWidget — étiquettes et titres de zones
🛢️
TankWidget + ClockWidget 15/02
Cuve/niveau animée avec remplissage liquide. Horloge synchronisée sur l'heure atelier.
TankWidget — cuve animée niveau liquide
🎚️
SliderWidget 15/02 v2
Curseur linéaire, rotatif ou arc 180°/270°. Écriture tag PLC en temps réel au relâchement.
SliderWidget — curseurs et boutons de commande
⚙️
PumpWidget + ValveWidget 17/02 v3
Pompe animée (rotation, débit) et vanne (ouverte/fermée/en cours), liées à des tags d'état. Pipes automatiques entre composants.
🔔
AlarmWidget 03-04/03
Alarmes local/global, 3 sévérités (info/warning/critical), multi-conditions AND/OR. Moteur d'évaluation côté backend.
📷
WebcamWidget 05-06/03
Flux MJPEG/HLS (caméras Axis), enregistrement vidéo, archive consultable avec timeline scrollable.
💡
La puissance du registre Chaque widget ajouté enrichit automatiquement la barre d'outils, le panneau de propriétés et le système de versioning. Zéro code de "plomberie" à réécrire pour chaque nouveau composant.

Le ProductionLineWidget, jumeau numérique 2D d'une ligne industrielle

🔀
De loin le widget le plus ambitieux du projet Son développement représente bientôt deux mois de travail (sur mon temps libre) et a produit à lui seul plus de code que tous les autres widgets réunis. C'est aussi le premier widget que j'ai conçu pour un contexte industriel très précis, et que j'ai ensuite rendu générique au vu des possibilités de suivi qu'offre cet outil.

Le ProductionLineWidget est un jumeau numérique 2D d'une ligne de production. Il affiche en temps réel les objets qui circulent sur la ligne, leur position sur chaque convoyeur, leur état dans chaque zone, le tout en SVG animé, synchronisé avec les données des automates via Socket.io.

Petit exemple en mode simulation du jumeau pour une ligne de création de panneaux sandwich :

La vidéo de présentation ne lui fait pas honneur car elle tourne sur un i5 très léger avec déjà beaucoup de process en cours, mais je vous assure que sur une configuration légèrement plus musclée ou moins surchargée, la fluidité est bien au rendez-vous.

Objectif du jour : construire un jumeau numérique d'une ligne de production, moteur physique côté serveur, visible depuis n'importe quel navigateur en temps réel

Le concept : une ligne composée de zones

Une ligne de production est modélisée comme une séquence de zones, chacune ayant un type et des propriétés. Les zones se connectent entre elles via des liaisons configurables, quand un objet atteint la sortie d'une zone, il passe automatiquement dans la zone suivante.

➡️
Convoyeur continu
Transport à vitesse configurable. Les objets avancent en continu, détection de blocage.
📍
Zone de positionnement
Slots numérotés. Les objets se placent sur des positions précises avant d'être transférés.
❄️
Zone tampon (refroidisseur)
Stockage temporaire. Les objets attendent leur tour d'évacuation dans des étages.
🔄
Retourneur (Turner)
Retourne l'objet à 180°. Animation de basculement synchronisée avec le PLC.
↔️
Translateur (Shifter)
Déplacement latéral. Transit direct sans rotation, pour changement de file.
📦
Empileur (Stacker)
Plateforme élévatrice multi-slots. Accumulation et évacuation par lots.
Éditeur ProductionLineWidget, configuration de la ligne
ProductionLineWidget, aperçu SVG de la ligne

L'architecture : moteur physique côté serveur

C'est le choix architectural le plus important de ce widget. Le moteur physique qui gère les positions, collisions et transitions tourne côté Node.js, pas dans le navigateur.

Pourquoi ? Parce que la simulation doit continuer même quand aucun écran n'est ouvert. En usine, la ligne tourne 24h/24, le jumeau numérique doit refléter l'état réel à tout moment, pas seulement quand quelqu'un l'a ouvert dans son navigateur.

// Structure backend/twins/ (moteurs)
TwinMasterEngine.js    ← orchestrateur, gère toutes les zones
ConveyorEngine.js      ← convoyeurs continus
PositioningEngine.js   ← zones de positionnement (slots)
BufferEngine.js        ← zones tampon (refroidisseur)
TurnerEngine.js        ← retourneur (physique + animation)
ShifterEngine.js       ← translateur latéral
PileEngine.js          ← empileur (plateforme élévatrice)
StationEngine.js       ← stations de détection/enregistrement

Chaque moteur émet son état via Socket.io. Le composant React reçoit ces états et met à jour le SVG. Le frontend ne calcule rien, il ne fait que rendre ce que le serveur lui envoie.

Node.js, Physics Engine ⚙ TwinMasterEngine ↩ TurnerEngine ⇄ ShifterEngine 📦 PileEngine 🏭 StationEngine runPhysicsCycle() 1 000 ms · positions + collisions Socket.io emit('twin-state') TRY_SPAWN / sim-control React, SVG Renderer 📄 ProductionLineWidget.jsx 🎨 SVG animé temps réel 📡 useEffect → socket.on 🔁 Re-render par zone N clients simultanés Chaque navigateur reçoit le même état en temps réel 🖥 PC Supervision 📱 Smartphone atelier 📟 Tablette opérateur 💻 Salle de contrôle

Ce schéma illustre une architecture qui n'est pas accidentelle. La gestion des types de zones de la ProductionLine a été conçue à l'image de la barre d'outils de LivePLC : chaque type de zone (convoyeur, retourneur, translateur, empileur, station, point d'entrée…) est implémenté dans un fichier Engine autonome (TurnerEngine.js, ShifterEngine.js, PileEngine.js…) et enregistré dans un registre central, l'EnginesRegistry. Le TwinMasterEngine ne connaît que ce registre, pas les engines individuels. Ajouter un nouveau type de zone revient à créer un fichier Engine et l'enregistrer, sans toucher au reste du système. C'est exactement le même principe que le WIDGET_REGISTRY pour les widgets : un système ouvert à l'extension, fermé à la modification.

Les objets sur la ligne, physique et propriétés

Chaque objet circulant sur la ligne est une entité avec des propriétés physiques (physicalLength, physicalWidth) et des propriétés métier configurables. Ces propriétés sont alimentées depuis un RecipeWidget : la recette de production définit les dimensions et les données de chaque lot d'objets à produire.

Un objet naît dans une ZoneEntryPoint, déclenchée par un tag PLC (trigger_tag_id) ou manuellement en simulation, et traverse la ligne jusqu'à sa sortie. À chaque passage devant une ZoneStation, les valeurs des tags PLC en cours sont enregistrées dans InfluxDB pour constituer l'historique de l'objet.

L'idée derrière la ZoneStation

Cette fonctionnalité n'était pas dans le cahier des charges initial. Elle est née d'une question que je me suis posée pendant le développement, à force de regarder les produits défiler en simulation : « OK, c'est bien. Je vois mes panneaux bouger sur la ligne. Et maintenant, qu'est-ce que ProductionLine peut apporter de plus ? »

La réponse était là depuis le début : LivePLC a accès à toutes les données des automates en temps réel. Températures, vitesses, pressions, codes défauts, épaisseurs mesurées. Et si ces données étaient attachées aux produits plutôt que de simplement défiler dans des jauges ? « Je peux lier les mesures PLC aux objets physiques qui passent devant les capteurs. Mais comment ? » Voilà comment la ZoneStation est née.

Concrètement, une ZoneStation est une zone placée dans l'éditeur à l'endroit d'un poste physique réel sur la ligne (une presse, un poste de contrôle, une sortie refroidissement). Elle est configurée avec une liste de tag_ids à capturer. Dès qu'un objet entre dans la zone, le moteur physique lit les valeurs courantes de ces tags et les horodate. Un objet qui traverse quatre stations accumule quatre snapshots de données PLC, chacun ancré à un moment précis de son parcours.

ZoneStation, capture des valeurs PLC au passage d'un objet
🗄️
InfluxDB : archiver pour analyser ensuite La question suivante s'est imposée naturellement : « Et si on veut garder ces données sur plusieurs jours, plusieurs semaines ? » InfluxDB vient au secours. Chaque snapshot de passage est écrit dans une série temporelle, ce qui permet de retrouver l'historique complet d'un lot de production, de comparer des dérives sur la durée, ou de détecter des corrélations entre un défaut qualité et une mesure PLC anormale.
📱
QR code : retrouver un produit en un scan Dernier maillon de la chaîne : « Et si on veut retrouver rapidement les données d'un produit précis après coup ? » Chaque objet généré dans ProductionLine est identifié par un product_id unique. Un QR code imprimé en sortie de ligne permet de rappeler instantanément l'ensemble de son historique de passages de stations, depuis n'importe quel poste ou smartphone de l'atelier. Suivi d'un panneau, historique des passages de stations via QR code

Le lien avec le TimelineWidget et les RecipeWidgets

Le ProductionLineWidget ne fonctionne pas en silo. Il s'intègre avec :

  • RecipeWidget : fournit la gridMap de tags PLC (adresses automates) que le jumeau doit lire pour chaque objet de la recette.
  • TimelineWidget : le planning de production définit quels lots sont prévus et à quel moment, le jumeau peut aligner sa simulation sur ce planning.
  • ImportFilesWidget : les commandes importées depuis le système de gestion de l'entreprise alimentent directement le planning et, par extension, la simulation.

Ce que ça représente en développement

Le ProductionLineWidget est de loin le composant le plus complexe du projet. La gestion des transitions entre zones, la détection de collisions, les animations SVG synchronisées côté client, les 7 types de moteurs physiques différents, l'intégration InfluxDB : tout ça représente deux mois de développement itératif sur mon temps libre. Deux refontes complètes avant d'arriver à cette troisième version fonctionnelle, qui reste encore à éprouver en conditions réelles, mais qui est un composant plus que prometteur. Capable de fonctionner en parallèle des automates avec seulement quelques tags pour la synchronisation, sans compter les tags à archiver par produit.

Un autre exemple : ligne de cartonnage

Généricité du widget Le ProductionLineWidget est conçu pour être configuré graphiquement via l'éditeur, sans code. On place les zones, on les relie, on configure les propriétés, et la simulation démarre. Il peut représenter n'importe quelle ligne de production : panneaux sandwich, bois, métallurgie, agroalimentaire.

Pour illustrer cette généricité, j'ai configuré une deuxième ligne de production : un process de cartonnage. Convoyeurs, stations de contrôle, zone d'empilage, point de sortie, le schéma est entièrement différent mais le moteur physique est le même. Aucune ligne de code supplémentaire, juste une configuration différente dans l'éditeur.

ProductionLineWidget configuré pour une ligne de cartonnage
⚙ Prochain module en développement

L'utilité de ProductionLine : l'utilisation en live des données enregistrées

Voir ses produits bouger sur une ligne en temps réel, c'est déjà impressionnant. Mais la vraie valeur de ProductionLine n'est pas là. Elle est dans ce qu'on fait des données que la ligne accumule à chaque passage de station. Ces snapshots horodatés de tags PLC, associés à chaque objet circulant sur la ligne, sont le socle d'un outil de détection de défauts en temps réel.

Deux modes de détection automatique

Le composant peut identifier les produits à risque de deux façons complémentaires :

📐
Caractéristiques de passage identiques
Si plusieurs produits défectueux partagent les mêmes valeurs de passage à une station donnée (même vitesse, même température, même pression), ProductionLine peut regrouper automatiquement les objets similaires encore sur la ligne et les signaler.
⚠️
Tags PLC hors tolérance
Chaque tag archivé peut être configuré avec des seuils min/max. Dès qu'un objet passe devant une station avec une valeur hors tolérance, le composant le marque automatiquement en rouge directement sur la visualisation de la ligne.
🎯
Ciblage rapide d'un défaut sur la ligne
Dès qu'un défaut est identifié sur un produit, ProductionLine remonte immédiatement son origine : station responsable, position précise sur la ligne et délai avant sortie. Tous les produits ayant traversé le même poste avec des caractéristiques similaires sont mis en surbrillance. On sait exactement où intervenir, quand, et quels autres produits inspecter — sans arrêter la production.

Visualisation directe sur la ligne

La mise en surbrillance se fait directement sur le rendu SVG de ProductionLine : les produits suspects apparaissent en rouge ou en orange selon le niveau de criticité, visibles d'un coup d'œil depuis n'importe quel poste ou smartphone connecté à LivePLC. L'opérateur n'a pas besoin de naviguer dans des tableaux de données, les problèmes s'affichent là où ils se trouvent physiquement, sur la représentation de la ligne.

L'exemple de la bosse

Un opérateur remarque une bosse sur un panneau en cours de fabrication. Il clique dessus dans ProductionLine et le marque en rouge. Le composant remonte immédiatement : cette anomalie est apparue au niveau de la pale n°150, qui arrivera en sortie du conformateur dans exactement deux minutes. Plus besoin de chercher partout sur la ligne : on sait à l'instant T où intervenir et quand. Les produits suivants ayant traversé la même pale avec des caractéristiques identiques sont également mis en surbrillance : l'opérateur sait exactement quels panneaux inspecter avant qu'ils n'arrivent en bout de ligne.

🔧
Maintenance ciblée, arrêts réduits Aujourd'hui, détecter l'origine d'un défaut sur une ligne industrielle implique souvent d'arrêter la production pour inspecter chaque poste. Avec ProductionLine, l'intervention est chirurgicale : on sait quel poste, quel produit, quelle fenêtre de temps. La ligne continue de tourner pendant que la maintenance intervient au bon endroit au bon moment.
📈
Et à plus long terme : la dérive avant le défaut L'historique InfluxDB ne sert pas seulement à retrouver un produit après coup. En analysant les tendances sur plusieurs jours, ProductionLine pourra détecter une dérive progressive d'un tag PLC avant qu'elle ne dépasse le seuil de tolérance. Passer du curatif au prédictif, c'est l'étape suivante.

JWT : la gestion des appareils autorisés à accéder aux données protégées de LivePLC

Très tôt dans le développement, un problème s'est posé : comment gérer plusieurs appareils différents dans la même usine, un PC opérateur fixe, des tablettes de maintenance, des écrans de supervision sur les lignes, avec des droits et des pages d'accueil différents pour chacun ?

La solution habituelle serait un système de comptes utilisateurs. J'ai préféré une approche différente, plus adaptée au contexte industriel : l'authentification par appareil.

Enregistrement d'un appareil, authentification par appareil dans LivePLC

Objectif du jour : gérer des dizaines d'appareils hétérogènes en atelier avec des droits différents, sans système de comptes complexe

JWT par appareil, identification persistante

Quand un appareil se connecte pour la première fois à LivePLC, il génère un device_id unique (UUID) stocké en localStorage, et demande un accès au serveur. L'administrateur valide l'appareil depuis Settings, en lui attribuant un nom de poste, un département et une page de démarrage. Le serveur émet un JWT signé, stocké lui aussi en localStorage.

Validation d'un appareil par l'administrateur dans LivePLC

À chaque reconnexion, le JWT est vérifié côté serveur. Si valide : l'appareil retrouve directement son contexte (département, page d'accueil), sans aucune saisie de mot de passe. Si le JWT est expiré ou révoqué, l'appareil repasse par le cycle d'approbation.

pending
Nouvelle demande, en attente d'approbation admin.
approved
Accès validé. JWT actif, contexte département chargé.
👤
guest
Appareil inconnu, accès restreint (sauf mode kiosque).
🔒
rejected
Accès refusé, écran de blocage. Réessai interdit.
🌐
Le problème du changement d'IP réseau Un JWT est lié à l'origine de la page web (IP:port du serveur). Si l'IP du serveur change (switch réseau, déménagement de box), le navigateur considère que c'est un site différent et perd le JWT. La solution : configurer un hostname fixe liveplc.local via le fichier hosts des clients. L'adresse IP peut changer, le localStorage reste intact.
💡
Un parc d'appareils géré comme des licences Netflix La gestion centralisée des accès permet à l'administrateur de suivre à tout moment l'ensemble des postes connectés au serveur LivePLC : voir qui est connecté, autoriser un nouveau poste, révoquer un poste compromis ou remplacé. En cas de panne matérielle, un nouveau PC encore inconnu du serveur peut être validé en quelques secondes depuis Settings, sans manipulation de fichier de licence ni intervention sur le poste défaillant.

C'est un peu comme Netflix : j'ai un certain nombre de connexions simultanées à distribuer entre autant de postes que je sélectionne. La licence est côté serveur, pas côté poste. Plus besoin d'avoir peur qu'une licence soit corrompue sur un disque dur hors service.

QRCodePage, accès kiosque et ce qui va devenir une nouvelle application à part entière

QRCodePage, accès temporaire kiosque

Le QRCodePageWidget génère un QR code qui pointe vers une page spécifique de LivePLC. Quand un appareil non enregistré scanne ce QR, il ouvre la page en mode kiosque, lecture seule, durée limitée (configurable sur le widget), sans accès au reste de l'application.

Un bandeau "Mode Kiosque, Lecture Seule" s'affiche sur le smartphone connecté sur le même réseau wifi que le réseau LivePLC, avec un compte à rebours visible. À l'expiration, l'accès est révoqué et l'utilisateur est redirigé vers un écran "Session terminée". Si le navigateur est fermé avant l'expiration, la session kiosque est annulée (sessionStorage et non localStorage, expiration à la fermeture du navigateur, par design).

Vue smartphone après scan, bandeau Mode Kiosque, timer visible, page supervision en lecture seule

Ici l'écran des caméras est partagé pendant 10 min grâce au QR code. Une fois le QR code scanné, il a été consommé et un nouveau doit être généré afin d'autoriser un nouveau poste visiteur ou enregistré à accéder directement à cette page.

🌀
La dérive créative, ou comment un QR code devient une plateforme Ce qui suit est une dérive de développement assumée. Comme avec ProductionLine, plus on construit l'outil, plus les idées arrivent, et parfois le plus difficile est de savoir où s'arrêter. Je ne l'ai pas fait ici. J'ai passé deux jours à construire des composants qui n'avaient plus vraiment de rapport avec une supervision de production industrielle.

Mais cette dérive n'était pas stérile. Au contraire, elle a ouvert les portes vers une toute nouvelle application, et même bien plus, une plateforme d'applications interconnectées que je présenterai dans les articles qui suivront bientôt.

QR codes équipement, le hub documentaire de l'atelier

Le système QR codes va plus loin que la simple consultation d'une page. Chaque équipement de l'usine peut recevoir un QR code imprimé et collé dessus. Le scan ouvre une page dédiée à cet équipement, avec plusieurs types de contenus configurables :

  • Documents : PDFs, images, liens web, manuels techniques.
  • Page dashboard : lien direct vers une page de supervision LivePLC.
  • Pointage : formulaire d'entrée/sortie pour les pauses ou interventions.
  • Contrôle qualité : formulaire complet avec photo, signature et statut de conformité.

Les documents sont filtrés selon les services autorisés, Maintenance, Production, Qualité, Sécurité. Un technicien de maintenance ne voit pas les documents réservés au service Qualité, et vice-versa.

Hub équipement après scan QR, liste des documents et actions disponibles
Hub équipement, vue configuration, filtrage par service

Le contrôle qualité intégré

Le contrôle qualité est directement intégré dans le hub équipement, accessible en un scan. Le formulaire propose cinq options :

Conforme
Photo + nom contrôleur + signature tactile
⚠️
Conforme avec réserves
+ champ réserves détaillé
Non conforme
+ champ non-conformité obligatoire
📋
Procédure
Documents de référence liés à l'équipement
📁
Historique
Liste chronologique des contrôles passés

Chaque contrôle est horodaté et stocké en base de données, photo en base64, signature vectorielle, statut, nom du contrôleur. L'historique est consultable depuis n'importe quel appareil autorisé.

💡
Vers une app dédiée Ce système de QR codes et de formulaires a tellement grandi qu'il est devenu une application à part entière : Qwipment. On y reviendra dans un prochain article.

Retour aux fondamentaux : évolution future des protocoles de communication de LivePLC

Une des critiques récurrentes des outils de supervision web, c'est leur dépendance à des passerelles propriétaires pour communiquer avec les automates. Soit ils ne parlent que OPC UA, soit ils nécessitent un middleware tiers coûteux pour brancher du Modbus.

LivePLC intègre les drivers directement dans son backend Node.js. Actuellement : 4 protocoles actifs (prêts à l'emploi) et 13 stubs (architecturés, activables en installant le package npm correspondant et quelques tests en production pour tester tout cela).

Objectif du jour : ne pas être limité à un seul fabricant d'automates, architecturer un système multi-protocoles extensible sur n'importe quel parc machine

Les 4 protocoles actifs

🔌
Modbus TCP
jsmodbus · port 502 · Coils, Holding/Input Registers, MW/MD/MF/MB · Batch automatique des adresses contiguës · Schneider, Wago, Beckhoff, drives Yaskawa/Danfoss...
🔷
Siemens S7
nodes7 · port 102 · S7-1200/1500/300/400, ET200SP · Adressage MW, DB, bits M/I/Q · PUT/GET requis sur TIA Portal
🌐
OPC UA
node-opcua · port 4840 · Standard IEC 62541 · Reconnexion auto · Sécurité TLS configurable · Compatible S7-1500, Beckhoff, B&R, Codesys...
🔗
REST / HTTP
axios (natif) · Polling JSON · Passerelles IIoT modernes, API industrielles, compteurs intelligents

Les 13 stubs, activer en 4 fichiers

L'architecture est conçue pour que l'ajout d'un protocole ne soit qu'une affaire de configuration. Chaque protocole expose la même interface (connect, disconnect, readTags, writeTag) et est référencé dans un PROTOCOL_REGISTRY central.

Activer un nouveau protocole se fait en 4 étapes : créer le fichier driver dans backend/protocols/, l'enregistrer dans index.js, ajouter ses colonnes spécifiques dans database.js, et ajouter l'option dans Settings.jsx.

# Protocole Secteur npm Complexité
1 Modbus RTU/TCP Général déjà installé ★☆☆
2 WebSocket IIoT ws ★☆☆
3 MQTT IIoT / Cloud mqtt ★☆☆
4 EtherNet/IP (CIP) Allen-Bradley / Rockwell ethernet-ip ★★☆
5 MC Protocol (Mitsubishi) Industrie Japon/Asie mcprotocol ★★☆
6 BACnet/IP Bâtiment / GTB bacstack ★★☆
7 KNX/IP Bâtiment / domotique knx ★★☆
8 FINS (Omron) Industrie générale omron-fins ★★☆
9 CANopen Machines / variateurs node-canopen ★★★
10 DNP3 Eau / SCADA longue distance node-dnp3 ★★★
11 IEC 60870-5-104 Électricité / Enedis / RTE node-iec104 ★★★
12 IEC 61850 Postes HTA/HTB node-iec61850 ★★★
13 HART-IP Instrumentation process hart-ip ★★☆

Pourquoi avoir architecturé les stubs si tôt

La décision d'architecturer les stubs dès le début plutôt que d'attendre les demandes clients vient d'une conviction simple : dans l'industrie, le parc d'automates est hétérogène. Une usine a rarement qu'un seul fabricant d'automates. Une ligne Schneider côtoie un convoyeur Siemens, des drives Mitsubishi, et des capteurs avec sorties Modbus.

Proposer un outil qui ne parle qu'à Siemens ou qu'à Modbus, c'est fermer la porte à la moitié des projets. Avoir les stubs architecturés permet de dire : "OPC UA ? Prêt. Allen-Bradley ? 20 minutes pour activer EtherNet/IP. BACnet pour le bâtiment ? Disponible."

Settings, onglet Connexions PLC : liste des automates connectés, sélecteur de protocole
📝
Roadmap Les stubs MQTT et WebSocket sont les prochains à être activés complètement, ils couvrent les capteurs IoT modernes et les passerelles IIoT. EtherNet/IP (Allen-Bradley) suivra pour adresser le marché nord-américain.

Qwipment, quand un sous-module devient une application à part entière

En développant le système de QR codes équipements dans LivePLC, j'ai progressivement construit quelque chose qui n'avait plus grand-chose à voir avec la supervision industrielle. Des formulaires, de la gestion documentaire, des historiques d'interventions, utile, mais étranger à la vocation première d'un SCADA.

La conclusion s'est imposée : cette partie méritait sa propre application. Qwipment est né de ce constat.

L'idée : les QR codes de LivePLC avaient tellement grandi qu'ils méritaient leur propre application

Le nom

Qwipment est une déformation stylistique d'"Equipment". Le "Q" initial fait un clin d'œil au QR code sans le dire explicitement. La prononciation est "Kwipment". Domaines réservés : qwipment.fr et qwipment.com.

Slogan : "Scan. Connect. Know.", le même workflow que LivePLC, mais appliqué à la gestion d'équipements plutôt qu'à la supervision de process.

Ce que fait Qwipment

Qwipment est un gestionnaire de QR codes industriels. Chaque équipement reçoit un QR code unique. Le scan ouvre une page dédiée à l'équipement, avec :

  • Ses documents (manuels, fiches techniques, procédures)
  • Ses formulaires (présence, contrôle qualité, check-list, personnalisés)
  • Des pages de supervision LivePLC si l'équipement est connecté à un automate
  • Des actions HATALINE si une GMAO est en place (vérification périodique, bon de travaux...)
QR code équipement — page dédiée avec documents, formulaires, supervision

L'idée clé : le Suite Connector

C'est le concept qui différencie Qwipment d'un simple gestionnaire documentaire. Qwipment n'est pas un silo, c'est un hub qui agrège les contenus de toute la suite logicielle.

Chaque application de la suite expose un endpoint standard :

GET /suite-connector/contents?uid={equipment_uid}

// Réponse LivePLC :
[{ "app": "LivePLC",  "type": "supervision_page",
   "label": "Page Ligne 1", "icon": "monitor" }]

// Réponse HATALINE :
[{ "app": "Hataline", "type": "form",
   "label": "Vérification périodique", "icon": "clipboard-check" }]

Qwipment interroge tous les connecteurs configurés et affiche les résultats groupés par application, avec les couleurs de chaque app. Un seul scan QR → documents Qwipment + page de supervision LivePLC + actions maintenance HATALINE, selon ce que le service de l'utilisateur est autorisé à voir.

Résultats groupés par application après un scan QR — Qwipment + LivePLC + HATALINE

⚡ LivePLC

  • Supervision temps réel
  • Alertes process
  • Jumeaux numériques

🔗 Qwipment

  • Hub QR universel
  • Formulaires / docs
  • Connecte tout

🔧 HATALINE

  • GMAO maintenance
  • Actifs / bons de travaux
  • Stocks / planification
🚀
État du projet Qwipment est fonctionnel et en développement actif. LivePLC intègre le Suite Connector côté serveur pour exposer ses pages aux scans Qwipment. HATALINE est en cours d'adaptation pour exposer ses actions de maintenance de la même façon. Les trois applications formeront une suite cohérente dont l'interconnexion est le principal différenciateur.

Un QR code, des expériences différentes selon le rôle

C'est là où le connecteur de suite révèle toute sa puissance. Chaque responsable de service configure ses propres règles d'accès via la même interface Qwipment. Un seul QR code par équipement, mais le contenu affiché est entièrement personnalisé selon le profil de la personne qui scanne.

🔧
Technicien maintenance
Documents techniques, fiches de sécurité, données partagées à tous. Pages de supervision LivePLC liées directement à cet équipement. Inventaire des pièces détachées HATALINE et historique complet des interventions sur l'équipement.
📋
Responsable qualité
Documents partagés à tous, plus ses check-lists et formulaires réservés au service qualité. Reçoit automatiquement par mail les rapports de résultats dès qu'une check-list est soumise par un opérateur.
👤
Visiteur
Connecté sur le réseau WiFi de la plateforme, sans compte. Accès aux documents publics, fiches de sécurité (utile pour un pompier ou un service de secours), fiche de présence sur zone.
🧪
Technicien labo
Pages LivePLC de suivi des débits et pressions liées à l'équipement. Ses check-lists de contrôle chimie et formulaires de relevés propres au laboratoire, inaccessibles aux autres services.
Scan QR

Tout ceci est configurable de manière autonome par chaque responsable de service, via la même interface, dans la même application, avec le même QR code pour chaque équipement. Le technicien, le responsable qualité et le visiteur scannent le même code : chacun voit ce que son profil lui autorise.

Déjà fonctionnel La gestion des rôles, le filtrage des contenus par service et l'envoi automatique de rapports par mail sont opérationnels. Ce n'est pas une roadmap : c'est la réalité du système tel qu'il fonctionne aujourd'hui.

Petit point de milieu d'année et objectifs à court terme

C'est déjà le mois de juin 2026. Rétrospectivement depuis début janvier, je me rends compte que je n'ai pas chômé, et que je n'ai assurément pas compté mes heures passées devant l'écran. Plutôt fier d'avoir sorti deux applications à fort potentiel, et de voir une vraie suite prendre forme.

Jan Juin Déc 2026
🔧
Hataline
GMAO / Atelier
LivePLC
Supervision SCADA
📱
Qwipment
QR code équipements
Jeremy Lagache
Jérémy
Automaticien / Technicien de maintenance
développeur et architecte logiciel
(à ses heures perdues)

LivePLC d'abord : une supervision SCADA web complète, multi-protocoles (Modbus TCP, Siemens S7, OPC UA), avec des composants modernes, réactifs et modulables à souhait, pages synoptiques en positionnement libre sur PC, vues portables adaptées smartphone, jumeau numérique 2D d'une ligne de production, historisation via InfluxDB, gestion fine des droits par poste et mode kiosque QR. Qwipment ensuite : un gestionnaire de QR codes industriels qui a progressivement absorbé tout ce que LivePLC ne devait pas faire. Et sans compter Hataline, mon premier projet de GMAO, entamé en septembre 2025 à la demande de mon petit frère pour son entreprise : je dois encore en parler dans le blog car je me rends compte que je n'ai encore rien expliqué au sujet du logiciel, mais heureusement que j'ai mes archives GitHub bien documentées qui m'aideront dans mon travail de rédaction pour les futurs articles explicatifs. Donc trois applications, trois problèmes distincts, une seule plateforme interconnectée quand même.

Il faut maintenant que je peaufine l'ensemble et, surtout, que je commence une vraie mise en production : au-delà de mon PC de bureau et de mon smartphone. Une fois cette nouvelle étape engagée, j'aurai aussi d'autres points à penser : comment faire connaître les logiciels, est-ce qu'ils répondent à une vraie demande ? Préparer des licences de test ou de partenaires avant de lancer une commercialisation ? Il y a des points que je ne maîtrise pas aussi bien que les idées d'amélioration, d'optimisation, de nouveauté dans mon domaine… Et une fois cette nouvelle étape bien entamée, je pourrai m'atteler à un autre projet industriel qui me trotte dans la tête depuis quelque temps, et qui viendra peut-être compléter la plateforme.

Peut-être un objectif de l'année prochaine. Mais pour le moment, il me reste encore six mois pour compléter, améliorer et finaliser ce challenge de début d'année, qui est devenu assez conséquent à une vitesse grand V.
Objectifs Vie des projets · 2ᵉ semestre 2026
Juin Juil. Août Sept. Oct. Nov. Déc.
🎯 Septembre 2026
Les 3 applications en test production 24h/24 sur au moins 2 sites.
🚀 Décembre 2026
Commercialisation des 3 logiciels : ≥ 1 site avec installation et formation client · 1 site installation autonome · maintenance serveur à distance.
Objectifs Ajout/Amélioration dev des projets · 2ᵉ semestre 2026
🔧 Hataline
  • À compléter
⚡ LivePLC
  • À compléter
📱 Qwipment
  • À compléter

Roadmap dev LivePLC: M'inspirer de l'expérience de terrain pour imaginer les futurs outils > prédire les pannes, automatiser l'expertise et tout ce qui reste à faire...

Depuis le premier commit de LivePLC en janvier 2026, je tiens une liste de toutes les idées qui me passent par la tête : fonctionnalités à ajouter, optimisations à réaliser, bugs à corriger, pistes à explorer. Elle vit dans mon application todo personnelle, et elle ne fait qu'augmenter au fil des sessions de développement et de mon quotidien sur le terrain. Chaque problème résolu en génère deux nouveaux, chaque nouvelle fonctionnalité révèle trois usages auxquels je n'avais pas pensé.

Voici un état des lieux complet, trié par catégorie: ce qui a été fait, ce qui reste à faire, et surtout ce qui me semble le plus prometteur à court terme.

⭐ Modules très prometteurs : priorité haute
🧠 Widget apprentissage : deux cas concrets
① Gestion de la lame de coupe
Aujourd'hui, la machine coupe selon la courbe choisie par l'opérateur : aucune gestion dynamique. Le module pourrait archiver les données de chaque coupe (vitesse, position, type de produit, commande) et analyser les courbes pour trouver les paramètres optimaux selon chaque profil de production. Résultat attendu : les réglages s'adaptent automatiquement à la production en cours, l'opérateur n'a plus à se préoccuper du profil de coupe et on passe de 400 à 600 coupes par lame.
② Démarrage moussage automatisé
Le démarrage de production au poste moussage est un moment critique entièrement géré à la main : déplacement de la tête, vitesse de ligne, réglages en temps réel. Le module archive toutes les actions opérateur et les données capteurs (débit, pression, température, humidité, type de production), les classe et génère une bibliothèque de profils de démarrage par type de production. À terme : le module gère seul le démarrage et l'optimise : l'opérateur se concentre sur autre chose, et plus aucune perte de savoir-faire si l'opérateur est absent.
🔮 Outils prédictifs
Le problème : la lame qui coupe les produits finit par casser ... et ça arrive à un moment incontrôlé. On arrête la production en urgence, les produits en cours partent au rebut.

La solution : des capteurs de vibration et de chaleur posés sur les guides-lames alimentent le widget. En un mois de collecte, il dresse les courbes d'usure détaillées et peut alors prédire : « dans 50 coupes, la lame va casser. » On planifie un arrêt propre au bon moment : moins de rebut, zéro arrêt subi.
🧪 Simulation mousse PIR/PUR
Jumeau chimique temps réel : prédire le cream time, le gel time et la hauteur d'expansion en fonction de l'humidité ambiante, de la vitesse ligne et de la recette. Le module calcule la correction automatique avant que le défaut n'apparaisse.
Nouveaux modules & widgets
✅ Réalisé
  • Widget enregistreurs (datalogger)
  • Widget caméras
  • Widget grafcets (pulse, glass, centrage)
  • Widget QR code page (kiosque, maintenance, stat)
  • Barre de navigation + page de navigation
  • Barre d'outils latérale flottante
  • Image / logo dans navigation
  • Performances monitor (snapshot + comparaison)
  • Module ancien apprentissage → converti en widget
⬜ À faire
  • ★ Widget modèle d'apprentissage
  • ★ Simulation mousse PIR/PUR live
  • ★ Widget outils prédictifs / FFT
  • Widget timeline (planning, drag & drop)
  • Widget statistiques auto (détection widgets du poste)
  • Vision smartphone/lunettes augmentées AR (surimpression données capteurs / alertes / prédictions)
  • Widget communication email / SMS
  • Widget sélecteur valeurs prédéfinies (bargraphe boutons)
  • Journal des événements (timeline + report auto)
  • Io-link / MQTT y-path
  • WebSerial API (capteurs legacy RS-232/RS-485)
ProductionLine & jumeau numérique
✅ Réalisé
  • Twin 2D avec InfluxDB + notifications arrivée
  • Suivi panneau à contrôler (marquage visuel)
  • Tag position imprimante → génération message
  • Composant ProductionLine avec zones, codeur, décompte
  • Temps passé par objet dans une zone
  • Save point : snapshot valeurs à des zones clés
  • Zones buffer (accumulateur, trieuse, éjecteur)
  • Modèles de ligne sauvegardables
  • Point zéro de la ligne (distances précises machines)
  • ID unique pour zones lors insertion
  • Protection clic involontaire effacement
⬜ À faire
  • Nombre d'unités / ml dans une portion (refroidisseur)
  • Alertes passage/sortie objet marqué d'une zone
  • Zones de stockage (cariste, optimisation espace)
  • Simulateur : animation scie (coupe + retour début zone)
  • 2ème sortie d'évacuation pour une zone
  • Déduire localisation défaut (pales, griffes, tôle)
  • QR codes équipements positionnés sur le twin
Éditeur, UX, tags & connectivité
✅ Réalisé
  • Zoom dans l'édition de page
  • Sélection multiple (rectangle + shift-click)
  • Grouper / dégrouper composants
  • Exporter / importer projets et pages
  • Numéro de version par composant
  • Afficher widgets de la page dans barre d'outils
  • Forcer dashboard pagecard mode portable
  • Adapter affichage téléphone (mode absolu)
  • Bouton configuration accès smartphone
  • Mode kiosque (blocage interactions + renvoi pages)
  • Bouton enregistrer mode portable corrigé
  • Calcul fin de production estimée
  • Tags : dupliquer lot avec offset regex
⬜ À faire
  • Charte couleurs + thème global tous widgets
  • Taille police modifiable dans widgets
  • Ordre alphabétique pagecards mode portable
  • Bouton dark/light hors config super admin
  • Option "Fixer vue en runtime" (ProductionLine)
  • Recipe : insérer / supprimer + standardisation
  • Bibliothèque utilisateur de modèles de composants
  • Ajouter / modifier tags depuis n'importe quel widget
  • Retour état tag PLC pour bouton (confirmation)
  • Log écriture API PLC (7 jours glissants)
  • Afficher liste enregistreurs actifs + les arrêter
  • Check régulier PLCs dans affichage + alertes perte
  • Report crash avec log des dernières actions
  • Corriger enregistrement caméra
  • Utiliser l'outil de performance pour scorer les widgets et une page entière de supervision pour connaître son taux d'optimisation
QR codes, accès & déploiement
✅ Réalisé
  • Licences et gestion des droits
  • Correction compteur licences utilisées
⬜ À faire
  • Version allégée Supervisor (sans édition)
  • Version allégée Runtime Machine (sans édition)
  • Version Display purgée (sans API écriture)
  • Tester LivePLC sur PC endurcis rail DIN / Raspberry Pi + Dresser liste compatibilité
  • Site support + documentation RGPD
  • GEO / SEO + référencement IA + partenaires
Cette liste est mon carnet de bord autant que ma feuille de route. Certains items attendent depuis des mois, d'autres émergent d'une conversation ou d'un problème rencontré en usine le matin même. Ce qui est certain : les modules d'apprentissage et de prédiction représentent le vrai saut qualitatif à venir : passer d'une supervision qui affiche à une supervision qui prédit.