文章目录
- Node-RED 值得一试
- 资源推荐
- 第一节 Node-RED 简介
- 一、是什么?
- 二、核心特点
- 三、核心概念
- 四、示例:定时获取网络API数据并通知
- Inject节点配置:
- HTTP Request节点配置:
- Function节点配置(数据处理):
- 五、主要应用场景
- 六、优势和劣势
- 总结
- 第二节 安装 Node-RED
- 第三节 常用控件介绍
Node-RED 值得一试
第一篇:假如生命只有一百天——Node-RED 入门指南
第二篇:假如生命只有一百天——树莓派的操作与使用
第三篇:假如生命只有一百天——UPS电源篇
资源推荐
Node-RED官网
官方文档:https://nodered.org/docs/
节点库:https://flows.nodered.org/
社区论坛:https://discourse.nodered.org/
通过上述步骤,可快速掌握 Node-RED 的核心功能并实现简单自动化流程。
第一节 Node-RED 简介
一、是什么?
Node-RED是一个基于流程的、可视化的编程工具,最初由 IBM 的 Emerging Technology Services 团队开发,现在是一个由 JS Foundation 托管的开源项目。
它的核心设计理念是:通过连接不同的“节点”来构建应用程序,从而降低编程的门槛,特别是对于物联网(IoT)应用的集成和开发。
您可以把它想象成一个用于连接硬件设备、API 和在线服务的“胶水”或“桥梁”。
二、核心特点
可视化编程:
- 编程不再是写代码,而是在浏览器中通过“拖、放、连”的方式组装节点。
- 节点代表特定的功能(如输入、输出、处理逻辑),节点之间的连线代表数据流。
基于流(Flow):
- 应用程序被构建为“流”。一个流是一系列相互连接的节点,数据从一个节点传递到下一个节点,并在过程中被处理。
建立在 Node.js 之上:
- Node-RED 本身是一个 Node.js 应用程序,这意味着它轻量、高效,并且可以运行在从树莓派等资源受限的设备到云端服务器的各种平台上。
丰富的节点库:
- 核心库提供了大量常用节点,如 HTTP、MQTT、TCP、文件操作、功能节点等。
- 拥有一个庞大且活跃的社区,贡献了数千个第三方节点,可以轻松连接到各种数据库(如 MySQL、MongoDB)、云服务(如 AWS、Azure)、社交平台(如 Twitter、Telegram)和硬件(如 Arduino、Raspberry Pi GPIO)。
内置编辑器:
- 开箱即用,提供了一个基于 Web 的图形化编辑器。您只需在浏览器中访问相应的地址和端口(通常是
http://localhost:1880)即可开始编程。
- 开箱即用,提供了一个基于 Web 的图形化编辑器。您只需在浏览器中访问相应的地址和端口(通常是
三、核心概念
要理解 Node-RED,需要掌握以下几个基本概念:
- 节点:构成流程的基本单元。每个节点都有特定的功能。
- 输入节点:用于接收数据,如
inject(注入)、http in(HTTP 请求)、mqtt in(MQTT 订阅)。 - 处理节点:用于处理数据,如
function(编写 JavaScript 代码)、change(修改变量)、switch(路由判断)。 - 输出节点:用于发送数据,如
debug(调试输出)、http response(HTTP 响应)、mqtt out(MQTT 发布)。
- 输入节点:用于接收数据,如
- 流:由节点和连线组成的完整应用程序。
- 消息:在节点之间传递的数据单元。它是一个 JavaScript 对象,最常用的属性是
msg.payload,用于承载主要数据。其他常见属性包括msg.topic(主题)等。 - 连线:连接节点,定义数据的流动方向。
- 调色板:编辑器中所有可用节点的列表。
- 工作区:您拖放节点和创建流的地方。
- 调试侧边栏:用于查看
debug节点输出的信息,是开发和排错的重要工具。
四、示例:定时获取网络API数据并通知
创建一个Node-RED流程来定时获取天气数据并发送通知。
- 添加必要的节点
您需要以下节点:
- Inject节点- 用于定时触发
- HTTP Request节点- 用于调用API
- Function节点- 用于处理数据
- Debug节点- 用于查看结果(或Notification节点用于发送通知)
- 节点配置
Inject节点配置:
- Name: “定时触发器”
- Repeat: 间隔时间(例如:每1小时)
- Payload类型: timestamp
HTTP Request节点配置:
- Name: “获取天气数据”
- Method: GET
- URL:
http://api.openweathermap.org/data/2.5/weather?q=Anhui,CN&appid=108e304a55942ac32751b79764d0e4c&units=metric&lang=zh_cn - Return: 解析后的JSON对象
Function节点配置(数据处理):
// 处理天气数据if(msg.statusCode===200){vardata=msg.payload;// 构建通知消息msg.payload={title:`安徽天气报告 -${newDate().toLocaleString()}`,message:`城市:${data.name}天气:${data.weather[0].description}温度:${data.main.temp}°C 体感温度:${data.main.feels_like}°C 最高温度:${data.main.temp_max}°C 最低温度:${data.main.temp_min}°C 湿度:${data.main.humidity}% 气压:${data.main.pressure}hPa 风速:${data.wind.speed}m/s 能见度:${data.visibility/1000}km`};// 保留原始数据用于调试msg.weatherData=data;returnmsg;}else{msg.payload=`获取天气数据失败:${msg.statusCode}`;returnmsg;}- 一步到位——导入完整流程JSON
[{"id":"inject-node","type":"inject","name":"定时触发器","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"3600","crontab":"","once":true,"onceDelay":"1","topic":"","payload":"","payloadType":"date","x":100,"y":100,"wires":[["http-request-node"]]},{"id":"http-request-node","type":"http request","name":"获取天气数据","method":"GET","ret":"obj","paytoqs":"ignore","url":"http://api.openweathermap.org/data/2.5/weather?q=Anhui,CN&appid=108e304a55942ac32751b79764d0e4c&units=metric&lang=zh_cn","tls":"","persist":false,"proxy":"","authType":"","x":280,"y":100,"wires":[["function-node"]]},{"id":"function-node","type":"function","name":"处理天气数据","func":"// 处理天气数据\nif (msg.statusCode === 200) {\n var data = msg.payload;\n \n // 构建通知消息\n msg.payload = {\n title: `安徽天气报告 - ${new Date().toLocaleString()}`,\n message: `城市: ${data.name}\\n天气: ${data.weather[0].description}\\n温度: ${data.main.temp}°C\\n体感温度: ${data.main.feels_like}°C\\n最高温度: ${data.main.temp_max}°C\\n最低温度: ${data.main.temp_min}°C\\n湿度: ${data.main.humidity}%\\n气压: ${data.main.pressure} hPa\\n风速: ${data.wind.speed} m/s\\n能见度: ${data.visibility/1000} km`\n };\n \n // 保留原始数据用于调试\n msg.weatherData = data;\n \n return msg;\n} else {\n msg.payload = `获取天气数据失败: ${msg.statusCode}`;\n return msg;\n}","outputs":1,"timeout":"","x":480,"y":100,"wires":[["debug-node","notification-node"]]},{"id":"debug-node","type":"debug","name":"显示结果","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":680,"y":100,"wires":[]},{"id":"notification-node","type":"debug","name":"发送通知","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":680,"y":160,"wires":[]}]部署和使用
将上述JSON导入Node-RED
部署流程
点击Inject节点的手动触发按钮测试
在调试面板查看结果
扩展功能
如果您想要实际的通知功能,可以:
- 添加Email节点发送邮件通知
- 添加Telegram节点发送到Telegram
- 添加Pushover节点发送手机推送
- 添加File节点保存历史数据
邮件通知
注意事项:
- API调用频率请遵守OpenWeatherMap的使用限制
- 建议添加错误处理节点
- 可以添加多个城市监控
- 可以添加数据存储功能记录历史天气
五、主要应用场景
- 物联网:连接传感器、执行器,处理设备数据,是实现 IoT 原型开发和应用的利器。
- API 集成:快速连接不同的 Web 服务,实现数据聚合和自动化。
- 家庭自动化:与 Home Assistant 等平台结合,创建复杂的自动化场景。
- 机器人流程自动化:自动化一些简单的、重复性的电脑操作任务。
- 快速原型开发:在想法验证阶段,用极快的速度搭建出可工作的原型。
- 数据处理和转换:作为数据流的 ETL 工具。
六、优势和劣势
优势:
- 极低的入门门槛:非程序员也能快速上手,实现自动化功能。
- 开发速度快:可视化连接比编写集成代码要快得多。
- 强大的社区和生态:海量的第三方节点几乎覆盖了所有你能想到的服务。
- 灵活性和可扩展性:可以通过
function节点编写自定义 JavaScript 代码,实现复杂逻辑。
劣势:
- 复杂逻辑管理:当流程变得非常庞大和复杂时,可视化界面可能变得难以维护和理解。
- 调试挑战:对于深层嵌套的逻辑流,调试可能比传统代码更困难。
- 版本控制:流程以 JSON 格式存储,虽然可以进行 Git 版本控制,但对比差异不如代码直观。
总结
Node-RED 是一个强大、灵活且易于使用的工具,它通过将编程抽象为连接节点的可视化操作,极大地简化了物联网集成和应用程序自动化的过程。无论您是希望自动化家庭环境的爱好者,还是需要快速集成企业级系统的开发者,Node-RED 都值得一试。
第二节 安装 Node-RED
第三节 常用控件介绍
3.1 inject 介绍
Node-red 控件很多,我们可以根据自己的需要来选择。每个控件官方都带
有详细的说明,接下来介绍一个典型的输入控件——inject。
3.1.1 inject 的说明信息
前边helloworld 的例子中,我们已经认识了输入节点,接下来详细介绍
它。
Node-red 内部自带了对控件的介绍。鼠标悬停在某个控件上,就会出现一
些提示信息,例如:
点击节点时,页面右侧也会出现提示信息
3.2 debug 控件介绍
3.1.1 debug 的说明信息
计算机诞生没多久的时候,有一位程序媛在调试程序时出现故障,拆开继
电器后,发现有只飞蛾被夹扁在触点中间,从而“卡”住了机器的运行。于
是,她诙谐的把程序故障统称为“臭虫(BUG)”,把排除程序故障叫DEBUG,
而这奇怪的“称呼”,后来成为计算机领域的专业行话。从而debug意为排除
程序故障的意思。
Debug 控件最主要的作用,是打印出一些信息,方便程序调试。前边已经多
次使用了debug控件了,相信大家对他已经不陌生了。接下来进行更加详细的
介绍。
3.3 file 控件介绍
File 节点分为两种,功能分别是file in与file out
3.3.1 file 的说明信息
读取文件的内容,输出为字符串或二进制缓冲区。
输入
字符串形式的文件名
如果不在节点配置中设置,则该属性设置为需要读取的文件名。
输出
字符串或数组的输出
文件的内容是一个字符串或二进制缓冲区
文件名
建议配置文件名的选项,可以设置为路径\文件名
错误对象
弃用:如果在节点中启用,当节点遇到读取文件的错误时,它将发送一
条没有有效负载的消息,并且这个错误属性设置为错误细节。这种行为模式
被弃用,默认情况下新的节点也不会启用这种模式。
详细信息
文件名应该是绝对路径,否则应当是node-red进程工作目录的相对路
径。
在Windows上,路径分隔符可能需要转义,例如:\Users\myUser.
可选地,一个文本文件可以被分割成几行,每一行输出一条消息,或者
将二进制文件分割成更小的缓冲块——块大小是依赖于操作系统的,但通常
是64 k(linux/mac)或41 k(Windows)。
当分割成多个消息时,每条消息都有一个“部分的”属性需要设置,这
个“部分”应当形成一个完整的消息序列。
应该使用Catch节点捕获和处理错误。
File out 控件
写消息的载荷到一个文件,或者把内容添加到文件末端,或者替换现有
的内容。或者,删除该文件。
输入
字符串形式的文件名
建议配置文件名的选项,可以设置为路径\文件名
详细信息
每条消息有效负载都将被添加到文件的末尾,可以选择在每条消息之间
附加一个换行符(\n)字符.
如果msg.filename被使用,每次写入后,文件都将被关闭。为了获得最
佳性能,使用一个固定的文件名。
它可以被配置为覆盖整个文件而不是追加。例如,当把二进制数据写入
文件时,比如图像,应该使用这个选项,并且应该禁用追加换行的选项。
或者,可以配置这个节点来删除文件。
3.4 switch 控件介绍
Switch 本意是开关、转换,用在node-red里有点像一个岔路口,node-red
里边有数据流,数据流可能有不同的分支,在“岔路口”管理数据流向的,就
可以是switch控件。控件根据数据的一些属性来判断它的流向。就比如你到了
公共卫生间,你是男生,就去左边的男卫生间;女生去右边的女卫生间。
Switch 控件可以根据数据的topic或是payload,或者其它属性来判断数据该
发给哪一个出口。
Switch 控件属于“function”类型的控件,function一般翻译为功能或者
函数。说到函数可能就会让人想到数学上那些抽象的公式,让人望而却步了。
好在编程中用到的函数跟数学上的不太一样,一般是有一定功能的程序。对,
就是写程序。但是不要怕,程序里的逻辑一般都是很简单的,简单到可以用朴
素的语言描述。比如你在回家的路上,你妈妈告诉你:“要是看到卖包子的,
买6个包子。没有卖包子的话,买4个馒头”。在程序里,可能这么表示这个
逻辑关系