Aller au contenu

Jumeaux numériques

Un jumeau numérique est la représentation virtuelle vivante d'un équipement physique — il reçoit les données du terrain, les expose à des services tiers et permet de simuler des scénarios sans toucher au matériel réel.


Concept et valeur industrielle

La définition de l'IIRA (Industrial Internet Référence Architecture) est précise : un jumeau numérique est une représentation numérique d'actifs, de processus ou de systèmes dans le domaine IoT, qui peut être utilisée à des fins d'analyse, de simulation, de contrôle ou d'optimisation.

Ce n'est pas simplement une base de données de capteurs. Le jumeau numérique combine :

  1. L'état courant : les dernières valeurs de tous les capteurs de l'équipement.
  2. L'historique : les séries temporelles associées.
  3. Le modèle : les métadonnées (type d'équipement, position, spécifications constructeur).
  4. Le comportement : des règles ou modèles qui décrivent comment l'équipement réagit.

Cas d'usage concrets

Cas d'usage Description Gain
Maintenance prédictive Détecter la dégradation d'un roulement avant la panne Réduction des arrêts non planifiés de 30-50 %
Simulation what-if Tester une modification de process sans risque Réduction des tests terrain de 60 %
Optimisation énergétique Trouver le point de fonctionnement optimal 5-15 % d'économies énergie
Formation opérateurs Simuler des pannes sans risque Réduction du temps de formation
Détection d'écart Comparer le comportement réel vs le modèle théorique Identification précoce des déviations

Modélisation device et process

Ontologies et langages de modélisation

Plusieurs standards coexistent selon le domaine industriel :

Standard Domaine Organisme
DTDL (Digital Twins Définition Language) Généraliste Microsoft / Azure
WoT Thing Description Web of Things W3C
AAS (Asset Administration Shell) Industrie 4.0 Platform I4.0
OPC-UA Information Model Automation OPC Foundation
Eclipse Ditto model IoT généraliste Eclipse Foundation

Exemple de modèle DTDL — pompe centrifuge

{
  "@context": "dtmi:dtdl:context;3",
  "@id": "dtmi:industrial:pump:centrifugal;1",
  "@type": "Interface",
  "displayName": "Pompe centrifuge",
  "contents": [
    {
      "@type": ["Telemetry", "Temperature"],
      "name": "bearingTemperature",
      "schema": "double",
      "unit": "degreeCelsius",
      "displayName": "Température palier"
    },
    {
      "@type": "Telemetry",
      "name": "flowRate",
      "schema": "double",
      "unit": "litrePerSecond"
    },
    {
      "@type": "Property",
      "name": "operationalState",
      "schema": {
        "@type": "Enum",
        "valueSchema": "string",
        "enumValues": [
          {"name": "running",    "enumValue": "RUNNING"},
          {"name": "stopped",    "enumValue": "STOPPED"},
          {"name": "fault",      "enumValue": "FAULT"},
          {"name": "maintenance","enumValue": "MAINTENANCE"}
        ]
      },
      "writable": true
    },
    {
      "@type": "Command",
      "name": "emergencyStop",
      "displayName": "Arrêt d'urgence"
    }
  ]
}

Eclipse Ditto

Eclipse Ditto est le moteur open source de jumeaux numériques le plus complet de l'écosystème Java/Eclipse. Il expose une API REST et WebSocket pour interagir avec les jumeaux, et gère la persistance, la synchronisation et la politique d'accès.

Architecture interne Ditto

graph TB
    subgraph "Devices / Edge"
        D1[Capteur physique]
        GW[Gateway]
    end

    subgraph "Eclipse Ditto"
        CONN[Connectivity Service\nMQTT / AMQP / Kafka / HTTP]
        THINGS[Things Service\nÉtat courant des jumeaux]
        POLICIES[Policies Service\nContrôle d'accès]
        SEARCH[Search Service\nIndex de recherche]
        GATEWAY[Gateway Service\nAPI REST / WebSocket]
        MONGO[(MongoDB\nPersistance)]
    end

    subgraph "Consommateurs"
        APP[Application métier]
        DASH[Grafana / Dashboard]
        RULES[Moteur de règles]
        SIM[Simulateur what-if]
    end

    D1 -->|MQTT| GW
    GW -->|MQTT / HTTP| CONN
    CONN --> THINGS
    THINGS --> MONGO
    THINGS --> SEARCH
    POLICIES --> THINGS
    GATEWAY --> THINGS
    GATEWAY --> POLICIES
    GATEWAY --> SEARCH
    APP -->|REST / WebSocket| GATEWAY
    DASH -->|REST| GATEWAY
    RULES -->|WebSocket events| GATEWAY
    SIM -->|REST PATCH| GATEWAY

Création d'un jumeau via l'API REST

# Créer un jumeau pour la pompe P-042
curl -X PUT \
  "https://ditto.example.com/api/2/things/industrial:pump-P042" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "definition": "dtmi:industrial:pump:centrifugal;1",
    "attributes": {
      "manufacturer": "Grundfos",
      "model": "CM5-4",
      "serialNumber": "GF-2024-00423",
      "installDate": "2024-03-15",
      "location": { "site": "factory-A", "zone": "Z3", "line": "L2" }
    },
    "features": {
      "telemetry": {
        "properties": {
          "bearingTemperature": null,
          "flowRate": null,
          "motorCurrent": null
        }
      },
      "operationalState": {
        "properties": {
          "state": "STOPPED",
          "lastStateChange": null
        }
      }
    }
  }'

Mise à jour de l'état via un message entrant

# Mettre à jour la température du palier
curl -X PATCH \
  "https://ditto.example.com/api/2/things/industrial:pump-P042/features/telemetry/properties" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "bearingTemperature": 72.3,
    "flowRate": 4.85,
    "motorCurrent": 8.2
  }'

