Skip to main content

6 posts tagged with "nodered"

View All Tags

· 6 min read

Node-RED是一款流式编程工具,广泛应用于自动化和物联网(IoT)领域。Filter节点作为其核心功能之一,能够帮助我们对流中的数据进行筛选和过滤,从而实现精确的数据处理和控制。本文将详细介绍Node-RED Filter节点的使用方法和实际应用场景。

什么是Filter节点?

Filter节点是Node-RED中的关键节点之一,用于根据指定的条件过滤流中的消息。Filter节点的主要功能是只在输入值与前一个值不同时传递数据,从而有效地减少重复和冗余的消息传递。它还支持死区和窄带模式,允许进一步控制何时传递数据以及如何处理变化量。本文将详细介绍Node-RED Filter节点的使用方法和实际应用场景。

如何配置 Filter 节点?

在Node-RED编辑器中,从左侧的节点列表中拖动一个Filter节点到流中。双击Filter节点打开配置面板,Filter节点支持一下几种模式:

  • 阻塞到值变化(变化检测)
  • 除非值变化大于(死区)
  • 如果值变化大于则阻塞 (滤波)

1. 变化检测

变化检测可以对值进行检测,当消息流持续输入时节点会检测所输入的值相对于前一个值是否发生了变化,如果发生了变化则进行输出。主要用于将重复的输入进行过滤,避免频繁的触发后续流程的执行。

2. 死区

死区则主要围绕所检测的值可以划定一个±x的区间,只有当数值的变化超出这个区间后才会进行输出,从而触发后续的流程。主要用于对微小波动的过滤。

对于所比对的检测值有两种模式:

  1. 与最后一个有效输出值相比
  2. 与上一个输入值相比

3. 窄带

窄带同样是围绕所检测的值划定一个±x的区间,只有当数值的变化在这个区间内时才会进行输出,从而触发后续的流程。主要用于对异常噪声的过滤。

另外,以上每种方式都可以在同一个节点内处理多组数据的检测,使用传入消息的Topic属性进行分组。当输入的消息中包含reset属性且为true时可以对Filter节点的检测进行重置。

实际案例

下面主要分享关于死区和窄带这两者的应用案例

案例一: 锅炉温度检测

假设我们需要将锅炉的温度进行上报至其它系统,但是温度传感器所传回的值可能会在某一个小范围内支持的变化,如果将这些细微的变化都进行上传会产生大量的数据,这时候我们就可以使用死区的功能将这些范围内的变化进行过滤。

通过以上配置,可以确保温度在5℃范围内频繁的变化时都不会进行输出,只有当与上一次输出的值变化超过5时才会进行输出。

案例二: 异常温度过滤

同样是锅炉的温度传感器,假设传感器在进行数据的采集时有时会存在一些异常的值,比如突然间温度的上升或下降大于10℃,而实际的场景中不可能会出现这种突然间大幅的数值波动,我们可以使用Filter节点的窄带模式进行过滤,将这种异常值进行排除。

总结

Node-RED的Filter节点是一种强大而灵活的数据处理工具,能够帮助我们根据需要过滤和传递关键的数据更新。通过合理配置RBE节点,可以有效地管理和优化数据流,提高系统的响应能力和效率。

希望通过本文,你能够更加深入地了解和应用Node-RED的RBE节点。如果有任何问题或需要进一步讨论,欢迎在评论区留言。

欢迎关注我的公众号 “nodered-co”,原创技术文章第一时间推送。

关注公众号并回复 “教程” 获取约 200 页 "Node-red 中文教程 "

· 5 min read

在自动化和物联网 (IoT) 领域,Node-RED 是一款强大的流式编程工具。它允许我们通过拖拽节点来实现各种复杂的逻辑操作。其中,Delay 节点是一个非常有用的工具,能够帮助我们实现消息的延迟发送和限流。本文将详细讲解 Node-RED Delay 节点的使用方法和应用场景。

什么是 Delay 节点?

Delay 节点是 Node-RED 中的一个核心节点,用于控制消息的发送时间。它有两个主要功能:

1. 延迟消息发送:在指定的时间后发送消息。

2. 限流:控制一定时间内通过节点的消息数量。

如何配置 Delay 节点?

1. 消息延迟

双击 Delay 节点打开配置面板,行为设置选择 “延迟每一条消息 “,然后设置延迟时间(根据需求可以选择延迟一个固定时间或随机事件,同时页可以使用 msg.delay 进行配置具体的延迟事件)。例如,如果我们希望每条消息延迟 5 秒发送,可以配置如下:

2. 消息限流

