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.
| Serveur | Plateforme | Pilotes de protocole | Licence |
|---|---|---|---|
| Siemens DESIGO CC avec OPC UA | Windows Server, serveur d'applications DESIGO CC | BACnet/IP, BACnet MS/TP, KNX, Modbus, M-Bus via les pilotes DESIGO | Payant – inclus dans la licence DESIGO CC |
| Schneider EcoStruxure BMS OPC UA | Serveur EcoStruxure Building Operation (EBO) | BACnet/IP, Modbus, LON, M-Bus, DALI | Payant – licence EBO |
| Serveur Beckhoff TwinCAT OPC UA | PC Windows exécutant l'environnement d'exécution TwinCAT 3 | TwinCAT ADS (variables API), EtherCAT I/O, Modbus via blocs fonction API | Gratuit avec licence TwinCAT |
| Kepware KEPServerEX | PC/serveur Windows (passerelle autonome) | BACnet/IP, Modbus RTU/TCP, OPC DA, SNMP, EtherNet/IP, 150+ pilotes | Payant — licence par pilote |
| Pro-face Remote HMI OPC UA | Linux embarqué sur GP4000/GP4600 HMI | Modbus TCP, EtherNet/IP, Mitsubishi MC Protocol | Inclus 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.
| KPI | Nœud OPC UA | Intervalle recommandé | Bande morte |
|---|---|---|---|
| Consommation horaire en kWh | ActiveEnergyImport (Double, kWh) | PublishingInterval 60 000 ms | Absolu 0,01 kWh |
| Demande de pointe sur 15 min | ActivePower (Float, kW) | PublishingInterval 900 000 ms | Absolu 0,1 kW |
| Surveillance de la puissance en temps réel | ActivePower (Float, kW) | Intervalle de publication 5 000 ms | Pourcentage 1% |
| Relevé quotidien du compteur de chaleur | ThermalEnergyImport (Double, kWh th) | Intervalle de publication 86 400 000 ms | Absolu 0,1 kWh |
| Consommation de gaz | Gas_Volume (Double, m³) | PublishingInterval 3 600 000 ms | Absolu 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 durcissement | Action de configuration |
|---|---|
| Désactiver l'authentification anonyme | Supprimez AnonymousIdentityToken de la configuration du point de terminaison ; imposez Username ou X.509 |
| Désactiver les politiques de sécurité obsolètes | Supprimez les points de terminaison Basic128Rsa15 et Basic256 ; activez uniquement Basic256Sha256 et Aes256Sha256RsaPss |
| Imposer Sign+Encrypt | Définissez le MessageSecurityMode minimum = SignAndEncrypt sur tous les points de terminaison de production |
| Liste de confiance des certificats | Importez uniquement les certificats clients connus dans la liste de confiance du serveur ; rejetez tous les autres |
| Piste d'audit | Activer les événements d'audit OPC UA (AuditActivateSessionEvent, AuditWriteUpdateEvent); transmettre au SIEM |
| Règles de pare-feu | Autoriser 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 certificats | Configurer des alertes lorsque les certificats serveur ou client approchent de l'expiration (avertissement à 90 jours) |
| TwinCAT : espace de noms en lecture seule | Dé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 →