借助 Node-RED 和 InfluxDB 轻松实现物联网
作者:查尔斯·马勒 / 产品,用例,开发者
2022 年 3 月 30 日
导航至
在这篇文章中,您将了解 Node-RED,这是一个流行的快速连接不同类型硬件和软件的工具。您将学习 Node-RED 的核心概念,然后学习如何使用 MQTT 代理和 InfluxDB 来制作一些 工作流程,例如存储来自传感器的数据。
什么是 Node-RED?
Node-RED 是一个基于流程式开发概念的开源、低代码、可视化编程工具。它的理念是让连接 API、硬件设备以及任何通过某种网络连接可访问的事物变得非常简单。
Node-RED 提供了多种预构建的“节点”,允许非开发者使用可视化界面创建自定义集成和自动化,同时允许开发者在需要时使用 JavaScript 或其他语言编写的自定义节点。在许多方面,Node-RED 可以被视为低代码运动早期的一些例子之一。
Node-RED 最初由 IBM 开发,然后贡献给了 OpenJS 基金会。可以说,Node-RED 的最大优势是其生态系统和社区,在 GitHub 上有超过 14,000 个星标,并有一个社区库,其中包含超过 3000 个预构建节点和 2000 个可定制的流程,涵盖了许多常见用例。
简而言之,使用 Node-RED 类似工具的好处有:
- 无需重新发明轮子 - 拥有大量预构建功能
- 庞大的社区,提供许多常见问题的解决方案
- 易于扩展,以适应您的用例的定制功能
Node-RED 核心概念
在本节中,我将介绍 Node-RED 的几个主要组件,帮助您迅速上手。
节点
正如您所期望的,根据名称,节点是 Node-Red 的重要部分。它们是您在 Node-Red 中所做的所有事情的基石。节点通过从前面的节点接收消息对象或外部事件(如 HTTP 请求)来触发。节点处理消息或事件,然后将其传递给下一个节点。
以下是 Node-RED 提供的一些最常见和有用的节点:
- 注入 - 注入节点允许您通过注入消息负载手动启动流程。负载可以是字符串、数字或具有多个属性的复杂对象。此节点还可以设置为在指定时间或定期间隔运行。
- 变更 - 变更节点是编写自定义函数以执行基本转换或修改(如向消息对象添加或删除属性)的一个不错的替代方案。
- 调试 - 调试节点可用于帮助开发流程并找到潜在错误发生的位置。默认情况下,它将消息负载发送到调试侧边栏,但也可以自定义以发送不同的信息,还可以在启动 Node-RED 的终端中打印。
- 开关 - 开关节点允许根据定义的规则将消息路由到流程的不同分支。例如,如果你有一个检测温度的传感器,你可能希望基于某个阈值创建一个警报。如果温度没有超过该阈值,你可以结束流程。
- 函数 - 函数节点允许你为不提供 Node-RED 预构建节点的用例编写自定义 JavaScript 代码。
除了这些节点外,还有一些其他节点可以用于处理消息、存储数据和处理不同类型的网络请求。
流程
可以将流程视为组织节点序列的容器。在 Node-RED 编辑器中,它们以独立标签的形式表示。你可以使用多种不同的策略和 最佳实践 来确定何时将流程分割成多个不同的流程,或者将其全部保留在一起。
消息
消息是 JavaScript 对象,它们通过节点从流程的开始传递到结束。对象上的属性可以通过节点添加或修改。惯例是将最相关的信息存储在消息对象上的 payload
属性中,该对象通常称为 msg
。
上下文
Node-RED 中的上下文本质上是可以由节点直接访问的全球变量的定义能力,而不是从传递给节点的消息中访问。上下文可以设置在三个不同的级别。第一个是节点级别,只有设置值的节点可以访问它。第二个是流程级别,该值对该流程内的所有节点可见。最后一个上下文级别是真正全局的,Node-RED 实例中的任何节点都可以访问该值。
Node-RED 流程教程
现在让我们开始实际教程,并使用 Node-Red 创建一些流程。如果你想跟随,你需要一个运行的 Node-RED 实例。安装 Node-RED 有多种选择,如果你已经安装了 NPM,那么这可能是最简单的方法。你还可以使用 Docker 或使用 Git 从源代码安装。你可以在 Node-Red 文档 中查看所有可用选项。
一旦安装了 Node-RED,你就可以打开你的网页浏览器,访问本地主机端口 1880,看到 Node-Red 编辑器。我们将从创建一个基本的“hello world”流程开始,以确认一切正常工作。
首先,从左侧侧边栏拖动一个注入节点并将其放置到编辑器中。单击节点,将负载更改为包含值和任何输入的字符串,我将遵循传统,使用“hello world”作为我的值。
现在抓取一个调试节点并将其放置到编辑器中,默认情况下,它将输出前一个节点传递的消息负载。单击调试节点并勾选“系统控制台”框,以便我们的消息也打印到终端以及调试侧边栏。你的编辑器应该看起来像这样
现在你可以单击 Node-Red 编辑器右上角的部署。单击注入节点左侧的框以启动你的流程。如果一切正常,你应该会在你的终端和 Node-Red 调试侧边栏中看到值。
Node-RED MQTT 流程
接下来,我们将进入一个稍微复杂一点的内容。对于这个流程,我们将连接 Node-RED 到一个 MQTT 代理,使用 Node-Red 函数节点转换数据,然后使用 InfluxDB 进行长期存储和分析。
首先,您需要安装 InfluxDB Node-Red 包。为此,点击编辑器右上角的汉堡菜单图标,紧邻部署按钮。然后点击“管理调色板”,再点击“安装”标签。在搜索框中输入 InfluxDB,选择名为 node-red-contrib-influxdb 的包。
安装此包后,如果您将鼠标滚动到屏幕左侧节点调色板的底部,应该会看到为处理 InfluxDB 添加了三个新节点。
接下来,您需要创建一个 InfluxDB 实例。您可以选择创建免费的 InfluxDB 云账户或本地安装 InfluxDB。创建一个桶(bucket),然后获取对该桶的访问权限的 API 令牌。您可以在 InfluxDB 文档 中找到如何进行此操作及其他更多信息的说明。
对于此流程,我们将不使用注入节点来启动,而是使用 MQTT In
节点并连接到由 HiveMQ 提供的免费 公共 MQTT 代理。如果您已经安装了本地的 MQTT 代理,您也可以使用它,配置相同。将 MQTT 节点拖拽到编辑器中,并添加一个新的代理,提供服务器 URL 和端口号。对于 HiveMQ,URL 为 broker.hivemq.com
,端口号为 1883
。版本保持为 MQTT V3.1.1。
将节点的 Action
设置为订阅单个主题,并在其中输入您想监听的主题,这里可以是任何您想的内容。为了简单起见,我将主题设置为 nodered
。一旦部署此流程,Node-RED 将连接到代理并监听该主题名下的任何消息。
我们将通过 MQTT 传递一个温度数字来模拟某种物联网传感器的空气温度记录。默认情况下,这将作为一个字符串传递,因此我们需要创建一个函数将其转换为整数,然后再用 InfluxDB 存储。在页面上添加一个函数节点,并将以下代码放入该节点中
msg.payload = Number(msg.payload)
return msg;
现在添加 InfluxDB Out
节点并将其连接到函数。通过添加您的 URL 和 API 令牌来创建 InfluxDB 服务器实例。然后添加您的组织 ID 和您想存储数据的桶的名称。
要测试一切是否正常,您可以使用任何 MQTT 客户端。HiveMQ 也提供了一个易于使用的 websocket 客户端,您可以在 这里 找到。将主题设置为与您的 MQTT 节点中的主题匹配,然后发布一条包含数值的消息,例如这样
如果一切正常,每次您向代理提交 MQTT 消息时,您应该开始在您的 InfluxDB 实例中看到数据。
流程本身应该看起来像这样,请注意 MQTT 节点提供了一个通知框,告知您是否能够连接到代理。
Node-RED 项目想法
现在您已经基本了解了如何使用 Node-RED,但一些实际的应用场景是什么呢?在本节中,我将为您介绍一些您可以探索以构建自己的自定义项目的潜在领域。
数据可视化和分析
Node-Red作为不同组件之间的粘合剂,使得数据传输变得容易。虽然Node-RED提供了一些基本的存储和可视化功能,但使用专业工具来做这些事情更有意义。正如您在MQTT示例中看到的那样,InfluxDB可以用于存储和可视化数据。对于分析,Flux脚本语言提供了大量用于分析时序数据的功能。Node-RED InfluxDB包还提供了一个节点,用于从InfluxDB查询数据到Node-Red,这样如果您更喜欢其他工具,您就可以访问生态系统中的其他工具。
智能家居
Home Assistant是一个流行的智能家居自动化框架,提供了与众多智能设备的集成。但许多用户发现使用Home Assistant提供工具构建更多定制工作流程比较困难。在这些情况下,Node-RED是一个常见的选择,有很多潜在的项目选项可以帮助您更深入地了解Node-RED,同时也具有实际应用价值。
Node-RED作为事件处理框架
尽管本文的重点是物联网相关的内容,但我认为将Node-RED视为处理任何类型事件的一种工具是了解它能做什么的最佳方式。Node-RED让您能够快速连接和监听HTTP、WebSocket、TCP、MQTT和其他众多网络协议。
因此,它可以用于将数据移动到几乎任何类型的应用程序中,并通过NPM模块让您访问整个NodeJS生态系统。您还可以通过API访问其他服务,或通过Exec节点运行本地命令。使用Node-RED,您的唯一限制实际上是如何组合它提供的工具的创造性。