# Node-RED(Raspberry Pi)传感器MQTT和云

### 关键词

Node-RED | Raspberry Pi | 数据库 | MQTT | 云端 | SQLite | 灯控 | 温湿度 | 传感器 | 服务器

### 关联链接

{% embed url="https://viadean.notion.site/Node-RED-Raspberry-Pi-MQTT-11371a5ae8c145dc83451d5a66e15d05?pvs=4" %}

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}

#### 要点

1. 设置Raspberry Pi，Windows和Mac的Node-RED开发环境
2. Node-RED灯控，温湿度控制
3. 网络服务器数据库储存数据，绘制温湿度图表
4. 从Node-RED调用Web API
5. 使用Git控制Node-RED项目版本
6. Node-RED创建和连接数据库
7. Raspberry Pi使用Node-RED采集数据，使用MQTT
8. Node-RED边缘设备发布数据，订阅和可视化服务器端Node-RED数据
9. 自定义Node-RED库并发布

### Node-RED示例

让我们首先看一些简单的示例，了解您可以使用 Node-RED 执行哪些操作。

**示例1：使用 Node-RED 提醒您锻炼计划**

<figure><img src="https://2907506351-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcRbkePFdnJDPsCNQ6qJj%2Fuploads%2Fpn1KvgHnbPu8z7qCFSyV%2Fimage.png?alt=media&#x26;token=3134148b-5ff0-4805-b748-1be3fbffd39f" alt=""><figcaption></figcaption></figure>

节点从 Node-RED UI 中的节点选项板中拖动，并在流程画布上连接在一起。 从最左边的节点开始，我们从一个 openweather 节点开始，您可以将其配置为按设定的时间间隔检查任何主要城市的天气。 检查时，它将结果打包在一条消息中，该消息转发到下一个节点，在本例中为交换节点。 交换节点执行简单的测试，检查输入消息中的值，如果测试为真，则发送值为“1”的消息。 在我们的示例中，它被配置为测试温度值 (tempc)，看看它是否为 15 摄氏度或更高。

当开关节点测试为 true 或“打开”时，它会向 fitbit 节点发送一条消息，该节点是流程中的下一个节点。 Fitbit 节点是另一个功能强大的预构建节点，您可以对其进行配置，以从 fitbit.com 门户获取 Fitbit 设备的统计数据。 Fitbit 节点将您设备的统计数据打包成一条消息，并将其转发到流程中的下一个节点。

下一个节点是另一个交换节点。 该程序已配置为检查您今天行走的步数是否小于 1000。它通过测试 Fitbit 数据字段summary.steps 是否小于 1000 来实现此目的。请记住，它刚刚获取了这些 来自 Fitbit 节点的消息中的统计数据，该节点又通过调用 fitbit.com 上的 Fitbit API 来获取这些数据。

如果您今天走了不到 1000 步，那么切换节点会生成一条消息，该消息通过流程传递到功能节点。 函数节点是一个通用的通用节点，允许您用 Javascript 编写自己的编程逻辑。 现在，您可以假设该节点只是创建一条新消息，其中包含电子邮件主题行和可以通过电子邮件发送的文本正文。

一旦在功能节点中创建此消息，它就会通过流程发送到最终节点，即电子邮件节点。 该节点将获取任何传入消息的正文并将其发送到节点初始化时配置的电子邮件帐户。 在这种情况下，您可以将其设置为向自己发送消息。

这是一个非常简单的流程，使用 Node-RED 预构建节点的功能来检查您当地的天气，如果天气相当温暖并且您今天没有走太多路，它会向您发送电子邮件提醒。

虽然该示例看起来很简单，只是检查天气和您的 Fitbit 活动，但您可以使用类似的流程来检查家庭设备、服务器场中的计算机、工厂中的设备等的状态，然后您可以使用 输出节点发送邮件、对后台软件进行 API 调用、控制现实世界的设备——事实上，选择是无穷无尽的。 Node-RED 是一款极其强大的工具，用于将输入和输出连接在一起，并提供许多节点（内置或由 Node-RED 社区开发）来执行一系列令人惊叹的任务。

**示例2：Node-RED 内置 HTTP 节点构建简单的 Web 服务**

我们在这个高级介绍中的最后一个例子是另一类流。 它展示了如何创建一个简单的 Web 服务，该服务通过查询一些真实世界的数据来响应浏览器发送的 HTTP 请求，然后将包含该数据的图形表示的网页返回给浏览器 – 本质上 Node-RED 正在被 用于通过几个节点提供 Web 服务器和简单服务。

