了解如何使用Node-RED函数
作者:社区 / 开发者
2023年6月15日
导航至
在工业物联网(IIoT)、自动化和集成领域,常常会遇到复杂的问题。有时会遇到不符合现有模型的数据或需要定制化的流程,超出了现有功能的范畴。
幸运的是,当使用Node-RED时,您可以使用Node-RED函数节点来编写自定义JavaScript代码。函数节点使您能够处理复杂的数据转换、执行个性化的逻辑,并在您的流程中无缝集成不同的组件。
本文将定义Node-RED函数,并提供如何在流程中使用它们的示例。此外,您将了解可以使用Node-RED函数的多种方法。
什么是Node-RED?
Node-RED是一个开源的、基于流的、可视编程工具,用于连接硬件设备、API和在线服务。它提供了一个基于浏览器的界面,允许您使用节点创建流程。然后,您将使用可视链接连接表示各种任务或组件的节点。
我们在物联网和智能家居领域主要使用Node-RED。它通过提供拖放界面来创建自动化逻辑、数据处理管道以及不同系统之间的通信,简化了不同设备和服务的集成。
什么是Node-RED中的函数?
在Node-RED中,一个函数是一个节点,允许你编写自定义JavaScript代码以处理和操作流程中的消息数据。当你需要的特定功能没有内置节点提供,或者当你想执行自定义数据转换或逻辑时,可以使用函数节点。
节点以JavaScript对象的形式传递消息数据(msg),你可以通过属性msg.payload访问消息体。函数节点应返回一个消息或多个消息对象。然而,如果你想要停止流程,函数可以不返回任何内容。
如何创建Node-RED函数?
在创建Node-RED函数之前,请确保您已经安装并启动了Node-RED实例,并在您的网络浏览器中运行。您可以通过此处连接到您的本地实例。
在编辑器的左侧,您将找到按不同类别分组的一组节点。
在函数类别下,您将看到一个函数节点,您需要点击并拖动它到画布流程中。这就是您自定义流程的地方。
要自定义函数,请双击函数节点以打开配置窗口。
您可以在名称字段下调整您函数的名称。名称是显示在工作区上的描述性标签。根据节点的动作标签节点是一个好习惯。
名称字段下方有不同选项卡,您将使用它们根据上下文配置和编写JavaScript逻辑。
如果您想在节点启动时运行任何逻辑,请使用启动选项卡来编写相关的JavaScript代码。该代码只运行一次。在停止或重新部署节点时,您将在停止选项卡中编写代码。
现在,消息选项卡是您逻辑的主要存放地。
简单函数示例
为了看到函数节点的作用,我们将创建一个流程,该流程注入华氏温度值,然后使用函数将其转换为摄氏度。
将三个节点拖到工作区。从注入节点开始。双击节点以配置其属性,给它一个描述性名称,并将msg.payload更改为数字并赋予其值。
接下来,添加一个函数节点。双击节点以打开编辑器。给函数节点一个描述性名称,并添加以下逻辑来转换注入的温度值。这是一个同步函数的示例,因为代码行将按顺序执行。
// Get the input temperature in Fahrenheit from msg.payload
var fahrenheit = msg.payload;
// Convert Fahrenheit to Celsius
var celsius = (fahrenheit - 32) * (5 / 9);
// Store the result in msg.payload
msg.payload = celsius;
// Return the modified message
return msg;
最后,添加一个调试节点以在调试侧边栏上显示消息负载。您还可以配置它以在Node-RED实例的终端中输出消息负载。
以下是注入华氏79度温度时的流程输出。
在Node-RED中使用异步函数
异步任务是那些不立即完成但稍后返回结果的操作。一些示例包括发起API调用、读取文件或与数据库交互。
在函数需要在执行之前进行此类异步任务的情况下,不要返回消息对象。相反,函数必须使用node.send()方法来传输预期的消息(s)。此方法接受与函数返回的参数相似的参数集。
函数节点会主动克隆您传递给node.send的每个消息对象,防止对可能被函数内部重复使用的消息对象的意外更改。
请注意,当函数节点执行涉及消息的异步工作时,运行时不会天生就能判断消息处理何时结束。因此,函数节点应主动调用node.done()。调用node.done可以让您的运行时准确追踪消息在系统中的传输。
在使用函数中的异步回调代码时,在每个流重新部署时解决任何挂起的请求或关闭活动连接是良好的实践。您可以在“停止”选项卡中编写清理逻辑,该逻辑将在节点关闭时运行。
或者,您可以在函数中包含一个类似这样的关闭事件处理器
node.on('close', function() {
// Implement any necessary tidy-up for asynchronous code here, such as shutting down connections.
});
如何在Node-RED中使用函数?
Node-RED的函数非常灵活,您可以在基于流的自动化和集成项目中使用它来完成各种任务。Node-RED函数的一些常见用例包括
-
数据转换——这可能包括转换时间戳、提取特定字段或重新格式化数据以与其他系统兼容。
-
数据过滤和验证——您可以使用函数过滤掉不相关的数据。您还可以在允许数据通过流程之前,对传入的数据进行特定标准验证。
-
条件逻辑——如果您需要根据传入数据做出决策,函数可以实现条件逻辑。例如,您可能根据某些条件对不同数据路由或根据某些值触发特定操作。
-
数学和统计操作——函数可以在数据上执行数学计算或统计操作。这对于汇总数据、计算平均值、确定最大或最小值等任务很有用。
-
文本处理——函数可以操纵文本数据。您可以搜索模式、替换文本、截断字符串、将单词大写,并执行其他与文本相关的任务。
-
日期和时间处理——如果您的流程处理时间戳或与日期相关的数据,函数可以帮助您根据需要操纵和格式化日期和时间。
-
错误处理——您可以在函数中实现错误处理机制。例如,如果流程的一部分发生错误,您可能希望修改错误消息或格式然后再将其传递给下一个节点。
-
动态内容——您可以在函数中生成动态内容,例如构建动态URL、生成个性化消息或构建动态查询。
-
自定义逻辑——有时您的流程可能需要非常具体的逻辑,而现有的节点无法实现。函数允许您实现此自定义逻辑。
-
多步骤处理——在某些情况下,您可能需要对传入数据执行一系列步骤。函数可以在单个节点内简化多步骤处理,降低流程的复杂性。
为什么使用函数?
无论您是监控物联网设备、跟踪传感器读取还是分析性能指标,Node-RED函数都可以帮助您超越预构建解决方案的界限。函数节点允许您将自定义逻辑、数据掌控和创造力注入您的流程中。
随着您拥抱Node-RED函数的变革力量,请考虑使用InfluxDB将您数据持久性提升到下一个层次。使用InfluxDB,您不仅存储时间序列数据,而且打开了深入了解时间趋势和模式的门。
其他资源
- Node Red仪表板教程
- Home Assistant webhook教程
- 开始使用Home Assistant和Docker
- Home Assistant集成指南
- Home Assistant和Grafana教程
本文由Mercy Kibet撰写。Mercy是一位全栈开发者,擅长学习和撰写有关新颖和有趣的科技堆栈的文章。