Configuring Cirrus Link MQTT Engine for Arduino Opta to Ignition

Daniel Price6 min read
Industrial NetworkingOther ManufacturerTechnical Reference
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

Where does the data stop between the Opta and Ignition?

Follow the packet. The Arduino Opta is the MQTT client and publishes to a topic. HiveMQ is the broker. It stores nothing for Ignition and forwards each message only to clients that hold a matching subscription. A stock Ignition gateway has no MQTT client, so nothing on the Ignition side subscribes. When the Opta publishes successfully and HiveMQ shows traffic but Ignition shows nothing, the data is stopping at the broker. The missing piece is a subscriber inside the gateway, and the Cirrus Link MQTT Engine module provides it.

Hop Role Transport What to check
Opta MQTT client, publisher Ethernet or Wi-Fi, TCP out Link up, IP/gateway/DNS valid, publish return code
Site network / firewall Carries outbound TCP 1883 (plain) or 8883 (TLS) Outbound port open, DNS resolves the broker hostname
HiveMQ broker Routes by topic MQTT Client connected, credentials accepted, messages arriving
Ignition gateway Needs a subscriber MQTT Engine module Module installed, server connected, topic subscribed
Ignition tag provider Tags for HMI/historian Internal Tags present, quality Good, timestamps moving

Which Ignition module actually subscribes to HiveMQ?

Cirrus Link supplies three MQTT modules for Ignition. Each one does a different job, and installing the wrong one is a common dead end.

Module Function Needed here?
MQTT Engine MQTT client that subscribes to a broker and creates Ignition tags from the incoming messages Yes
MQTT Distributor MQTT broker hosted inside the Ignition gateway Only if you replace HiveMQ
MQTT Transmission Publishes Ignition tags out to a broker No, because it sends data the other way

Get the modules from the Inductive Automation downloads page. Select Other operating systems and versions and open the Strategic Partner Modules section. Pick the MQTT Engine build that matches your gateway's Ignition major/minor version. A mismatched build loads as faulted.

Which payload path fits the Opta: Sparkplug B or a custom namespace?

MQTT Engine accepts data in two forms. Sparkplug B is its native format. It uses protobuf-encoded payloads on the spBv1.0/ topic namespace, with birth and death certificates. The second form is a custom namespace, which subscribes to arbitrary topics and parses plain or JSON payloads into tags. A third option removes HiveMQ altogether and uses MQTT Distributor as the broker.

Criterion Sparkplug B from Opta JSON + Engine custom namespace MQTT Distributor instead of HiveMQ
Opta-side effort High: protobuf encoding, birth/death, sequence numbers, rebirth handling Low: keep the existing publish code Low: change the broker address only
Tag auto-discovery Full, with data types from the birth certificate Tags built from topic path and JSON keys Depends on the payload choice
Stale-data detection Built in through death certificate and STATE Manual: last-will message or heartbeat tag Depends on the payload choice
Network path Unchanged Unchanged Opta must reach the gateway directly
Fit when data already flows into HiveMQ Requires rewriting the firmware Best Discards the working cloud hop

Recommendation: the Opta already delivers data to HiveMQ, so leave the firmware alone. Subscribe to the existing topics with an MQTT Engine custom namespace and have the Opta send JSON. Move to Sparkplug B later if you need typed auto-discovery and birth/death state across many devices.

How do I install MQTT Engine and point it at HiveMQ?

  1. In the Gateway web interface, open Config > System > Modules, then click Install or Upgrade a Module and upload the MQTT Engine module file. Accept the license and the module certificate.
  2. Confirm the module shows Running. Without a license it runs in trial mode and stops when the trial window expires. Reset the trial or activate a license.
  3. Open Config > MQTT Engine > Settings > Servers. The default server entry points at a local broker on localhost:1883, which assumes MQTT Distributor is installed. Disable or delete that entry if Distributor is not installed.
  4. Create a new server. For a TLS listener, enter the HiveMQ cluster hostname with ssl:// and port 8883. For a plain listener, use tcp:// and port 1883. Enter the username and password from the broker's access credentials.
  5. Open the Namespaces tab and create a custom namespace. Set the subscription to the Opta's topic filter, for example opta/# if that is your publish root. Enable the JSON payload option and set a root tag folder name. Save the namespace.
  6. On the Opta, publish each topic as a valid JSON object (key/value pairs) rather than a bare number or string. Give it a unique client ID and configure a last-will message on a status topic.

What breaks the link once it connects?

Symptom Mechanism Fix
Engine server stays disconnected tcp:// used against a TLS-only listener, or wrong port Match the scheme and port to the broker listener: ssl://:8883 for TLS
Connected, authentication refused Credentials were created for a different cluster, or permissions do not cover the topic Recreate the credentials and grant subscribe rights on the topic tree
Connected, no tags Subscription filter does not match the actual topic (case, leading slash, wrong root) Copy the exact topic string from a test client and use # during commissioning
One string tag per topic instead of fields JSON option off, or payload is not valid JSON Enable JSON on the namespace and fix quoting in the Opta payload
Opta and another client keep disconnecting each other Duplicate client ID: the broker drops the older session Assign a unique client ID per device and per test tool
Tags freeze at the last value with Good quality Custom namespaces have no death certificate Publish a heartbeat counter and a last-will status, then alarm on stale timestamps
Module faulted after an upgrade Module build does not match the gateway version Install the matching MQTT Engine build

How do I verify tags are live end to end?

  1. Layer one first. Confirm the Opta's Ethernet link or Wi-Fi association and ping it from the same subnet.
  2. Subscribe to the Opta topic on HiveMQ with an independent MQTT client, using a separate client ID. Confirm the JSON arrives at the expected rate. If it does not, the fault is on the Opta or firewall side, not in Ignition.
  3. Check the MQTT Engine status page in the Gateway and confirm the HiveMQ server shows connected.
  4. In the Designer Tag Browser, expand the MQTT Engine tag provider and the custom namespace root folder. Confirm one tag per JSON key with Good quality.
  5. Force a change at the Opta, such as toggling a digital input or changing a test value. Watch the matching Ignition tag's value and timestamp update within one publish interval.

FAQ

How do I download the Cirrus Link MQTT Engine module for Ignition?

On the Inductive Automation downloads page, select Other operating systems and versions and open Strategic Partner Modules. Download the MQTT Engine build that matches your gateway version, then install it under Config > System > Modules.

How do I connect MQTT Engine to a HiveMQ broker?

Add a server under MQTT Engine > Settings > Servers with the broker hostname, using ssl:// on port 8883 for TLS or tcp:// on 1883 for plain, plus the broker credentials. Disable the default localhost entry if MQTT Distributor is not installed.

How do I get JSON from an Arduino Opta into Ignition tags without Sparkplug B?

Create an MQTT Engine custom namespace, subscribe it to the Opta topic filter, and enable the JSON payload option. Each JSON key becomes a tag under the namespace root folder.

Why does MQTT Engine show connected but no tags appear?

The subscription filter does not match the published topic, or no custom namespace exists and the Opta payload is not Sparkplug B. Compare the exact topic string seen in a test client with the namespace subscription, and use # while commissioning.

Back to blog