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?
- 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.
- 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.
- 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. - Create a new server. For a TLS listener, enter the HiveMQ cluster hostname with
ssl://and port8883. For a plain listener, usetcp://and port1883. Enter the username and password from the broker's access credentials. - 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. - 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?
- Layer one first. Confirm the Opta's Ethernet link or Wi-Fi association and ping it from the same subnet.
- 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.
- Check the MQTT Engine status page in the Gateway and confirm the HiveMQ server shows connected.
- 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.
- 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.