OPC-UA to MQTT Bridge
Installation
- Take the tarball from the Release area and unpack it in the desired location on the edge device
- The systemctl service script assumes to find the application at
/home/alarm/KROHNE/opcua2mqtt-bridge
, so it is a good idea to put it there - Create a configuration directory
/etc/opcua2mqtt-bridge
and place the adjustedconfig.json
into it - Enable the service using
sudo systemctl enable /home/alarm/KROHNE/opcua2mqtt-bridge/opcua2mqtt-bridge.service
- Start the service using
sudo systemctl start opcua2mqtt-bridge
- Check the log messages using
journalctl -f
Configuration
{
"mqtt": {
"broker": "172.16.2.16",
"port": 1883,
"publishTopicPrefix": "opcua"
},
"stats": {
"topic": "statistics",
"period": 60
},
"opcua": [
{
"enabled": "true",
"type": "flat",
"url": "opc.tcp://172.16.3.60:4840",
"name": "apl",
"period": 1.0,
"timeout": 1.0,
"nodes": [
{ "ns": 0, "n": "i=345", "d": "pv" },
{ "ns": 0, "n": "i=348", "d": "sv" },
{ "ns": 0, "n": "i=351", "d": "tv" },
{ "ns": 0, "n": "i=354", "d": "qv" }
]
}
]
}
The configuration object consists of three parts: mqtt
, stats
and opcua
.
In mqtt
the access to the broker is configuration and the prefix for the topics used by the statistics module and the actual bridge are defined.
Besides the above shown attributes the login
and password
for authentication at the broker and ca
, cert
and key
for TLS connections to the broker are available. ca
, cert
and key
contain the filenames including complete path of the particular files.
In stats
the topic suffix and the period of statistics messages are defined. The complete suffix will be ${mqtt.publicTopicPrefix}/${stats.topic}
.
The section opcua
contains a list of OPC-UA servers to be queried. Each entry can be enabled/disabled using the attribute enabled
. The attribute url
obviously has the URL to connect the server, period
is the period to repeat queries and timeout
is the timeout when talking to a server.
name
identifies the particular server, it becomes part of the topic of the published MQTT messages. The attribute type
defines whether the individual variables of an OPC-UA server shall be communicated in individual MQTT messages (flat
) or all variables of a server in a single message (structured
).
The attribute nodes
finally contains the list of variables to be queried. It contains the namespace index (ns
), the node-id (n
) and an optional descriptive name (d
). Namespace index and node-id can be determined using for instance UAExpert when browsing the server and navigating to the relevant variables. The descriptive name - if given, otherwise the display name of the variable is used - becomes in flat
mode part of the topic, in structured
mode it becomes an attribute name within the message.
Example Output
Besides the value itself the output contains the status of the value and a couple of timestamps (from device t1
, server t2
and bridge t3
).
In flat
mode the final topic will be ${mqtt.publicTopicPrefix}/${opcua.name}/${opcua.node.ns}/${opcua.node.d}
An example for the MQTT messages according to the above configuration in flat
mode is:
opcua/apl/0/pv {
"server": "apl",
"ns": 0,
"d": "pv",
"value": 19.833280563354492,
"status": "Good",
"t1": "2022-02-22 17:03:41.189000",
"t2": "2022-02-22 17:03:41.189000",
"t3": "2022-02-22 17:03:41.575504"
}
opcua/apl/0/sv {
"server": "apl",
"ns": 0,
"d": "sv",
"value": 1706.15771484375,
"status": "Good",
"t1": "2022-02-22 17:03:41.189000",
"t2": "2022-02-22 17:03:41.189000",
"t3": "2022-02-22 17:03:41.625721"
}
opcua/apl/0/tv {
"server": "apl",
"ns": 0,
"d": "tv",
"value": 23.29559326171875,
"status": "Good",
"t1": "2022-02-22 17:03:41.189000",
"t2": "2022-02-22 17:03:41.189000",
"t3": "2022-02-22 17:03:41.675352"
}
opcua/apl/0/qv {
"server": "apl",
"ns": 0,
"d": "qv",
"value": NaN,
"status": "Good",
"t1": "2022-02-22 17:03:41.189000",
"t2": "2022-02-22 17:03:41.189000",
"t3": "2022-02-22 17:03:41.725487"
}
In structured
mode the final topic will be ${mqtt.publicTopicPrefix}/${opcua.name}
An example for the MQTT messages according to the above configuration in flat
mode is:
opcua/apl {
"pv": {
"value": 19.835201263427734,
"status": "Good",
"t1": "2022-02-22 16:58:21.188000",
"t2": "2022-02-22 16:58:21.188000",
"t3": "2022-02-22 16:58:22.071619"
},
"sv": {
"value": 1704.4019775390625,
"status": "Good",
"t1": "2022-02-22 16:58:21.188000",
"t2": "2022-02-22 16:58:21.188000",
"t3": "2022-02-22 16:58:22.121559"
},
"tv": {
"value": 23.08197021484375,
"status": "Good",
"t1": "2022-02-22 16:58:21.188000",
"t2": "2022-02-22 16:58:21.188000",
"t3": "2022-02-22 16:58:22.171498"
},
"qv": {
"value": NaN,
"status": "Good",
"t1": "2022-02-22 16:58:21.188000",
"t2": "2022-02-22 16:58:21.188000",
"t3": "2022-02-22 16:58:22.221639"
}
}