Firmware update status chart not refreshing in real time on device dashboard

Our firmware update status chart on the Cisco Kinetic device dashboard isn’t refreshing in real time. When we push firmware updates to devices, the chart shows the status as ‘In Progress’ but never updates to ‘Completed’ or ‘Failed’ without a manual page refresh.

We’re using cciot-24 and I can see the MQTT events being published:

mqttClient.subscribe('firmware/status/#');
mqttClient.on('message', (topic, payload) => {
  console.log('Status update:', payload);
});

The console shows the status updates arriving, but the chart component doesn’t reflect them. The dashboard subscription logic seems disconnected from the firmware status event emission. Is there a specific event handler we need to wire up for real-time chart updates?

Here’s the comprehensive fix addressing all three focus areas:

MQTT/WebSocket Event Handling: The issue is twofold - initialization timing and topic pattern mismatch. First, ensure MQTT connects before dashboard initialization:

await mqttClient.connect();
await dashboardManager.initialize();

Consider switching to WebSocket for dashboard updates as it has better reconnection handling in cciot-24.

Firmware Status Event Emission: Your firmware service needs to publish to the correct topic pattern. Update your publisher:

firmwareService.publishStatus(deviceId, status, {

  topic: `device/${deviceId}/firmware/status`,

  qos: 1

});

The widget expects the ‘device/+/firmware/status’ pattern. Your current ‘firmware/status/#’ pattern isn’t matched by the default subscription.

Dashboard Subscription Logic: The built-in firmware widget in cciot-24 has a configuration option for custom topic patterns. In your dashboard configuration file, add:

"widgets": {

  "firmwareStatus": {

    "subscriptions": [

      "device/+/firmware/status",

      "firmware/bulk-update/status"

    ],

    "autoRefresh": true,

    "refreshInterval": 5000

  }

}

The key insight is that the widget’s subscription is set up during dashboard initialization. If your MQTT client isn’t connected at that moment, the subscription silently fails and the widget falls back to polling mode (which you’ve disabled).

Alternatively, if you can’t change the firmware service’s topic pattern, you can implement a topic bridge that subscribes to ‘firmware/status/#’ and republishes to ‘device/+/firmware/status’. This is cleaner than modifying the widget configuration.

After making these changes, verify the subscription is active by checking the MQTT broker logs. You should see the dashboard client subscribing to the correct topics immediately after connection establishment.

Carlos is right about initialization order. Also, cciot-24 has a known issue where firmware status events use a different topic pattern than what the widget expects by default. The widget subscribes to ‘device/+/firmware/status’ but your events might be publishing to ‘firmware/status/#’. Check the topic mapping configuration in your Kinetic settings.

You can override the default topic pattern in the widget configuration. Edit the dashboard JSON and add a topicPattern property to the firmware widget. But honestly, it’s easier to just configure your firmware service to publish to the expected topic pattern.

The built-in widget should auto-refresh, but there’s a configuration issue in cciot-24 where the widget’s event subscription isn’t initialized if the dashboard loads before the MQTT connection is established. Check your dashboard initialization order. The MQTT client needs to be connected before the widget mounts, otherwise it misses the subscription setup.

The chart component needs to be explicitly bound to the MQTT event stream. Just subscribing to the topic isn’t enough - you need to update the chart’s data model when events arrive. Are you using the built-in chart widget or a custom implementation?