Alarm Status Table not working on Ignition 8.3.1

I was doing a test of upgrading Ignition from 8.1 to 8.3 and was checking if alarms still work as expected and ran into an issue.
The alarms on the Alarm Status Table do not show even though they show up on the Alarm Status Journal.

I checked the logs and saw the following error:

Pasting the error as text as well:
ComponentModel Alarm Status Table at [0:0] failed to query alarms
java.util.concurrent.CompletionException: java.lang.NullPointerException
at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.completeThrowable(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture$Completion.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at com.inductiveautomation.perspective.gateway.threading.BlockingWork$BlockingWorkRunnable.run(BlockingWork.java:58)
at java.base/java.lang.Thread.run(Unknown Source)
java.lang.NullPointerException: null

I even created a new Perspective Project and tried to put a new view with the Alarm Status Table and Alarm Journal and ran into the same problem.
I checked the know issue page for 8.3.0 (8.3.0 Known Issues | Ignition User Manual) and for Alarming section it says that “Active alarms will now display correctly in the Alarm Status Table component.”, so it may have been an issue for 8.3.0 which was fixed in 8.3.1

I upgraded to Ignition 8.3.1 (b2025102109).
The Perspective module version is 3.3.1 (b2025102109).
So these should be latest.
Any help to fix/troubleshoot this issue would be appreciated.

Update
Turns out the Alarm Status Table wasn’t showing anything because of some errors that were coming when alarms coming from MQTT were present.

If I open a Script console and try a system.cirruslink.engine.readAlarms() I get


Java Traceback:
Traceback (most recent call last):
File "", line 1, in 
java.lang.NullPointerException:
java.lang.NullPointerException: java.lang.NullPointerException:
at org.python.core.Py.JavaError(Py.java:545)
at org.python.core.Py.JavaError(Py.java:536)
at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:192)
at com.inductiveautomation.ignition.common.script.ScriptManager$ReflectedInstanceFunction.__call__(ScriptManager.java:563)
at org.python.core.PyObject.__call__(PyObject.java:446)
at org.python.core.PyObject.__call__(PyObject.java:450)
at org.python.pycode._pyx54.f$0(<input>:1)
at org.python.pycode._pyx54.call_function(<input>)
at org.python.core.PyTableCode.call(PyTableCode.java:173)
at org.python.core.PyCode.call(PyCode.java:18)
at org.python.core.Py.runCode(Py.java:1703)
at org.python.core.Py.exec(Py.java:1747)
at org.python.util.PythonInterpreter.exec(PythonInterpreter.java:277)
at org.python.util.InteractiveInterpreter.runcode(InteractiveInterpreter.java:130)
at com.inductiveautomation.ignition.designer.gui.tools.jythonconsole.JythonConsole$ConsoleWorker.doInBackground(JythonConsole.java:628)
at com.inductiveautomation.ignition.designer.gui.tools.jythonconsole.JythonConsole$ConsoleWorker.doInBackground(JythonConsole.java:616)
at java.desktop/javax.swing.SwingWorker$1.call(Unknown Source)
at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
at java.desktop/javax.swing.SwingWorker.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException:
Traceback (most recent call last):
File "", line 1, in 
java.lang.NullPointerException:

java.lang.NullPointerException: java.lang.NullPointerException

This is probably the MQTT Transmission module is 4.0.30 and the MQTT Engine is 5.0.0

If I clear all MQTT alarms via system.cirruslink.engine.clearAllAlarms() then the Alarm Status Table displays alarms correctly

Good detective work. Have you contacted Cirrus Link about this already?

I think CirrusLink called out that all module versions on an ignition gateway should match, maybe mixing 4.0.30 transmission and 5.0.0 engine is causing something unexpected to happen?

Yes, from what I can tell this is the main issue. Data continues to come even though there is a version mismatch between Transmission & Engine, but alarms even though they are sent from the Edge causes an error when displaying it in the Alarm Status table. I have opened a ticket for Cirrus Link to ask if maybe something can be done to ensure interoperability between Transmission 4.x and Engine 5.x.

That's the annoying part of cirrus link. They want everything to match, not realizing that's about impossible to achieve when you have a large number of edge devices. I tried using their alarm pass-thru stuff, and finally just rolled my own so I was just using simple MQTT/SpB.

So you just replicated the alarms on the tags on your Ignition Gateway? Or I am misunderstanding.
The advantage of using MQTT Alarms is that if you acknowledge them on the Gateway, they will be acknowledged on the Edge as well which is what I am most interested in.

Using mqtt tags for each of the alarm props that I want to pass thru. As well as some to pass acknowledgements both ways. And some scripting.

So I can acknowledge on edge or central, and the acknowledgement is passed thru, along with adding a note indicating where it was acknowledged.

It's currently not setup to handle multiple ActUnack alarms on a single tag, but for our purposes it does what I need it to.