Node-RED dashboard shows no data from MQTT: topic, broker node and message format

Add a debug node after the MQTT input. If nothing shows there, the problem is the broker or the topic.

What the message means

The dashboard only draws what reaches it. A topic with a different case, a disconnected broker node or a payload that is text instead of a number leaves charts blank.

Fix it in this order

  1. Check the MQTT broker node shows connected under its status.
  2. Compare the topic with the one the robot publishes. Case and slashes must match.
  3. Add a debug node to see the raw messages.
  4. Use a JSON node or a change node to turn text into numbers or an object.
  5. For a chart, send numbers, not strings.
  6. Redeploy the flow after changes.

Why it happens

The dashboard draws only what reaches it, in the form it arrives. Depending on your Node-RED version, the MQTT-in node’s output setting can deliver the payload as a string or buffer, or parse JSON into an object; older versions needed a fixed mode to parse JSON.

A chart expects a number, so a string such as “23.5” or a whole object may not plot even though the debug node shows the message. Use a change or function node to pick out the field and convert it with Number() or parseFloat(). MQTT topics are case sensitive, so a topic that differs only by case receives nothing.

If you see this, do this

You seeDo this
Debug shows messages, chart emptyPayload type.
Debug shows nothingBroker or topic.

broker refuses clients, MQTT on the ESP32.

Last reviewed: November 2026. These are the usual causes and the order that finds them fastest. Test on your own board; clones and cables differ.

Why this happens

Node-RED passes messages between nodes, and the dashboard chart or gauge reads the payload property of a message. For a chart that payload must be a number. An MQTT input may deliver it as a string, as a buffer or as a parsed object, depending on its output setting and your Node-RED version. A value that looks like 23.5 in the debug sidebar can still be a string, and the chart then ignores it or shows nothing.

Messages only arrive at all if the broker connection is up and the topic matches. MQTT topics are case sensitive and a leading slash is part of the name, so robot/temp and /robot/temp are different topics.

How to confirm the cause

  • Look at the MQTT broker config node. The status under the input node should say connected. If it says connecting, check the host, the port and any login.
  • Subscribe to the topic with another client, such as mosquitto_sub with a wildcard, to see exactly what the robot publishes.
  • Attach a debug node to the MQTT input and set it to show the complete message. Check the topic and the type of the payload.
  • If messages show in debug but the chart is empty, check the payload type. A string needs conversion to a number.
  • Check that the dashboard node is assigned to a group and tab, and that you deployed the flow after the change.

Worked example

A function node placed between the MQTT input and the chart. It converts the text to a number, drops anything that is not numeric, and can also pick a field if the robot sends JSON. To test from a laptop, publish a value to the same topic.

// function node
let v = parseFloat(msg.payload);
if (isNaN(v)) return null;      // ignore bad values
msg.payload = v;
return msg;

// if the robot sends {"temperature": 23.5}:
// msg.payload = msg.payload.temperature;

// test publish from a terminal
// mosquitto_pub -h BROKER -t robot/temp -m 23.5

Common mistakes

  • Using a different topic case or an extra slash.
  • Pointing the broker node at the wrong port or host.
  • Sending text with units, such as 23.5 C, that cannot be turned into a number.
  • Forgetting to deploy.
  • Leaving the node set to a mode that does not parse JSON.

If this did not fix it

  • Broker login or access rules that allow connection but block the subscription.
  • A different dashboard tab from the one you are viewing.
  • The robot publishing too rarely, so the chart looks empty for a long time.