双击 Delay 节点打开配置面板,行为设置选择选择 “限制信息速率”,然后设置发送消息的频率 (可以设置在固定的时间内发送多少条消息),同时也可以设置要如何处理被限制的中间消息如何进行发送, 处理方式有以下三种:

  1. 1. 将中间消息排队
  2. 2. 不传送中间消息
  3. 3. 在第二个输出端发送中间消息

用的比较多的是 2 和 3 这两种选项,使用第一种选项时由于中间消息会缓存在消息队列中,当需要将中间消息队列的数据进行发送时在发送的消息中设置 flush 属性即可触发所有中间消息的发送。

例如,如果希望在一分钟内最多只发送 10 条消息,可以配置如下:

实际案例

案例一: 消息延迟处理

在智能家居的场景,假设房间内有一个人体感应器,希望在人离开后延时 30s 后自动关闭所有的灯光。可以通过使用 delay 节点的延迟每一条消息的进行实现。如下图所示:

案例二: 消息去抖动

在一些传感器数据采集场景中,传感器可能会频繁的发送数据,导致数据抖动。通过 delay 节点可以对消息进行去抖动处理。如下图所示:

总结

Node-RED 的 Delay 节点是一个强大且灵活的工具,能够帮助我们有效地控制消息的发送时间和频率。无论是进行消息去抖动、API 调用频率限制还是简单的消息延迟,Delay 节点都能够提供解决方案。通过合理配置 Delay 节点,可以大大提升流的稳定性和可靠性。

希望通过这篇文章,大家能够更加深入地了解 Node-RED Delay 节点的使用方法,并在实际项目中灵活运用。如果有任何问题或需要进一步的讨论,欢迎在评论区留言。

欢迎关注我的公众号 “nodered-co”,原创技术文章第一时间推送。

关注公众号并回复 “教程” 获取约 200 页 "Node-red 中文教程 "

· 6 min read

Function 节点是 Node-RED 中非常重要的一个节点,允许用户使用 JavaScript 编写自定义代码,以实现复杂的数据处理和逻辑控制。通过 Function 节点,用户可以灵活地操作消息数据,进行数据转换、条件判断等。

Function 节点的基本用法

1. 添加 Function 节点

在 Node-RED 编辑器中,从左侧节点库中拖拽 Function 节点到画布上。

2. 配置 Function 节点

  • • 双击节点打开配置窗口。
  • • 输入节点名称(可选)。
  • • 在函数输入框中编写 JavaScript 代码。例如,将消息 payload 转换为大写:
msg.payload = msg.payload.toUpperCase();
return msg;

  • • 保存配置。

透过以上步骤就完成了一个最基础的 function 节点的应用,将传入的 payload 转换为大写。在 function 节点中还有很多的细节功能,接下来将介绍其中几个比较常用的功能。

处理多个输出

1. 多输出的设置

当我们需要在 function 节点中创建多个输出时,在设置页签可以指定 function 节点的输出数量,如下图所示

在默认的情况下 function 节点只有一个输出,并直接返回 msg 对象进行输出,在设置了多个输出后需要在函数中返回一个数组,这个数组中的每一个元素对应着 function 节点的一个输出。

2. 多个输出中根据条件进行输出

在某些情况下我们希望 function 的多个输出节点根据函数中的条件进行判断,在不同的条件下触发不同的输出,这种情况我们可以使用 null 值来阻止对应的输出,比如三个输出中,将第二个元素设置为 null 则第二个输出不会触发后续的流程,达到阻止某个输出的情况。

循环发送多个消息

前面我们介绍的触发 function 节点后续流程的方式都是使用 return,但是 return 将会直接对函数进行返回,返回将会阻止后续的代码的继续执行,有时在流程中我们需要处理一个数组中的数据,对数组的数据进行处理后,每个元素都触发后续流程的执行,此时可以使用 node.send 方法来发送发送消息给后续的流程,且不会中断当前 function 节点对后续元素的影响。

日志与调试输出

function 节点中提供了以下三个方法,可以在 function 运行时输出不同等级的日志,从而协助我们对 function 节点进行调试和日志的记录。

注意: node.log 只会输出到 node-red 的控制台,而不会输出到 node-red 的调试窗口,node.warn 和 node.error 将会同时输出到 node-red 的调试窗口

node.log("这是一行普通日志");
node.warn("这是一行警告日志");
node.error("这是一行错误日志");

另外我们还可以使用 node.status 方法来设置 function 节点的状态。

