OPC UA · BMS · DESIGO CC · Beckhoff · asyncua · MQTT PubSub · 11 min de lecture

OPC UA dans l'automatisation des bâtiments : Intégration BMS, journalisation des données et KPI

OPC UA est devenu l'épine dorsale de l'intégration des bâtiments intelligents modernes, offrant une interface unique et neutre vis-à-vis des fournisseurs qui connecte les contrôleurs BMS, les compteurs d'énergie, les équipements CVC et les plateformes d'analyse cloud. Contrairement à BACnet ou Modbus, OPC UA intègre la sécurité et un modèle d'information auto-descriptif – ce qui signifie qu'un système de gestion de l'énergie peut découvrir tous les points de données disponibles à partir d'un serveur DESIGO CC ou TwinCAT sans nécessiter de carte de registre ou de liste de points séparée.

Rôle d'OPC UA dans les bâtiments

Un bâtiment commercial typique intègre trois sous-systèmes ou plus qui utilisaient historiquement des protocoles incompatibles : un système BMS BACnet/IP pour le CVC et le contrôle d'accès, des compteurs d'énergie Modbus RTU sur un bus série, et un GMAO (système de gestion de maintenance assistée par ordinateur) pour les enregistrements de maintenance des équipements. OPC UA agit comme couche d'intégration horizontale, fournissant une interface unifiée de lecture/écriture/abonnement à tous les sous-systèmes depuis une seule connexion client.

Le serveur OPC UA se situe entre les protocoles de terrain et la couche informatique. Il interroge ou s'abonne aux données des sous-systèmes BACnet, Modbus et KNX à l'aide de pilotes spécifiques aux protocoles, puis expose toutes les données dans un espace d'adressage unique et navigable. Les clients – systèmes SCADA, plateformes de gestion d'énergie, tableaux de bord et connecteurs cloud – se connectent une fois au serveur OPC UA et accèdent à toutes les données du bâtiment via une API standard, quel que soit le protocole sous-jacent.

Topologie d'intégration OPC UA dans le bâtiment

Field layer (field protocols)
  BACnet/IP: Siemens PXC200, Distech EC-Net controllers
  Modbus TCP: Schneider PM5xxx energy meters, Janitza UMG 96
  KNX/IP: WEINZIERL KNX IP Interface 731
  M-Bus: heat meters, gas meters (IEC 62056)

  ↓ protocol drivers (inside BMS or gateway)

OPC UA Server layer
  Siemens DESIGO CC with OPC UA server module
    └── exposes BACnet objects as OPC UA Variables
    └── exposes alarm conditions as OPC UA AlarmCondition
  Beckhoff TwinCAT OPC UA Server
    └── exposes PLC variables directly from ADS runtime
  Kepware KEPServerEX
    └── multi-protocol gateway (BACnet + Modbus → OPC UA)

  ↓ opc.tcp:// or opc.wss://

Clients (standard OPC UA)
  Energy management platform (Schneider PME, EcoStruxure)
  SCADA / MES (Ignition, WinCC OA, Aveva)
  Cloud connector (Azure IoT OPC Publisher, AWS Greengrass)
  Analytics / dashboards (Grafana OPC UA plugin, Power BI)

Options d'implémentation du serveur OPC UA

Pour l'automatisation des bâtiments, trois implémentations de serveur OPC UA dominent. Chacune est adaptée à un écosystème BMS et à une plateforme matérielle différents.

ServeurPlateformePilotes de protocoleLicence
Siemens DESIGO CC avec OPC UAWindows Server, serveur d'applications DESIGO CCBACnet/IP, BACnet MS/TP, KNX, Modbus, M-Bus via les pilotes DESIGOPayant – inclus dans la licence DESIGO CC
Schneider EcoStruxure BMS OPC UAServeur EcoStruxure Building Operation (EBO)BACnet/IP, Modbus, LON, M-Bus, DALIPayant – licence EBO
Serveur Beckhoff TwinCAT OPC UAPC Windows exécutant l'environnement d'exécution TwinCAT 3TwinCAT ADS (variables API), EtherCAT I/O, Modbus via blocs fonction APIGratuit avec licence TwinCAT
Kepware KEPServerEXPC/serveur Windows (passerelle autonome)BACnet/IP, Modbus RTU/TCP, OPC DA, SNMP, EtherNet/IP, 150+ pilotesPayant — licence par pilote
Pro-face Remote HMI OPC UALinux embarqué sur GP4000/GP4600 HMIModbus TCP, EtherNet/IP, Mitsubishi MC ProtocolInclus avec l'IHM

