背景
家里有个 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 日志定位、容器名大小写、认证配置位置上。链路打通之后,数据流动的感知会非常直观——温度变了,电子钟上的数字跟着变,没有延迟。