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
- Check the MQTT broker node shows connected under its status.
- Compare the topic with the one the robot publishes. Case and slashes must match.
- Add a debug node to see the raw messages.
- Use a JSON node or a change node to turn text into numbers or an object.
- For a chart, send numbers, not strings.
- 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 see | Do this |
|---|---|
| Debug shows messages, chart empty | Payload type. |
| Debug shows nothing | Broker or topic. |
Related
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.5Common 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.