Serveur Beckhoff TwinCAT OPC UA — gratuit pour les intégrateurs : Si vous utilisez TwinCAT 3 comme runtime PLC pour un contrôleur de bâtiment, le serveur TwinCAT OPC UA est inclus sans frais supplémentaires. Il expose toutes les variables PLC déclarées avec l'attribut {attribute 'OPC.UA.DA' := '1'} directement en tant que nœuds OPC UA. C'est la voie la moins coûteuse vers OPC UA dans les nouveaux contrôleurs de bâtiment montés en armoire.

Modèle d'information OPC UA pour les bâtiments

IEC 62541-100 (OPC UA pour les bâtiments) définit un modèle d'information standardisé mappant les concepts de la norme ISO 16739-1 IFC (Industry Foundation Classes) sur les types d'objets OPC UA. Cela permet à un système de gestion de l'énergie de naviguer dans l'espace d'adressage d'un serveur de bâtiment en utilisant des noms de types bien connus – SpaceType, ZoneType, HVACSystemType – plutôt que des chemins de chaînes spécifiques au fournisseur.

Structure du modèle d'information du bâtiment selon IEC 62541-100

BuildingType (ns=2;s=Building_Alpha_Tower)
├── SiteType (ns=2;s=Site_Riga_01)
│   ├── BuildingStoreyType (ns=2;s=Floor_03)
│   │   ├── SpaceType (ns=2;s=Office_3A)  ← IFC IfcSpace mapping
│   │   │   ├── AirTemperature [Variable, Float, °C]
│   │   │   ├── CO2Concentration [Variable, UInt16, ppm]
│   │   │   └── OccupancyState [Variable, Boolean]
│   │   └── SpaceType (ns=2;s=Meeting_3B)
│   └── BuildingStoreyType (ns=2;s=Floor_04)
├── HVACSystemType (ns=2;s=AHU_Main_01)  ← IFC IfcSystem mapping
│   ├── SupplyAirTemperature [Variable, Float, °C]
│   ├── ExhaustAirTemperature [Variable, Float, °C]
│   ├── HeatingCoilValve [Variable, Byte, 0–100%]
│   ├── CoolingCoilValve [Variable, Byte, 0–100%]
│   ├── FanSpeed [Variable, UInt16, RPM]
│   └── OperatingMode [Variable, Enum: Off/Auto/Heating/Cooling/Night]
└── EnergyMeterType (ns=2;s=MainMeter_kWh)  ← IEC 62056 meter
    ├── ActiveEnergyImport [Variable, Double, kWh]
    ├── ActivePower [Variable, Float, kW]
    └── Timestamp [Variable, DateTime]

Extraction des KPI énergétiques via abonnement OPC UA

La gestion de l'énergie nécessite des relevés kWh fiables et horodatés provenant des nœuds de compteurs. Plutôt que d'interroger les compteurs à intervalles fixes (ce qui peut manquer les pics et génère un trafic constant), utilisez des abonnements OPC UA avec un PublishingInterval adapté à votre granularité de rapport, et une zone morte (deadband) pour supprimer les rapports sur des incréments négligeables.

KPINœud OPC UAIntervalle recommandéBande morte
Consommation horaire en kWhActiveEnergyImport (Double, kWh)PublishingInterval 60 000 msAbsolu 0,01 kWh
Demande de pointe sur 15 minActivePower (Float, kW)PublishingInterval 900 000 msAbsolu 0,1 kW
Surveillance de la puissance en temps réelActivePower (Float, kW)Intervalle de publication 5 000 msPourcentage 1%
Relevé quotidien du compteur de chaleurThermalEnergyImport (Double, kWh th)Intervalle de publication 86 400 000 msAbsolu 0,1 kWh
Consommation de gazGas_Volume (Double, m³)PublishingInterval 3 600 000 msAbsolu 0,001 m³

