Node-RED——可视化流程编辑器
Node-RED 是什么
Node-RED 是 IBM 开源的可视化流程编辑器——用浏览器界面拖拽节点、连线就能构建数据处理和自动化流程。Home Assistant 原生自动化引擎的视觉编辑器虽然好用,但碰到需要"条件分支、错误重试、外部 API 调用、消息队列"这种复杂场景时,Node-RED 更合适。
Node-RED 和 Home Assistant 的关系:Node-RED 是 Home Assistant 的"外挂大脑"——Home Assistant 负责设备和状态,Node-RED 负责编排复杂逻辑。
Node-RED vs. Home Assistant 原生自动化
| 对比项 | Home Assistant 自动化 | Node-RED |
|---|---|---|
| 学习曲线 | 低(可视化编辑器) | 中(需要理解节点/消息流) |
| 自然语言 | 无 | 无(但可以写 JS 函数节点) |
| 复杂逻辑 | 用 YAML 的 choose/if/repeat | 拖拽分支节点、subflow、loop |
| 外部集成 | 通过 webhook/trigger 调用 | 内置 HTTP、MQTT、email、exec 等节点 |
| 错误处理 | 无内置重试 | Catch 节点、Status 节点 |
| 版本控制 | 写 YAML 可以 Git | 可以导出 JSON 流程 Git 管理 |
| 调试 | Traces(有限) | 内置 Debug 面板,每个节点都能看消息 |
| 实时运行 | 事件驱动 | 事件驱动 + 定时器 |
推荐:80% 的日常自动化用 Home Assistant 原生,20% 复杂逻辑用 Node-RED。
安装 Node-RED
Home Assistant OS
Settings → Apps → 搜索 Node-RED → Install
安装后启动 App,Home Assistant 会自动配置好 Home Assistant 节点。点击 Open Node-RED 打开编辑器(URL 默认 http://homeassistant.local:1880)。
Docker 容器(已有 Docker 的服务器)
docker run -d \
--name node-red \
-p 1880:1880 \
-v /opt/node-red:/data \
--restart=unless-stopped \
nodered/node-red:latest
然后在 Node-RED 里装 node-red-contrib-home-assistant-websocket 插件,连接到 Home Assistant。
Home Assistant 节点
Node-RED 的 Home Assistant 插件提供以下节点:
输入节点(触发)
| 节点 | 触发条件 |
|---|---|
| events: state | 实体状态变化 |
| events: device | 设备事件 |
| poll state | 定时轮询实体 |
| webhook | Home Assistant 的 webhook 触发 |
| server events | 监听 Home Assistant 的 event bus |
| calendar | 日历事件 |
| time | 定时触发 |
输出节点(动作)
| 节点 | 功能 |
|---|---|
| call service | 调用 Home Assistant 服务 |
| call api | REST API 调用 |
| get entities | 查询实体列表 |
| get history | 查询历史数据 |
第一个 Node-RED 流程示例
场景:日落自动开灯,1 小时后关灯,但如果有人在家就不关灯
[sun: 日落事件] → [Home Assistant: get state person.me] → [Function: 判断是否在家] → [IF: 不在家?] → [Home Assistant: call service light.turn_on] → [delay 1h] → [Home Assistant: call service light.turn_off]
对应的 Node-RED 操作:
- 拖入一个
sun节点,选 Sunset,Offset-10min - 拖入一个
events: state节点,监听person.me - 拖入一个
Function节点,写:
// 判断是否在家
if (msg.payload === "home") {
return null; // 不输出,中断流程
}
return msg; // 继续
- 拖入一个
call service节点,配light.turn_on→ 目标light.living_room - 拖入一个
delay节点,配 1 小时 - 拖入一个
call service节点,配light.turn_off→ 目标light.living_room
复杂场景用 Node-RED 更合适
场景一:多步骤条件链
"如果太阳能 > 家庭消耗 → 如果电池 < 80% → 充电到 95% → 如果 EV 没在充 → 如果 EV 电量 < 70% → 开始给 EV 充"
场景二:调用外部 API
"太阳能盈余 → 调用电价 API 查当前电价 → 如果谷价 → 给电池充电;如果峰价 → 卖回电网"
场景三:错误重试
"MQTT 设备上报故障 → 发送通知 → 10 秒后重试一次 → 还不行 → 升级告警"
场景四:定时批量
"每天凌晨 3 点 → 读所有温度传感器 → 算日平均 → 存到 InfluxDB → 发日报"
Subflow(子流程)—— 封装复用
Node-RED 的 Subflow 可以把一段常用逻辑打包成一个节点,之后在其他流程里复用:
- 选中要打包的节点 → 右键 → Subflow → Create Subflow
- 给子流程起名字,定义输入输出
- 之后就可以像用内置节点一样拖入子流程
备份与版本控制
- Node-RED 的流程以 JSON 格式存储(在 Home Assistant OS 的 Node-RED App 数据目录里)
- 可以导出流程 JSON(菜单 → Export → Copy to clipboard)
- 把导出的 JSON 存到 Git 仓库做版本控制
- Home Assistant OS 的备份快照自动包含 Node-RED 数据
Node-RED 插件生态
Node-RED 的真正威力来自社区插件:
| 插件 | 功能 |
|---|---|
node-red-contrib-home-assistant-websocket | 官方 Home Assistant 集成 |
node-red-contrib-influxdb | InfluxDB 时序数据库读写 |
node-red-contrib-schedule | 高级定时调度(比内置 time 节点灵活) |
node-red-node-email | 发邮件通知 |
node-red-contrib-telegrambot | Telegram Bot |
node-red-contrib-openai | 调用 OpenAI API |
管理方式:Node-RED → 右上角菜单 → Manage Palette → Install
小建议
- Node-RED 上手有门槛,但一旦掌握就会"真香"——很多以前想做但 Home Assistant 原生做不了的事突然变得很容易
- 原生自动化和 Node-RED 混用是常态——不要试图用一个替代另一个
- 初期少装插件,每装一个都理解清楚用途再留着——Node-RED 最大的陷阱是装了一堆用不到的东西导致混乱