继续使用上一个示例中介绍的 Fitbit 节点，此示例创建一个简单的 Web 服务，允许您查询当天的 Fitbit 统计数据，并使用漂亮的圆环图显示您通过锻炼“消耗”了多少卡路里 。

流程如下图所示，由4个节点组成。 第一个和最后一个节点是 http 输入和输出节点，它们一起侦听 HTTP 请求并发送 HTTP 响应。 此流程侦听来自任何来源的 HTTP 请求，但我们假设这里使用的是常规浏览器。 当它到达时，它会从 fitbit.com 查询您的 Fitbit 统计数据，然后使用模板节点构建 HTTP 页面，并将其传递到 http 输出节点，该节点将网页发送回浏览器。

这只是为了让您了解 Node-RED 的强大功能和灵活性，而不需要深入了解该流程如何工作的所有细节。在较高级别上，http 输入节点已配置为侦听 URL 上的 HTTP 请求。

当 HTTP 请求传入时，http 输入节点会创建一条消息来触发 fitbit 节点，该节点是流程中的下一个节点。 Fitbit 节点获取用户的当前统计数据，然后将这些统计数据作为消息传递到模板节点。 html 模板节点是 Node-RED 中的另一个预构建节点，与函数节点一样，它允许您构建任意代码。 但是，模板节点不像函数节点那样使用 JavaScript，而是使用 HTML 等文本。

模板节点中的 HTML 代码如以下清单所示，因此，对于那些想要查看详细信息的人，您可以看到发生了什么。 基本上，模板节点从 Fitbit 获取卡路里消耗数据，并使用第 3 方图形库创建一个简单的 HTML 文件，该文件将告诉接收浏览器使用第 3 方图形库来显示卡路里消耗圆环图。

```html
<!doctype html>
<head>
    <title>A Node RED Example</title>
    <link rel=”stylesheet” href=”//cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.css”>
    <script src=”//cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js”></script>
    <script src=”//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js”></script>
    <script src=”//cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.min.js”></script>
</head>
<html>
    <div id=”chart-example” style=”height: 250px;”></div>
    <script>
        Morris.Donut({
           element: ‘chart-example’,
           data: [
             {label: “Activity Calories”, value: {{payload.summary.activityCalories}} },
             {label: “Calories BMR”, value: {{payload.summary.caloriesBMR}} },
             {label: “Calories Out”, value: {{payload.summary.caloriesOut}} }
          ]
       });
    </script>
</html>
```

#### RED 节点和消息

正如您在上面中看到的，Node-RED 允许您将节点连接在一起以创建执行编程任务的流程。 消息在节点之间传递，从输入节点通过处理节点移动到输出节点。 让我们简单看一下节点、流和消息。

[**A.参阅：Node-RED控制流和节点**](../zhi-dian-mi-jin-brief)

节点主要分为三种类型：

1. 输入节点（如，inject）
2. 输出节点（如，debug）
3. 处理节点（如，function）

输入节点允许您将数据输入到 Node-RED 应用程序或“流”中。 它们至少有一个输出端点，仅在其右侧由灰色小方块表示。 您可以使用输入节点连接来自其他服务的数据，例如 串行、websockets 或 tcp 节点，或者使用注入节点将数据手动输入到流中。

输出节点允许您在 Node-RED 流之外发送数据。 它们的左侧有一个输入端点。 您可以使用输出节点将数据发送到其他服务，例如通过tcp、串行或电子邮件节点，或使用调试节点将数据输出到调试窗格。

处理节点允许您处理数据。 它们具有一个输入端点和一个或多个输出端点。 它们允许您转换数据类型（例如 json、csv、xml）节点、使用数据触发消息（例如触发器、延迟）节点以及编写使用接收到的数据的自定义代码（例如函数节点）。

请注意，某些节点（例如注入和调试消息）具有一个按钮，可让您启动节点（在注入节点的情况下）或启用和禁用节点（在调试节点的情况下）。

流由连接在一起的多个节点组成，输出选项卡链接到流中下一个节点的输入选项卡。消息沿着节点流动，将数据从一个节点传送到另一个节点。

Node-RED 节点消耗输入消息并生成输出消息。消息是至少包含一个“有效负载”参数的 JavaScript 对象，如下所示：

基本 Node-RED 消息结构：

```javascript
msg = {
  payload:”message payload”
};
```

节点消费和生成消息，通常使用 msg.payload 作为它们消费和生成的数据的主要占位符。 然而，消息可以扩展以包含其他参数。 例如，要设置消息主题并添加新参数位置，您可以创建一个新的 msg 对象，如下所示。

```javascript
msg = {
  payload:”message payload”,
  topic:”error”,
  location:”somewhere in space and time”
};
```

**示例3：创建Hello World**

