MQTT Server Interface for WinCC OA? Made with Kotlin 😲


Starting with WinCC OA Version 3.20, you can write your business logic in JavaScript and run them using Node.js, providing direct access to the WinCC OA Runtime.

πŸ™ˆ With that, I have developed a Kotlin program that acts as an MQTT Broker. When you subscribe to a topic (where the topic name matches a datapoint name), the program will send value changes from the corresponding WinCC OA datapoint to your MQTT client.

❓ But wait, Kotlin is like Java, it runs on the JVM, it is not JavaScript!

πŸ’‘ Did you know that a Node.js Runtime built with GraalVM exists? It allows you to mix Java and JavaScript. And it also works with WinCC OA.

🀩 You can use JVM based languages and its huge ecosystem to develop business logic with WinCC OA. I have developed a Java library which makes it easier to use the WinCC OA JavaScript functions in Java.

πŸ‘‰ Here it is: https://github.com/vogler75/winccoa-graalvm please note that the example program is provided as an example; it lacks security features and has not been tested for production use. However, it can be extended and customized to meet specific requirements.

⚑ Please be aware that the GraalVM Node.js Runtime is not officially supported by WinCC Open Architecture.

Zenoh & Automation-Gateway.com

OPC UA data to Zenoh? Have you ever used zenoh.io? It’s really cool.

πŸ‘‰ I have implemented a Zenoh publisher in my fun open-source project, the Automation-Gateway.com. It can now bring data from OPC UA/MQTT/PLC4X to Zenoh, with just some lines of configuration.

😎 The cool point about Zenoh is that you publish the data from multiple sources, from multiple machines to the data centric Zenoh network – there is no central server. You can then startup a Zenoh client somewhere and subscribe to data coming from any of those sources.

🀫 It is like a distributed UNS.

🀩 And there is even more, they have a Zenoh MQTT bridge, so MQTT clients can connect to this bridge and subscribe to all the available data in the Zenoh network. A new machine/HMI/publisher can be added on the fly and the data will be visible immediately in the Zenoh MQTT bridge.

πŸ‘‰ See the screenshots. I deployed the gateway to two machines to publish data from a S7 and from a WinCC OA system to the Zenoh network. Then I started a Zenoh MQTT bridge to subscribe to some of the data with a MQTT client.

🀠 Disclaimer: I did not take care about security. I did not do any performance tests.

QuestDB: My time series data’s new best friend? πŸ“ˆ

My first tests with QuestDB on 10 years of home automation data (1.4 billion rows) are promising.

πŸ‘‰ Fast ingestion of parquet files (~1 hour on an old Intel NUC i5)

I have stored my data in parquet files, one per month, and imported it with a simple Python script. The import on my really old Intel NUC i5 took only about one hour. I’ve never been able to do this so quickly with any other database.

πŸ€” Btw.: I think storing data in #parquet files, or any other open table format, like Apache Iceberg, is one of the best choices to keep data. Because it’s independent of a database engine.

πŸ‘‰ Familiar SQL syntax. I experienced that QuestDB has a powerful SQL engine. I converted some Postgres SQL statements to QuestDB without big issues or changes. And I love SQL πŸ’š

πŸ‘‰ Great query response times – see image. Not a representative query, but still impressive speed.

πŸ‘‰ By using ZFS with compression the used disk space can be reduced to a good value.

Do you want to log your OPCUA data to QuestDB? I have added this option to the automation-gateway.com seven days ago.

Node.JS for WinCC OA? And what about Java? GraalVM? Polyglot?

πŸ₯³ Last weekend I found some time to try out an upcoming feature in WinCC Open Architecture 3.20. With the Node.js integration you can write your business logic in JavaScript with native connectivity to WinCC OA. You can take full advantage of the Node.js ecosystem.

🧐 But I am a Java enthusiast and I love the JVM ecosystem. Have you ever heard about GraalVM? It is an advanced JDK written in Java. And it has a Node.js Runtime, which gives you the power of Node.js plus the power of polyglot programming, you can mix JavaScript with Java.

πŸ‘ And it turned out that the GraalVM Node.js Runtime also works with WinCC OA! It took me some time to figure out how the polyglot interoperability works, but now I have a first draft of a Java-Library which makes it easy to use Java and OA in the Node.js environment.

🀩 I can now use Java to develop great solutions with WinCC OA.

WinCC OA & Node-Red Integration

It is very easy to get data from WinCC Open Architecture to NodeRed.

Add a new user to WinCC OA – System Management / Permission / User Administation.

We will use “node” as username.

Add Config Entry

[wssServer]
httpsPort = 8449
resourceName = "/websocket"

Start Control Manager “wss.ctl -user <username>:” Note the trailing “:” !!

wss.ctl -user node:

Node-Red: Install Palette “node-red-contrib-winccoa”

You can now add a Node. In that example we will use the dpQuery node and use “SELECT ‘_online.._value’ FROM ‘Meter_Input_WattAct.'” as query. So we just query the online value of one tag.

You have to configure the Server by clicking on the pencil button. This points to the before started Websocket Control Manager and you have to set the username and password we have added in one of the previous steps.

OPC UA Node Tree to MQTT

With just 20 lines of configuration you can publish a OPCUA tree of values to MQTT …

in this example to the HiveMQ cloud … πŸ‘‰ with the automation-gateway.com

It also supports PLC4x connected devices/plcs…

It can also publish values to Kafka or SQL databases…

git clone https://github.com/vogler75/automation-gateway.git
cd source\app
set GATEWAY_CONFIG=configs/config-opcua-mqtt.yaml
gradle run

Drivers:
  OpcUa:
  - Id: "demo"
    Enabled: true
    LogLevel: INFO
    EndpointUrl: "opc.tcp://192.168.1.3:62541"
    UpdateEndpointUrl: true
    SecurityPolicyUri: http://opcfoundation.org/UA/SecurityPolicy#None
Loggers:
  Mqtt:
    - Id: mqtt1
      Enabled: true
      Host: linux0.rocworks.local
      Port: 1883
      Ssl: false
      Topic: Enterprise/Site
      Logging:
        - Topic: opc/demo/path/Objects/Demo/SimulationMass/#

Missing UnityEngine.UI

If you are getting the following error while opening a Untiy project:

unity error CS0234: The type or namespace name 'UI' does not exist in the namespace 'UnityEngine' (are you missing an assembly reference?)

Then you just need to add the “Unity Ui” Package in the Unity Package manager.