OPC UA PubSub : pousser les données du bâtiment vers un courtier MQTT cloud

OPC UA PubSub (IEC 62541-14) étend le modèle client-serveur avec un modèle publication-abonnement utilisant MQTT ou la multidiffusion UDP comme transport. Au lieu qu'une plateforme cloud interroge le serveur OPC UA, le serveur envoie des DataSetMessages à un courtier MQTT selon un PublishingInterval configuré dans WriterGroup. C'est le modèle recommandé pour l'intégration cloud lorsque le serveur OPC UA est derrière un NAT ou un pare-feu qui bloque le port TCP 4840 entrant.

OPC UA PubSub — configuration de Kepware vers un courtier MQTT

# Kepware IoT Gateway Plugin — OPC UA PubSub to MQTT

Agent type: MQTT Client (Publisher)
Broker URL: mqtts://iot.yourdomain.com:8883
Client ID: kepware-building-01
TLS: enabled (CA cert + client cert for mutual TLS)

Published datasets (JSON encoding, UA-JSON):
  Topic: building/01/hvac/ahu01
  Payload (DataSetMessage, JSON):
  {
    "MessageId": "uuid-xxx",
    "PublisherId": "kepware-building-01",
    "DataSetWriterId": 1001,
    "Timestamp": "2025-03-14T10:30:00Z",
    "Payload": {
      "SupplyAirTemperature": { "Value": 18.4, "StatusCode": "Good", "SourceTimestamp": "..." },
      "FanSpeed":             { "Value": 1450, "StatusCode": "Good" },
      "HeatingCoilValve":     { "Value": 72,   "StatusCode": "Good" }
    }
  }

  Topic: building/01/energy/main-meter
  PublishingInterval: 60000 ms
  QueueSize: 1 (latest value only)

Exemple de client OPC UA Python avec asyncua

La asyncua bibliothèque (anciennement opcua-asyncio) est le client OPC UA Python recommandé pour le script d'automatisation des bâtiments. Elle prend en charge async/await, tous les modes de sécurité, les certificats X.509 et les abonnements. Installer avecpip install asyncua.

asyncua — connecter, parcourir, lire, s'abonner

import asyncio
from asyncua import Client
from asyncua.crypto.security_policies import SecurityPolicyBasic256Sha256
from asyncua.ua import MessageSecurityMode

class SubHandler:
    """Callback invoked for each subscription notification."""
    def datachange_notification(self, node, val, data):
        print(f"  DataChange: {node} = {val}  status={data.monitored_item.Value.StatusCode}")

async def main():
    url = "opc.tcp://192.168.10.50:4840/freeopcua/server/"

    async with Client(url=url) as client:
        # --- Security: Sign + Encrypt, Basic256Sha256, X.509 cert ---
        await client.set_security(
            SecurityPolicyBasic256Sha256,
            certificate="client_cert.pem",
            private_key="client_key.pem",
            server_certificate="server_cert.pem",
            mode=MessageSecurityMode.SignAndEncrypt,
        )

        print("Connected. Server namespaces:")
        for i, ns in enumerate(await client.get_namespace_array()):
            print(f"  ns={i}: {ns}")

        # --- Browse Objects root ---
        objects = client.get_objects_node()
        children = await objects.get_children()
        for child in children:
            name = await child.read_browse_name()
            print(f"  Object: {name.Name}")

        # --- Read a specific variable by NodeId ---
        temp_node = client.get_node("ns=1;s=AHU_01.SupplyAirTemperature")
        temp_value = await temp_node.read_value()
        print(f"Supply air temperature: {temp_value:.1f} °C")

        # --- Read EngineeringUnits property ---
        eu = await temp_node.read_data_value()
        print(f"StatusCode: {eu.StatusCode}")

        # --- Subscribe to multiple nodes ---
        handler = SubHandler()
        subscription = await client.create_subscription(500, handler)  # 500 ms publishing
        nodes = [
            client.get_node("ns=1;s=AHU_01.SupplyAirTemperature"),
            client.get_node("ns=1;s=AHU_01.FanSpeed"),
            client.get_node("ns=1;s=Meter.kWh"),
        ]
        await subscription.subscribe_data_change(nodes)

        print("Subscribed. Waiting 30 seconds for notifications...")
        await asyncio.sleep(30)
        await subscription.delete()