node.status({fill:"red",shape:"ring",text:"disconnected"});
node.status({fill:"green",shape:"dot",text:"connected"});
node.status({text:"Just text status"});
node.status({});   // 清空状态

上下文数据

在 function 节点中除了能使用在 change 节点中也可以使用的 flow/global 这两个作用域的上下文数据,还有一个在节点作用域内的上下文数据。使用 context 变量进行访问。如下图所示使用 context 变量实现了对节点消息处理次数的统计。

总结

Node-RED 的 Function 节点提供了强大的数据处理和逻辑控制能力。通过本文的详细介绍,希望读者能够全面掌握 Function 节点的使用,包括基本用法、输出处理、多输出创建、循环消息的触发,调试输出及上下文数据的使用。在实际项目中灵活应用这些技巧,可以显著提高开发效率和程序的灵活性。如果有更多的想法,欢迎给我发送消息或留言,Node-RED 社区和官方文档也是很好的资源。

欢迎关注我的公众号 “nodered-co”,原创技术文章第一时间推送。

关注公众号并回复 “教程” 获取约 200 页 "Node-red 中文教程 "

Node-red function 节点官方文档 [1]

引用链接

[1] Node-red function 节点官方文档: https://nodered.org/docs/user-guide/writing-functions

· 5 min read

在构建和调试 Node-RED 流时,我们经常会遇到各种问题和挑战。为了确保流的稳定性和可靠性,了解并善用调试工具至关重要。其中,Complete、Status 和 Catch 节点是三个强大的工具,能够帮助我们更有效地监控和调试流的执行。

  • • Complete 节点:让我们能够捕捉节点处理完成的事件,确保流程按照预期执行。
  • • Status 节点:实时监控节点的状态变化,有助于识别连接问题和运行异常。
  • • Catch 节点:捕捉并处理错误信息,提供便捷的错误调试手段。

通过掌握这三个节点的使用,我们可以更好地管理 Node-RED 流的执行过程,提高开发效率,减少故障时间。接下来,我们将详细探讨这些节点的具体功能和应用场景。

Complete 节点

Complete 节点 用于检测和捕捉另一个节点的完成事件。这对于跟踪流的执行进度和处理复杂的异步操作非常有帮助。另外某些节点没有不包含任何的输出,如果想要在这个节点处理完成后执行相应的逻辑是无法在原本的流上继续完成的,这个时候就可以借助 Complete 节点来触发新的流。

使用方法

    1. 设置 Complete 节点需要监控的目标节点(可同时设置多个监控节点)。
    1. 当目标节点完成处理时,Complete 节点会输出一个消息,包含目标节点的详细信息。

示例

