Node-RED 是一款面向事件驱动应用的基于流程的编程工具,可通过可视化连线节点来创建自动化工作流。本技能为使用 Node-RED 提供专业指导,适用于处理 Node-RED 流程(JSON)、创建自定义节点、配置 settings.js、调试等场景。
一、核心概念 消息在节点之间通过 msg 对象流动,包含 payload(主要数据)、topic(消息类型或类别)和 _msgid(自动生成的 ID)。
节点类型分为:输入类(Inject、HTTP In、MQTT In)用于启动流程;处理类(Function、Change、Switch)用于转换数据;输出类(Debug、HTTP Response、MQTT Out)用于发送结果;工具类(Delay、Trigger、Split/Join)用于控制流程。
二、流程 JSON 结构 流程存储在 flows.json 中。每个节点的关键属性包括:id(唯一 UUID)、type(节点类型名称)、x 与 y(编辑器中的位置)、wires(由数组构成的数组,将输出映射到下一节点的输入)。文档给出了 inject 节点与 debug 节点相连的 JSON 示例,其中 inject 节点配置了 repeat 为 5、payload 为 hello、payloadType 为 str。
三、Function 节点 可执行 JavaScript 并访问完整上下文。示例包括:通过 const data = msg.payload 访问消息;修改消息(如 msg.payload = data.toUpperCase()、msg.timestamp = Date.now());使用 return msg 发送到输出;使用 return [msg1, msg2] 发送到多个输出;使用 return null 不发送内容。异步操作可使用 async/await,也可通过 node.send() 处理异步并在最后返回 null。
四、上下文存储 context 为节点上下文(仅当前节点),flow 为流程上下文(流程内所有节点),global 为全局上下文(所有流程)。分别通过 set 与 get 方法读写。
五、常用节点 Change 节点无需代码即可修改消息属性,支持 Set(设置值)、Change(替换文本)、Move(重命名属性)、Delete(删除属性)。Switch 节点按条件路由消息,支持 ==、!=、<、>、<=、>=、contains、matches regex、is null、is not null 以及类型判断。Template 节点使用 Mustache 模板,例如 Hello {{payload.name}}! 与 Temperature: {{payload.temp}}°C。
六、集成 MQTT:MQTT In 订阅主题(如 home/sensors/#),可设置 QoS 0/1/2,输出解析后的 JSON 或字符串;MQTT Out 发布主题(如 home/commands/light),可设置 Retain 与 QoS。 HTTP:通过 HTTP In → HTTP Response 创建端点,方法支持 GET/POST/PUT/DELETE,URL 如 /api/data;HTTP Request 节点可发起请求并返回解析后的 JSON。 WebSocket:WebSocket In 监听消息,WebSocket Out 向客户端发送消息,实现实时双向通信。
七、调试 Debug 节点可输出到侧边栏面板,显示完整 msg 或特定属性,也可添加到状态栏。在 Function 节点中可用 node.warn 输出警告(黄色并显示在调试中)、node.error 输出错误(红色并触发 catch)以及 console.log 输出到终端。状态指示器使用 node.status 设置 fill(green、yellow、red、grey)、shape(dot、ring)与 text,传入空对象可清除状态。
八、错误处理 Catch 节点可捕获同一流程中节点产生的错误。Function 节点内可用 try/catch,在捕获时通过 node.error 报告错误并返回 null。
九、配置 settings.js 文件位置为 ~/.node-red/settings.js。可配置服务器(uiPort、httpAdminRoot、httpNodeRoot)、流程(flowFile、credentialSecret)、安全(adminAuth 含用户名、bcrypt 密码哈希、权限)、日志(logging.console.level)、上下文存储(默认 memory、持久化 localfilesystem)以及 Function 节点全局上下文(functionGlobalContext 引入 moment、lodash 等)。
十、Home Assistant 集成 使用 node-red-contrib-home-assistant-websocket。Call Service 节点可指定 Domain、Service、Entity 与 Data(如 {"brightness": 255});Entity 节点监控状态变化;Get Entities 节点查询当前状态并输出实体数组。
参考内容涵盖自定义节点、流程模式与 Home Assistant 集成的更多细节。