asyncio.run(main())

OPC UA pour CVC : exemples Siemens et Beckhoff

Deux plateformes courantes de contrôleurs de bâtiment exposent nativement des serveurs OPC UA. Siemens DESIGO cible les grands bâtiments commerciaux avec un BMS centralisé ; Beckhoff TwinCAT cible les contrôleurs montés en armoire avec E/S directes.

Serveur OPC UA Siemens DESIGO CC : Activé via la licence complémentaire DESIGO CC Management Platform. Le serveur expose tous les points de données DESIGO (y compris les objets BACnet importés des contrôleurs PXC) en tant que variables OPC UA dans une hiérarchie correspondant à la structure de dossiers de la station de gestion DESIGO. Point de terminaison par défaut : opc.tcp://<desigo-server>:4840. Prend en charge Sign+Encrypt avec Basic256Sha256 et les certificats clients X.509. Les conditions d'alarme et d'événement de DESIGO sont exposées en tant que nœuds OPC UA AlarmCondition.

Serveur Beckhoff TwinCAT OPC UA (TC3 OPC UA) : Gratuit avec toute licence d'exécution TwinCAT 3. Les variables API marquées avec l'attribut OPC UA dans la déclaration TEXTE STRUCTURÉ sont automatiquement publiées. Prend en charge jusqu'à 5000 éléments surveillés avec un intervalle d'échantillonnage de 10 ms sur un IPC avec un processeur standard. La série de contrôleurs de pièce DESIGO RXB comprend également un serveur OPC UA intégré (port 48040 par défaut) avec accès direct à la température ambiante, au point de consigne, à la vanne du ventilateur et à l'état du détecteur de présence.

Durcissement de la sécurité des serveurs OPC UA du bâtiment

Les serveurs OPC UA du bâtiment sont des points de convergence IT/OT et des cibles de grande valeur. Appliquez les étapes de durcissement suivantes lors de la mise en service :

Étape de durcissementAction de configuration
Désactiver l'authentification anonymeSupprimez AnonymousIdentityToken de la configuration du point de terminaison ; imposez Username ou X.509
Désactiver les politiques de sécurité obsolètesSupprimez les points de terminaison Basic128Rsa15 et Basic256 ; activez uniquement Basic256Sha256 et Aes256Sha256RsaPss
Imposer Sign+EncryptDéfinissez le MessageSecurityMode minimum = SignAndEncrypt sur tous les points de terminaison de production
Liste de confiance des certificatsImportez uniquement les certificats clients connus dans la liste de confiance du serveur ; rejetez tous les autres
Piste d'auditActiver les événements d'audit OPC UA (AuditActivateSessionEvent, AuditWriteUpdateEvent); transmettre au SIEM
Règles de pare-feuAutoriser le TCP entrant 4840 uniquement depuis les adresses IP clientes connues sur le VLAN OT; bloquer depuis le LAN IT
Surveillance de l'expiration des certificatsConfigurer des alertes lorsque les certificats serveur ou client approchent de l'expiration (avertissement à 90 jours)
TwinCAT : espace de noms en lecture seuleDéclarer les variables de surveillance comme VAR_OUTPUT ou utiliser un rôle UA pour restreindre les écritures

Exigence IEC 62443-3-3 Niveau de sécurité 2 : Pour les bâtiments soumis à la norme EN 50159 (ferroviaire) ou au périmètre BMS ISO 27001, la norme IEC 62443-3-3 SL-2 exige que toutes les connexions de gestion à distance utilisent une authentification mutuelle basée sur des certificats X.509. Les points de terminaison anonymes et avec uniquement un nom d'utilisateur doivent être désactivés sur tous les serveurs OPC UA de production.

Besoin d'une intégration OPC UA BMS pour votre projet de bâtiment ?

Nous intégrons les sous-systèmes BACnet, Modbus, KNX et M-Bus dans une couche OPC UA unifiée – connectant les compteurs d'énergie, les contrôleurs CVC et la SCADA aux analyses cloud et aux plateformes de gestion de l'énergie.

Demander un devis →
Loading...
Back to top