[{"id":"n1","type":"inject","z":"ceb407ee87fc0c2f","g":"764efde50cdd36fa","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"hello","payloadType":"str","x":290,"y":140,"wires":[["n2"]]},{"id":"n2","type":"debug","z":"ceb407ee87fc0c2f","g":"764efde50cdd36fa","name":"Debug Node","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":490,"y":140,"wires":[]},{"id":"n3","type":"complete","z":"ceb407ee87fc0c2f","g":"764efde50cdd36fa","name":"","scope":["n2"],"x":690,"y":140,"wires":[["n4"]]},{"id":"n4","type":"debug","z":"ceb407ee87fc0c2f","g":"764efde50cdd36fa","name":"Complete Debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","statusVal":"","statusType":"auto","x":910,"y":140,"wires":[]}]

在这个示例中,当 Debug 节点完成处理时,Complete 节点会捕捉到这一事件,并将其传递给另一个 Debug 节点进行显示。

Status 节点

Status 节点 用于监控和捕捉其他节点的状态变化。这在需要监控节点的运行状态(如连接状态、错误状态)时特别有用。

使用方法

    1. 设置 Status 节点需要监控的目标节点(可同时设置多个监控节点)。
    1. 当目标节点的状态发生变化时,Status 节点会输出一个消息,包含状态的详细信息。

示例

[{"id":"770d8e4ad52c920a","type":"tcp in","z":"ceb407ee87fc0c2f","g":"a757e97580a7d5cd","name":"","server":"server","host":"","port":"3456","datamode":"stream","datatype":"buffer","newline":"","topic":"","trim":false,"base64":false,"tls":"","x":280,"y":300,"wires":[["ed7f0604dbf779d9"]]},{"id":"ed7f0604dbf779d9","type":"debug","z":"ceb407ee87fc0c2f","g":"a757e97580a7d5cd","name":"debug 19","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":480,"y":300,"wires":[]},{"id":"3d0e761d14a00019","type":"status","z":"ceb407ee87fc0c2f","g":"a757e97580a7d5cd","name":"","scope":["770d8e4ad52c920a"],"x":710,"y":300,"wires":[["03bc43495d24b5ff"]]},{"id":"03bc43495d24b5ff","type":"debug","z":"ceb407ee87fc0c2f","g":"a757e97580a7d5cd","name":"status debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":930,"y":300,"wires":[]}]

在这个示例中,使用 tcp in 节点监听了 3456 端口,当有客户端连接时,在这个节点的状态将输出连接客户端的数量及相关信息,Status 节点会捕捉到 tcp in 节点的状态变化,并将其传递给 Debug 节点进行显示。

Catch 节点

Catch 节点 用于捕捉和处理其他节点抛出的错误。这对于错误处理和调试流中的问题非常关键。

使用方法

    1. 设置 Catch 节点需要监控的目标节点(可同时设置多个目标节点)。
    1. 当目标节点抛出错误时,Catch 节点会输出一个消息,包含错误的详细信息。

示例

[{"id":"ef07bfbce0cc133c","type":"inject","z":"ceb407ee87fc0c2f","g":"c32bba2451c44c06","name":"","repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"hello","payloadType":"str","x":290,"y":440,"wires":[["9167b038afbb194c"]]},{"id":"9167b038afbb194c","type":"function","z":"ceb407ee87fc0c2f","g":"c32bba2451c44c06","name":"Error Function","func":"throw new Error('Test Error');","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":490,"y":440,"wires":[[]]},{"id":"8d7fb7fb8f3b3f9b","type":"catch","z":"ceb407ee87fc0c2f","g":"c32bba2451c44c06","name":"","scope":["9167b038afbb194c"],"x":700,"y":440,"wires":[["090ace012541732f"]]},{"id":"090ace012541732f","type":"debug","z":"ceb407ee87fc0c2f","g":"c32bba2451c44c06","name":"Catch Debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":930,"y":440,"wires":[]}]

在这个示例中,我们使用 Function 节点抛出错误,Catch 节点会捕捉到这一事件,并将其传递给 Debug 节点进行显示。

总结

通过本文的介绍,我们了解了 Node-RED 中 Complete、Status、Catch 节点的作用和使用方法。它们在监控和调试流的过程中非常有用,可以帮助我们更好地理解和控制 Node-RED 流的执行状态。

希望这篇文章能帮助你更好地掌握 Node-RED 的使用技巧,如果有任何问题或需要进一步了解的内容,欢迎在公众号留言。

欢迎关注我的公众号 “nodered-co”,原创技术文章第一时间推送。

· 6 min read

当涉及到在 Node-RED 中实现灵活的消息转换、修改和删除时,Change 节点成为了一个强大而关键的工具。在这篇文章中,我们将深入探讨 Change 节点的作用、配置选项,带您逐步了解如何优雅地使用这一节点来定制您的 Node-RED 流。

Change 节点:消息的变换术

当需要修改 Node-RED 流程中的消息时,Change 节点成为不可或缺的工具。它为我们提供了设定值、替换值、删除和转移等丰富的功能,使得我们能够灵活地调整前面节点传递的消息,以满足后续节点的特定需求。通过 Change 节点,我们能够轻松地定制和优化消息流,确保信息在流程中传递时达到最佳状态。

了解消息流

为了更好的了解消息是如何在流程中进行传递的,我们先放置一个 Inject 节点,并设置 payload 为 "Hello World!",如下图所示:

再放置一个 debug 节点,并设置输出的内容为 "与调试输出相同",以输出整个消息的内容,如下图所示:

当我们点击 inject 节点左侧的按钮时消息将流经我们的流程,并在调试窗口中输出消息的内容,可以看到输出的内容为一个 JSON 对象的结构,包含了 payload,topic 和_msgid 这三个属性,如下图所示:

change 节点功能

1. 设置值 (Set)

设置值可以实现对消息的现有某个属性的值进行设置、修改和复制,如下图所示:

可以看到流程执行后 payload 属性被修改,同时添加了一个新的属性 value 并将 payload 属性复制给了 topic 属性,如下图所示:

对值进行深拷贝

当设置值时,如果所设置的值也是消息的某个属性,并且未勾选 "对值进行深拷贝" 选项时,若该属性为一个对象,那么这两个属性将共享同一个对象引用。这可能导致在修改其中一个属性时,另一个属性也会同时改变。若您不希望发生这种情况,建议勾选该选项。这样,在设置值时,原对象将会被深度复制,创建一个新的副本,从而确保两个属性的修改不会相互影响。这一选择提供了更灵活的数据管理方式,避免了潜在的引用传递问题。

2. 替换值 (Change)

在使用 Change 节点进行替换值时,节点提供了一项关键功能:能够根据特定条件检查属性中是否包含目标内容,并随后执行替换操作。如下图所示:

3. 删除 (Delete)

删除的功能非常简单,可以将消息的某个属性进行删除,如下图所示:

4. 转移 (Move)

转移功能会将原属性删除,并将原属性的值赋值给一个新的属性,相当于通知执行了设置值和删除两个动作。如下图所示:

change 节点的其他知识

  • • 可以使用 "." 和 "[]" 访问属性中的数组和属性中的子属性

  • • change 节点中的每个步骤是按顺序执行的,拖动左侧的图标可以调整执行顺序
  • • change 界面不但可以对消息的内容进行修改,还能修改 flow 和 global 上下文中的属性

总结

Change 节点在 Node-RED 中扮演着至关重要的角色,为用户提供了丰富的功能,用于定制和优化消息流。通过设定值、替换值、删除和转移等操作,Change 节点使得用户能够灵活地处理消息,确保其在整个流程中按照预期方式传递和被处理。

在处理消息时,Change 节点的深拷贝功能提供了额外的保障,避免了引用传递可能引发的问题,确保各节点间的数据隔离和一致性。

此外,Change 节点的条件执行和表达式支持,使得用户能够根据具体需求制定精细的规则,更好地适应不同的应用场景。

通过深入了解 Change 节点的各项功能,Node-RED 用户可以更加灵活地定制其流程,确保数据的准确性和流畅性。因此,熟练运用 Change 节点将为 Node-RED 流程的设计和实施带来更大的便利。

欢迎关注我的公众号 “nodered-co”,原创技术文章第一时间推送。

· 5 min read

在 Node-RED 的丰富节点库中,Inject、Debug、Change 节点是最基础、却也是最强大的三位一体。今天,让我们一起深入了解这三个节点,探寻它们各自的奇妙用法。

Inject 节点:定时触发,精准掌握流程

Inject 节点通常作为一个流的起始节点,能够在预定时间或手动触发时,精准注入消息。通过设置不同的注入时间和频率,可以轻松创建定时任务。在日常的使用中 Inject 节点是必不可少的一个关键节点。

在 inject 节点中我们可以为 Inject 节点指定需要注入的值,也就是触发时发送什么数据到流程中后续的节点,在默认情况 Inject 节点会自动为 payload 赋值为当前的时间戳。同时我们可以为消息添加更多的属性,并指定相应值。

Inject 节点的触发方式

1. 手动触发

当 Inject 节点被拖入到编辑器中,默认情况下的触发方式为手动触发,当我们点击 Inject 节点左侧的触发按钮时将触发流程的开始。

2. 周期性执行

指定一个时间间隔,在每个相应的时间就会触发传递一次 Inject 节点的消息给下一节点,从而触发流程的开始。

3. 指定时间段周期性执行

可以比周期性执行控制的更加的精细,除了时间周期外还能指定在一周内的哪几天的哪个时间段内进行周期性执行。

4. 指定时间

对于每天只需要在特定时间触发一次的情况下可以使用指定的时间的方式,同时也可以指定在一周内的哪几天进行触发。

Inject 节点的设置相当的简单,通常情况下我们会使用 Inject 节点来进行一些定时任务的触发,比如每天发送一份特定的邮件;使用 Inject 节点协助调试开发,我们可以在 Inject 节点中模拟各种我们需要的数据来触发流程的执行,从而来模拟流程执行的各种情况;定时触发,用来记录系统的状态、性能指标和日志信息,一遍后续分析和监控系统的运行状况。

Debug 节点: 实时监视和调试消息流

Debug 节点在 Node-RED 中是专为调试和查看消息流程而设计的强大工具。它为开发者提供了实时监视消息流动、查看节点数据的能力,同时支持迅速定位潜在问题。这个节点充当着开发者的实时观察窗口,让调试过程更加直观、高效。通过 Debug 节点,开发者能够深入了解消息的传递路径和节点处理,为流程的调优和问题排查提供了有力的支持。

Debug 节点默认情况下输出输出 msg.payload 属性,我们可以修改使其输出我们想要的属性或整个消息的内容。

同时我们可以把我们关心的关键属性输出到节点状态,这样我们可以把更多精力集中在流程上,而不用把焦点移动到调试窗口中查看调试消息,更方便的看到最新的状态。

欢迎关注我的公众号 “nodered-co”,原创技术文章第一时间推送。