NodeRed + HA + MQTT 一条链路看温度:从传感器到电子钟显示

2026-08-26

背景

家里有个 ESP-D1 电子钟,一直只显示时间。最近买了米家蓝牙温湿度计,数据已经进了 Home Assistant,想让它显示温度,把一条传感器数据链路真正跑通。

一个典型的场景:传感器 → HA 采集 → NodeRed 编排 → MQTT 转发 → 电子钟显示。听起来流水线不长,但中间每个环节都有坑。

完整链路

先看整条链路的走向:

传感器(米家蓝牙温湿度计)
  → Home Assistant(Xiaomi Miot Auto 集成)
  → NodeRed(监听 HA 实体变化)
  → NodeRed function 节点(格式化温度值)
  → MQTT out 节点(发布到 topic)
  → Mosquitto Broker
  → ESP-D1 电子钟(订阅 topic 显示)

六个环节,数据从传感器到显示,经历了采集、事件监听、数据格式化、消息发布、消息中转、终端显示六个步骤。

分步配置

1. Home Assistant 接入传感器

HA 通过 Xiaomi Miot Auto 集成自动发现局域网内的米家蓝牙温湿度计。这一步最简单——HA 会自动创建设备实体,实体 ID 类似 sensor.miaomiaoc_cn_blt_xxx_temperature。

2. NodeRed 监听 HA 实体变化

NodeRed 安装 node-red-contrib-home-assistant-websocket 节点包后,使用 server-state-changed 节点监听实体变化。

关键配置:

  • 监听实体: 填入 HA 中的温度传感器实体 ID,用 exact 匹配方式
  • 触发条件: 只响应状态变化(output_only_on_state_change: true),避免重复推送
  • 初始化发送: 开启 output_initially: true,NodeRed 启动或部署时主动发送一次当前值,不用等下一次温度变化

3. NodeRed function 节点格式化数据

传感器的原始数据是字符串(如 “27.6”),电子钟需要 JSON 格式。用 function 节点做个转换:

var rate = 0;
rate = msg.payload;
var new_msg = {payload: util.format('{"lr_temp":%d}', rate)};
return new_msg;

这里是取整处理(%d),27.6°C → 27。如果要做精确到小数点后一位,用 %.1f 替代 %d。

4. MQTT 发布

MQTT out 节点配置:

  • Topic: esp-d1/display_json
  • QoS: 1(确保至少一次送达)
  • Retain: 不设置(不需要保留旧消息)

5. ESP-D1 电子钟接收

电子钟订阅 esp-d1/display_json topic,接收 JSON 格式数据后解析并显示在屏幕上。这一步在 ESPHome 固件中实现,格式匹配即可。

踩坑记录

踩坑 1:MQTT 日志不在 docker logs 里

Mosquitto 配置了 log_dest file,日志直接写入文件而非 stdout。跑 docker logs mosquitto 什么都看不到,容易误判为容器没在运行。

解决:需要知道日志文件的实际路径,直接读文件。排查时先确认 mosquitto 的日志配置是 file 还是 stdout。

踩坑 2:容器名大小写敏感

Docker 对容器名区分大小写。如果容器名是 NodeRed(大小写混合),用 docker logs nodered 会报错。一定要用 docker ps 确认容器名精确拼写。

踩坑 3:MQTT 认证配置位置

HA 的 MQTT 凭据存储在 .storage/core.config_entries 中,而不是 configuration.yaml。修改 mosquitto 密码文件后,需要重启 mosquitto 容器才能生效。如果只是重启 HA 而没重启 broker,认证不会更新。

踩坑 4:温度取整精度

function 节点中 %d 把浮点数直接截断取整。27.6°C 变成 27,会丢失 0.6°C 的精度。如果觉得不够精确,改为 %.1f 保留一位小数。

扩展思路

这套链路打通后,可以做的事情不少:

  • 客厅的另一个温湿度计同样接入,只需在 NodeRed 加一个监听节点,监听不同实体 ID
  • 显示更多信息:湿度、室内外温差、历史最高/最低温
  • 设置阈值告警:温度过高或过低时,通过小爱音箱播报或推送到手机通知

总结

从传感器到电子钟显示,一条完整的数据链路涉及几个中间件:HA 做数据采集、NodeRed 做事件编排、MQTT 做消息中转。每个环节的配置都不复杂,但踩坑点集中在 MQTT 日志定位、容器名大小写、认证配置位置上。链路打通之后,数据流动的感知会非常直观——温度变了,电子钟上的数字跟着变,没有延迟。