Node-RED折线图显示异常:MQTT温度数据可视化问题求助
Node-RED MQTT折线图异常问题解决
问题原因
- 消息格式不标准:你的Python发布代码直接用
str(message)把字典转成字符串,生成的是单引号格式的非标准JSON,Node-RED无法正确解析出温度字段。 - 未提取有效数据:当前的函数节点仅设置了
msg.topic,没有从MQTT消息中提取temperature值,折线图节点找不到有效数值时,会默认把当前毫秒时间戳作为Y轴数据,导致显示超大值。
解决步骤
第一步:修复Python发布的消息格式
将发布内容改为标准JSON格式,确保Node-RED能正常解析:
- 导入
json模块 - 用
json.dumps()替代str()生成消息内容
修改后的发布代码关键部分:
import json # 新增导入 # ...其他原有代码 try: while True: temperature = random.randint(0, 60) hvac_status = random.choice(["On", "Off"]) message = { "id": device_id, "temperature": temperature, "status": hvac_status } print('Publishing:', message) client.publish('Test/Temperature', json.dumps(message)) # 替换为json.dumps生成标准JSON time.sleep(8)
第二步:Node-RED中解析并提取温度数据
在MQTT订阅节点和折线图节点之间添加处理节点:
- 添加JSON节点:将MQTT收到的字符串payload解析为JSON对象
- 添加函数节点:提取
temperature字段作为新的payload
函数节点代码:
msg.payload = msg.payload.temperature; return msg;
(如果不想单独用JSON节点,也可以在一个函数节点里完成解析+提取:)
try { const data = JSON.parse(msg.payload); msg.payload = data.temperature; } catch (err) { node.error("解析MQTT消息失败", msg); return null; } return msg;
第三步:配置折线图节点的坐标轴
双击折线图节点进入配置面板:
- Y轴设置:勾选「手动配置范围」,设置最小值为
0,最大值为60,匹配温度区间 - X轴设置:选择「相对时间」,在「格式」中选择需要的显示方式,比如「秒」「分钟:秒」,也可以自定义格式(如
mm:ss表示分秒)
最终节点流顺序
MQTT订阅节点 → JSON节点 → 函数节点 → 折线图节点
内容的提问来源于stack exchange,提问作者Στέλιος Αθανασόπουλος
相关产品推荐
相关产品推荐