Boucle de synchronisation réel/virtuel

sequenceDiagram
    participant HW as Capteur physique
    participant GW as Gateway
    participant MQTT as EMQX Broker
    participant DITTO as Eclipse Ditto
    participant APP as Application
    participant SIM as Simulateur

    HW->>GW: Mesure (Modbus/OPC-UA)
    GW->>MQTT: MQTT PUBLISH\niot/pump-P042/telemetry
    MQTT->>DITTO: Connectivity bridge\n(MQTT → Ditto protocol)
    DITTO->>DITTO: Mise à jour features\nnotification WebSocket
    DITTO->>APP: Event SSE/WebSocket\n"thing modified"
    APP->>DITTO: GET /things/pump-P042\nétat courant complet
    APP->>SIM: Injecter état courant\npour simulation what-if
    SIM->>SIM: Simuler scénario\n(panne roulement dans 48h ?)
    SIM->>APP: Résultat prédiction
    APP->>DITTO: PATCH predicted_failure_date\n(propriété calculée)

Simulation what-if

La simulation what-if est l'un des cas d'usage les plus puissants du jumeau numérique. Elle permet de répondre à des questions telles que :

  • "Si j'augmente la consigne de température de 5°C, quel est l'impact sur la durée de vie du roulement ?"
  • "Si la pompe P-042 tombe en panne, quel est l'impact sur la production de la ligne L2 ?"

Architecture de simulation

graph TD
    TWIN["Jumeau numérique (état courant via Ditto)<br/>bearingTemp=72°C, flow=4.85 L/s, current=8.2A"]
    TWIN -->|snapshot de l'état| MODEL["Modèle de dégradation<br/>(ML LSTM ou équation physique)<br/>Input : historique 30j + paramètres constructeur<br/>Output : MTTF estimé, next maintenance date"]
    MODEL -->|résultats| RESULT["Résultats écrits dans le jumeau<br/>predictedFailureDate<br/>maintenanceRecommendation"]

Ce qu'il faut retenir

  • Un jumeau numérique n'est pas un tableau de bord : c'est un objet logiciel qui encapsule état, métadonnées et comportement d'un équipement.
  • Eclipse Ditto offre une API REST/WebSocket standardisée et un modèle de politique d'accès granulaire.
  • La simulation what-if est le cas d'usage différenciateur qui justifie la complexité d'un jumeau par rapport à une simple base time-series.

Chapitre suivant : Tableaux de bord — Grafana, datasources et optimisation des requêtes time-series pour les opérateurs et les managers.