我们继续开始构建您的第一个流程，以便您可以看到使用 Node-RED UI 构建和部署流程有多么简单。

让我们从最简单的流程开始，一个将一些信息注入流程的节点，连接到调试节点以将流程的输出作为调试消息查看。一旦运行起来，您就可以将其构建为完整的 Hello World 流程。

由于这是第一次向您展示如何实际构建流程，因此让我们慢慢开始并用屏幕截图解释每个步骤。 一旦您创建了第一个流程并看到它有多么简单，您将主要看到最终流程的单张图片，而不是所有屏幕截图。

让我们从最简单的节点开始，即评论节点。您可以在节点选项板的公共部分找到它。将注释节点拖放到流程工作区中，如下图所示

完成此操作后，双击注释节点以编辑其属性并在右侧显示关联的信息窗格（如果选择了调试选项卡，请记住切换到信息）。 如下图所示，您将看到有关节点的一些信息，包括节点名称、唯一 ID。 在属性窗格中，您可以将节点重命名 - 在我们的示例中为“我的第一个 NR 流”，并且您可以设置自己的描述，该描述将显示在右侧的信息窗格中。

[**B.参阅：设置Node-RED在Raspberry Pi，Windows和Mac开发环境**](../zhi-dian-mi-jin-brief)

#### 消息及其包含的内容

Node-RED 中的所有消息都具有三个默认属性：有效负载（我们在上面看到）、消息主题（描述消息内容的用户定义字符串（其主题，如果您愿意的话））以及内部标识符。 如果您编辑调试节点配置，您实际上可以看到此信息。

[**C.参阅：Raspberry Pi本地使用Node-RED**](../zhi-dian-mi-jin-brief)

**示例4：创建天气提示**

在此示例中，与上述介绍的示例类似，您将监控家乡的天气，并在天气看起来不错时向自己发送一封电子邮件。 您将使用天气节点 – openweathermap – 从 openweathermap.org 检索您设置的位置的天气。 一个简单的功能节点将用于检查“晴朗天气”，而电子邮件节点将用于在天气良好时向自己发送电子邮件。 本质上，就是使用 Node-RED 进行天气监控！

如果您在 Raspberry Pi 或台式计算机上运行 Node-RED，则可以通过右上角 Node-RED 菜单中的 Node-RED 调色板管理器来管理节点。 选择管理调色板，然后选择安装。 从那里您可以搜索“openweathermap”并单击“安装”按钮。 安装后，您将在左侧节点调色板中看到两个节点，它们已添加到它们自己的“天气”分组中。

[**D.参阅：云端Node-RED和从 Node-RED 调用 Web API**](../zhi-dian-mi-jin-brief)

要对该逻辑进行编程，您将使用函数节点。让我们看看如何使用它们，将其拖到流程工作区并双击它打开节点编辑器。

现在双击函数节点并输入/复制它（请注意，如果您使用复制/粘贴 - 确保粘贴为纯文本）

函数节点“If Clear Weather”

```javascript
if (msg.payload.weather === “Clear”) {
    msg.payload = “Clear skies ahead today!”
    return msg;
}
return null;
```

Node-RED UI 最有用的功能之一是能够使用标准的剪切和粘贴剪贴板复制和粘贴节点甚至完整流程。 Node-RED 流简单地编码为 JSON 字符串，可以从工作区导出，并使用 Node-RED 窗口右上角的 Node-RED 下拉菜单导入到工作区。

**示例5：使用MQTT和WebSokcet**

* 通过 MOTT 消息接收 JSON
* 使用 switch 节点处理 JSON 对象
* 使用更改节点更改或操作消息负载
* 使用 rbe (异常报告) 节点
* 使用范围节点缩放输入
* 使用 mqtt 输出节点来测试流程
* 将 Websocket 与 Node-RED 结合使用
* 发送 TCP 请求

[**E.参阅：Node-RED数据库和MQTT应用**](../zhi-dian-mi-jin-brief)

**示例6：函数节点和消息**

* 在函数节点中创建并返回新消息
* 在函数节点中创建并返回多条消息
* 在函数节点中使用 Context
* 使用全局上下文
* 创建子流
* 使用子流封装函数节点

**示例7：中级功能**

* 网页检索数据
* 计算字符串中的单词数
* 使用上下文生成滚动平均值
* 使用 context 元素共享一个函数并使其可供画布中的所有函数访问
* 定义和使用迭代器子流
* 从外部 API 获取地震数据并将其作为多条消,息返回
* 函数节点上的多个输入
* 让函数节点在单个输出上发送多条消息
* 使用 Node-RED 创建博客站点

**示例8：仪表板和图表显示**
