

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 手动设置开源集成 (Windows)
<a name="windows-manual-setup"></a>

使用本指南为与 Grafana® 和 Node-RED® 连接的风速数据手动创建时序存储桶。

 手动安装和配置 Node-RED、InfluxDB® 和 Grafana 以控制您的部署配置。Microsoft Windows您可以使用InfluxDB存储和管理来自设备的时间序列数据。

## 手动设置的先决条件
<a name="windows-open-source-prerequisites"></a>

在开始之前，请完成以下要求：

**注意**  
在同一台主机上运行所有服务（SiteWise Edge、InfluxDB、Node-RED 和 Grafana）。
+ 安装支持 MQTT 的 V3 网关。有关更多信息，请参阅 [支持 MQTT 的边缘版 V3 网关 AWS IoT SiteWise](mqtt-enabled-v3-gateway.md)。
+ 在本地安装和运行以下服务：
  + InfluxDB OSS v2。有关安装步骤，请参阅[安装 InfluxDB](https://docs.influxdata.com/influxdb/v2/install/)。
  + Node-red。有关安装步骤，请参阅在本地[安装 Node-RED](https://nodered.org/docs/getting-started/local)。
  + Grafana。有关安装步骤，请参阅[安装 Grafana](https://grafana.com/docs/grafana/latest/setup-grafana/installation/)。

# 使用 InfluxDB 设置本地存储
<a name="windows-influxdb-setup"></a>

使用 InfluxDB®，您可以在本地存储设备上的时间序列数据。本地存储功能的目的是在网络中断期间保持操作可见性，并减少时间关键型应用程序的延迟。您可以在边缘执行分析和可视化，同时仍然可以选择性地将数据转发到云端。

在本节中，您将为涡轮机风速数据创建时间序列存储桶，并为 Grafana® 和 Node-RED® 连接生成一个 API 令牌。InfluxDB 存储桶可用作时间序列数据的专用存储容器，类似于传统系统中的数据库。API 令牌支持以编程方式安全地访问您的数据。

**设置 InfluxDB**

1. 完成必备步骤并确保所有工具都在同一台主机上运行后，打开您的 Web 浏览器并前往 [http://127.0.0.1:8086](http://127.0.0.1:8086)。

1. （可选）启用 TLS 加密以增强安全性。有关更多信息，请参阅中的[启用 TLS 加密*InfluxData Documentation*](https://docs.influxdata.com/influxdb/v2/admin/security/enable-tls/)。

1. 创建一个时间序列 InfluxDB 存储桶来存储来自 Node-RED 的数据。该存储桶将用作风电场数据的专用容器，允许您组织和管理特定于该数据集的保留策略。有关更多信息，请参阅中的[管理存储桶](https://docs.influxdata.com/influxdb/v2/admin/buckets/)。*InfluxData Documentation*

1. （可选）为您的边缘站点配置数据保留期。设置适当的保留期可以自动删除本地操作不再需要的旧数据，从而有助于高效地管理存储资源。

   有关数据保留的信息，请参阅[中的 InfluxDB 中的数据保留](https://docs.influxdata.com/influxdb/v2/reference/internals/data-retention/)。*InfluxData Documentation*

1. 为存储桶生成 API 令牌。该令牌将启用InfluxDB与其他组件（例如Node-red和Grafana）之间的安全通信。这样，只有经过授权的服务才能读取或写入您的数据存储。有关更多信息，请参阅中的[创建令牌*InfluxData Documentation*](https://docs.influxdata.com/influxdb/cloud/admin/tokens/create-token/)。

完成这些步骤后，您可以将时间序列数据存储在InfluxDB实例中，从而为边缘环境中的本地数据持久性和分析奠定基础。

# 为数据集成配置 Node-red 流程 AWS IoT SiteWise
<a name="windows-nodered-config"></a>

借助 Node-red®，您可以实现两个流程来管理设备和之间的数据。 AWS IoT SiteWise这些流程共同创建了一个全面的数据管理解决方案，可同时满足本地和云端数据流的需求。
+ **数据发布流程**-发布到云端。数据发布流程将数据发送到 AWS IoT SiteWise。该流程通过生成传感器数据、将其转换为 AWS IoT SiteWise 格式并发布到 SiteWise Edge MQTT 代理来模拟涡轮机设备。这使您能够利用 AWS IoT SiteWise云功能进行存储、分析以及与其他 AWS 服务的集成。

  有关更多信息，请参阅 [配置数据发布流程](windows-nodered-data-publish-flow.md)。
+ **数据保留流程**-将数据存储在边缘。数据保留流程订阅 SiteWise Edge MQTT 代理以接收数据，将其转换为 InfluxDB® 格式，然后将其存储在本地以进行监控。这种本地存储允许即时访问操作数据，减少时间关键型应用程序的延迟，并确保网络中断期间的连续性。

  有关更多信息，请参阅 [配置数据保留流程](windows-nodered-data-retention-flow.md)。

这两个流程协同工作，确保数据既发送到本地， AWS IoT SiteWise 又存储在本地，以便立即访问。

[要访问你的 Node-red 主机，请访问 http://127.0.0.1:1880。](http://127.0.0.1:1880)有关启用 TLS 的信息，请参阅[启用 TLS 加密](https://docs.influxdata.com/influxdb/v2/admin/security/enable-tls/)。

# 配置数据发布流程
<a name="windows-nodered-data-publish-flow"></a>

数据发布流程使用三个节点来创建将您的工业数据发送到云端的管道。该流程对于实现基于云的分析、长期存储以及与其他 AWS 服务的集成至关重要。首先，将模拟设备数据发送到 SiteWise Edge MQTT 代理。网关从经纪人那里获取数据，然后将其传输到 AWS IoT SiteWise 云端，在那里你可以利用强大的分析和可视化功能。
+ **数据输入**-接收来自工业设备或模拟器的设备数据
+ **数据转换器 AWS IoT SiteWise**-将数据转换为 AWS IoT SiteWise 格式，以确保与 SiteWise Edge 网关兼容
+ **MQTT 发布者**-向 SiteWise Edge MQTT 代理发布数据，使其可供本地和云用户使用

![\[显示了 Node-red 数据发布流程的图表。它将模拟设备数据发送到 SiteWise Edge MQTT 代理，由 Ed SiteWise ge Gateway 获取，然后发送到 AWS IoT SiteWise 云端。\]](http://docs.aws.amazon.com/zh_cn/iot-sitewise/latest/userguide/images/gateway-open-source-nodered-publish-flow.png)


## 配置数据输入节点
<a name="windows-nodered-data-input-config"></a>

在此示例中，数据输入节点使用模拟风力涡轮机设备来生成风速数据。无论是来自模拟源（如我们的示例）还是来自生产环境中的实际工业设备，此节点都是您的工业数据的入口点。

我们对数据负载使用自定义 JSON 格式，以提供可与本地处理工具和 AWS IoT SiteWise 云服务高效配合使用的标准化结构。这种格式包括时间戳和质量指标等基本元数据以及实际测量值，从而在整个管道中实现全面的数据管理和质量跟踪。导入注入节点，以此标准化 JSON 格式接收带有时间戳、质量指标和值的模拟数据。

*有关 Node-RED 注入节点的更多信息，请参阅文档中的[注入](https://nodered.org/docs/user-guide/nodes#inject)部分。Node-RED*

涡轮机模拟器每秒以这种标准化 JSON 格式生成风速数据：

**Example : 涡轮机数据有效载荷**  

```
{
    name: string,         // Property name/identifier
    timestamp: number,    // Epoch time in nanoseconds
    quality: "GOOD" | "UNCERTAIN" | "BAD",
    value: number | string | boolean
}
```

这种格式有几个好处：
+ 该`name`字段标识特定的属性或测量值，允许您跟踪来自同一设备的多个数据点
+ `timestamp`以纳秒为单位可确保精确的时间跟踪，从而进行准确的历史分析
+ 该`quality`指标可帮助您根据数据的可靠性筛选和管理数据
+ 灵活的`value`字段支持不同的数据类型，以适应不同的传感器输出

**Example : 涡轮模拟器的注入节点**  

```
[
    {
        "id": "string",
        "type": "inject",
        "z": "string",
        "name": "Turbine Simulator",
        "props": [
            {
                "p": "payload.timestamp",
                "v": "",
                "vt": "date"
            },
            {
                "p": "payload.quality",
                "v": "GOOD",
                "vt": "str"
            },
            {
                "p": "payload.value",
                "v": "$random()",
                "vt": "jsonata"
            },
            {
                "p": "payload.name",
                "v": "/Renton/WindFarm/Turbine/WindSpeed",
                "vt": "str"
            }
        ],
        "repeat": "1",
        "crontab": "",
        "once": false,
        "onceDelay": "",
        "topic": "",
        "x": 270,
        "y": 200,
        "wires": [
            [
                "string"
            ]
        ]
    }
]
```

## 为数据转换配置节点
<a name="windows-nodered-sitewiseise-translator-config"></a>

E SiteWise dge 网关需要特定格式的数据，以确保与 AWS IoT SiteWise 云的兼容性。转换器节点是将输入数据转换为所需 AWS IoT SiteWise 有效载荷格式的重要组件。此转换步骤可确保您的工业数据能够在 AWS IoT SiteWise 云环境中得到正确处理、存储和分析。

通过在此阶段对数据格式进行标准化，您可以实现边缘设备与云服务之间的集成，您可以在其中使用资产建模、分析和可视化功能。使用以下结构：

**Example : SiteWise Edge 数据解析的有效载荷结构**  

```
{
  "propertyAlias": "string",  
  "propertyValues": [
    {
      "value": { 
          "booleanValue": boolean, 
          "doubleValue": number, 
          "integerValue": number,
          "stringValue": "string" 
     },
      "timestamp": {
          "timeInSeconds": number,
          "offsetInNanos": number
      },
      "quality": "GOOD" | "UNCERTAIN" | "BAD",
  }]
}
```

**注意**  
`propertyAlias`将与您的 MQTT 主题层次结构相匹配（例如，`/Renton/WindFarm/Turbine/WindSpeed`）。这样可以确保您的数据与中的正确资产属性正确关联 AWS IoT SiteWise。有关更多信息，请参阅中的 “数据流别名” 概念[AWS IoT SiteWise 概念](concept-overview.md)。

1. 导入用于 AWS IoT SiteWise 有效载荷转换的示例函数节点。此函数处理从标准化输入格式到 AWS IoT SiteWise兼容格式的转换，确保正确的时间戳格式、质量指标和值键入。

   ```
   [
       {
           "id": "string",
           "type": "function",
           "z": "string",
           "name": "Translate to SiteWise payload",
           "func": "let input = msg.payload;\nlet output = {};\n\noutput[\"propertyAlias\"] = input.name;\n\nlet propertyVal = {}\n\nlet timeInSeconds = Math.floor(input.timestamp / 1000);\nlet offsetInNanos = (input.timestamp % 1000) * 1000000;\n\npropertyVal[\"timestamp\"] = {\n    \"timeInSeconds\": timeInSeconds,\n    \"offsetInNanos\": offsetInNanos,\n};\n\npropertyVal[\"quality\"] = input.quality\n\nlet typeNameConverter = {\n    \"number\": (x) => Number.isInteger(x) ? \"integerValue\" : \"doubleValue\",\n    \"boolean\": (x) => \"booleanValue\",\n    \"string\": (x) => \"stringValue\", \n}\nlet typeName = typeNameConverter[typeof input.value](input.value)\npropertyVal[\"value\"] = {}\npropertyVal[\"value\"][typeName] = input.value;\n\noutput[\"propertyValues\"] = [propertyVal]\n\nreturn {\n    payload: JSON.stringify(output)\n};",
           "outputs": 1,
           "timeout": "",
           "noerr": 0,
           "initialize": "",
           "finalize": "",
           "libs": [],
           "x": 530,
           "y": 200,
           "wires": [
               [
                   "string"
               ]
           ]
       }
   ]
   ```

1. 验证 JavaScript 代码是否正确转换了风速数据。该函数执行几项重要任务：
   + 从输入中提取属性名称并将其设置为 propertyAlias
   + 将时间戳从毫秒转换为所需的秒和纳秒格式
   + 保留用于数据可靠性跟踪的质量指标
   + 自动检测值类型并根据 AWS IoT SiteWise 要求对其进行格式化

1. 将该节点连接到您的流程，将其链接到数据输入节点和 MQTT 发布者之间。

有关编写特定于业务需求的函数的指导，请参阅*Node-RED文档*中的[编写函数](https://nodered.org/docs/user-guide/writing-functions)

## 配置 MQTT 发布器
<a name="windows-nodered-mqtt-publisher-config"></a>

翻译完成后，数据就可以发布到 SiteWise Edge MQTT 代理了。

使用以下设置配置 MQTT 发布者以向 SiteWise Edge MQTT 代理发送数据：

**导入 MQTT 输出节点**

1. 使用`"type": "mqtt out"`将 MQTT 导出配置节点。MQTT 输出节点允许您共享经纪商的配置。

1. 输入键值对以获取与 MQTT 代理连接和消息路由相关的信息。

导入示例`mqtt out`节点。

**Example**  

```
[
    {
        "id": "string",
        "type": "mqtt out",
        "z": "string",
        "name": "Publish to MQTT broker",
        "topic": "/Renton/WindFarm/Turbine/WindSpeed",
        "qos": "1",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "string",
        "x": 830,
        "y": 200,
        "wires": []
    },
    {
        "id": "string",
        "type": "mqtt-broker",
        "name": "emqx",
        "broker": "127.0.0.1",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "5",
        "keepalive": 15,
        "cleansession": true,
        "autoUnsubscribe": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    }
]
```

示例 MQTT 输出节点使用以下信息创建 MQTT 连接：
+ Server：`127.0.0.1`
+ 端口：`1883`
+ 协议：`MQTT V5`

然后，MQTT 输出节点使用以下信息配置消息路由：
+ 主题: `/Renton/WindFarm/Turbine/WindSpeed`
+ 服务质量：`1`

## 部署并验证节点
<a name="windows-verify-deployment"></a>

配置三个数据发布流程节点后，请按照以下步骤部署流程并验证数据是否正确传输到 AWS IoT SiteWise

**部署和验证连接**

1. 按照数据发布流程所示连接三个节点。  
![\[Data publish flow diagram showing input from turbine simulator to AWS IoT SiteWise to MQTT broker.\]](http://docs.aws.amazon.com/zh_cn/iot-sitewise/latest/userguide/images/gateway-open-source-nodered-publish-flow.png)

1. 选择 **Deploy** 以应用所有节点连接更改。

1. 导航到[AWS IoT SiteWise 控制台](https://console.aws.amazon.com/iotsitewise/)并选择 “**数据流**”。

1. 确保在下拉菜单中选择了**别名前缀**。然后，搜索`/Renton/WindFarm/Turbine/WindSpeed`别名。

如果您在搜索中看到正确的别名，则表示您已经部署了流程并验证了数据传输。

# 配置数据保留流程
<a name="windows-nodered-data-retention-flow"></a>

数据保留流程可用于保持边缘的操作可见性。这在网络中断或需要立即访问数据时非常有用。此流程订阅 MQTT 代理以接收设备数据，将其转换为 InfluxDB® 格式，然后将其存储在本地。通过实施此流程，您可以创建弹性本地数据存储，操作员无需依赖云即可访问该数据存储，从而实现边缘的实时监控和决策。

该流程由三个关键组件组成，它们协同工作，以确保正确捕获和存储您的数据：
+ **MQTT 订阅客户端**-接收来自经纪商的数据，确保您捕获所有相关的行业数据
+ **InfluxDB 转换器**-将 AWS IoT SiteWise 有效负载转换为 InfluxDB 格式，为高效的时间序列存储做好准备
+ **InfluxDB 写入器**-处理本地存储，确保本地应用程序的数据持久性和可用性

![\[Node-red 数据保留流程\]](http://docs.aws.amazon.com/zh_cn/iot-sitewise/latest/userguide/images/gateway-open-source-nodered-data-retention.png)


## 设置 MQTT 订阅客户端
<a name="windows-nodered-mqtt-subscriber"></a>
+ 通过导入以下示例，在 Node-RED 中配置 MQTT 订阅客户端，使其接收来自 MQTT EMQX 代理的数据。 AWS IoT SiteWise   
**Example : 节点中的 MQTT**  

  ```
  [
      {
          "id": "string",
          "type": "mqtt in",
          "z": "string",
          "name": "Subscribe to MQTT broker",
          "topic": "/Renton/WindFarm/Turbine/WindSpeed",
          "qos": "1",
          "datatype": "auto-detect",
          "broker": "string",
          "nl": false,
          "rap": true,
          "rh": 0,
          "inputs": 0,
          "x": 290,
          "y": 340,
          "wires": [
              [
                  "string"
              ]
          ]
      },
      {
          "id": "string",
          "type": "mqtt-broker",
          "name": "emqx",
          "broker": "127.0.0.1",
          "port": "1883",
          "clientid": "",
          "autoConnect": true,
          "usetls": false,
          "protocolVersion": "5",
          "keepalive": 15,
          "cleansession": true,
          "autoUnsubscribe": true,
          "birthTopic": "",
          "birthQos": "0",
          "birthPayload": "",
          "birthMsg": {},
          "closeTopic": "",
          "closePayload": "",
          "closeMsg": {},
          "willTopic": "",
          "willQos": "0",
          "willPayload": "",
          "willMsg": {},
          "userProps": "",
          "sessionExpiry": ""
      }
  ]
  ```

此订阅可确保捕获发布给经纪商的所有相关数据以供本地存储，从而提供您的工业运营的完整记录。该节点使用与该[配置 MQTT 发布器](windows-nodered-data-publish-flow.md#windows-nodered-mqtt-publisher-config)部分相同的 MQTT 连接参数，订阅设置如下：
+ 话题 — `/Renton/WindFarm/Turbine/WindSpeed`
+ 服务质量 — `1`

有关更多信息，请参阅*Node-RED文档*中的 [Connect 到 MQTT 代理](https://cookbook.nodered.org/mqtt/connect-to-broker)。

## 配置 InfluxDB 转换器
<a name="windows-nodered-influxdb-translator"></a>

InfluxDB 使用[标签](https://docs.influxdata.com/influxdb/v1/concepts/glossary/#tag)进行索引，使用[字段](https://docs.influxdata.com/influxdb/v1/concepts/glossary/#field)作为值来组织数据。该组织优化了时间序列数据的查询性能和存储效率。导入包含将 AWS IoT SiteWise 有效载荷转换为 InfluxDB 格式的 JavaScript 代码的示例函数节点。翻译器将属性分成两组：
+ 标签-用于高效索引的质量和名称属性
+ 字段-时间戳（自纪元以来的毫秒数）和值

**Example : 转换为 InfluxDB 有效负载的函数节点**  

```
[
    {
        "id": "string",
        "type": "function",
        "z": "string",
        "name": "Translate to InfluxDB payload",
        "func": "let data = msg.payload;\n\nlet timeInSeconds = data.propertyValues[0].timestamp.timeInSeconds;\nlet offsetInNanos = data.propertyValues[0].timestamp.offsetInNanos;\nlet timestampInMilliseconds = (timeInSeconds * 1000) + (offsetInNanos / 1000000);\n\nmsg.payload = [\n    {\n        \"timestamp(milliseconds_since_epoch)\": timestampInMilliseconds,\n        \"value\": data.propertyValues[0].value.doubleValue\n    },\n    {\n        \"name\": data.propertyAlias,\n        \"quality\": data.propertyValues[0].quality\n    }\n]\n\nreturn msg",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 560,
        "y": 340,
        "wires": [
            [
                "string"
            ]
        ]
    }
]
```

有关其他配置选项，请参阅 Node-red GitHub 存储库[node-red-contrib-influxdb](https://github.com/mblackstock/node-red-contrib-influxdb)中的。

## 设置 InfluxDB 写入器
<a name="windows-nodered-influxdb-writer"></a>

InfluxDB 写入器节点是数据保留流程中的最后一个组件，负责将工业数据存储在本地 InfluxDB 数据库中。这种本地存储对于在网络中断期间保持操作可见性以及为时间紧迫的应用程序提供即时数据访问非常重要。

1. 通过 “管理面板” 选项安装 node-red-contrib-influxdb软件包。该软件包提供了将 Node-RED 与 InfluxDB 连接所需的节点。

1. 向您的流程中添加一个 InfluxDB 输出节点。这个节点将处理向你的InfluxDB数据库实际写入数据。

1. 配置服务器属性以建立与InfluxDB实例的安全连接：

   1. 将版本设置为 2.0-这指定您要连接到 InfluxDB v2.x，该版本使用与早期版本不同的 API

   1. 将 URL 设置为 `http://127.0.0.1:8086`-这指向您的本地 InfluxDB 实例

   1. 输入你的 InfluxDB 身份验证令牌。此安全令牌授权与您的数据库的连接。您在[使用 InfluxDB 设置本地存储](windows-influxdb-setup.md)操作过程中生成了令牌。

1. 指定存储位置参数以定义数据的存储位置和方式：

   1. 输入您的InfluxDB组织名称-该组织是一个供一组用户使用的工作空间，您的存储桶和仪表板属于该组。有关更多信息，请参阅中的[管理组织*InfluxData Documentation*](https://docs.influxdata.com/influxdb/v2/admin/organizations/)。

   1. 指定 InfluxDB 存储桶（例如，`WindFarmData`）— 该存储桶等同于传统系统中的数据库，可用作时间序列数据的容器

   1. 设置 InfluxDB 测量（例如`TurbineData`）— 测量值类似于关系数据库中的表，用于组织相关数据点

**注意**  
在InfluxDB实例的左侧边栏中找到您的组织名称。组织、存储桶和测量概念是InfluxDB数据组织模型的基础。有关更多信息，请参阅 [InfluxDB 文档](https://docs.influxdata.com/influxdb/v2/admin/organizations/)。

## 部署并验证保留流程
<a name="windows-nodered-retention-deploy"></a>

配置数据保留流程的所有组件后，您需要部署并验证系统是否正常运行。这种验证可确保您的工业数据正确存储在本地，便于即时访问和分析。

1. 如数据保留流程图所示，连接三个节点。这将创建从数据订阅到本地存储的完整管道。  
![\[Node-red 数据保留流程\]](http://docs.aws.amazon.com/zh_cn/iot-sitewise/latest/userguide/images/gateway-open-source-nodered-data-retention.png)

1. 选择 **Deploy** 以应用您的更改并激活流程。这将启动数据收集和存储过程。

1. 使用 InfluxDB 数据资源管理器查询和可视化您的数据。此工具允许您验证数据存储是否正确，并创建时间序列数据的初始可视化效果。

   在 Data Explorer 中，您应该能够看到随时间推移记录的风速测量结果，从而确认从数据生成到本地存储的整个管道是否正常运行。

   有关更多信息，请参阅[中的在数据资源管理器中查询*InfluxData Documentation*](https://docs.influxdata.com/influxdb/v2/query-data/execute-queries/data-explorer/)。

部署了数据发布流程和数据保留流程后，您现在拥有了一个完整的系统，可以将数据发送到 AWS IoT SiteWise 云端，同时维护本地副本以实现即时访问和弹性。这种双路径方法可确保您从基于云的分析和存储中受益，同时保持边缘的运营可见性。

# 为 Edge 设置 Gra SiteWise fana
<a name="windows-grafana"></a>

 Grafana® 允许您为工业数据创建本地实时监控仪表板。通过可视化存储在InfluxDB® 中的数据，您可以为操作员提供有关设备性能、过程效率和潜在问题的即时见解。这种边缘可见性对于时间敏感型运营和在网络中断期间保持连续性非常重要。

## 配置数据来源
<a name="windows-grafana-data-source-config"></a>

将 Grafana 连接到您的 InfluxDB 数据库可为您的工业数据创建强大的可视化层。这种连接支持实时监控仪表板，操作员可以使用这些仪表板做出明智的决策，而无需依赖云。

1. 在浏览器中导航到 http://127.0.0.1:3000，即可在本地访问你的 Grafana 实例[。](http://127.0.0.1:3000)*如果需要启用 TLS，您可以参考文档中的[设置 Grafana HTTPS 以实现安全的网络](https://grafana.com/docs/grafana/latest/setup-grafana/set-up-https/)流量。Grafana Labs*

1. 添加一个 InfluxDB 数据源，该数据源指向 Node-RED 写入数据的 InfluxDB 时间序列存储桶。例如 `WindFarmData`。此连接在您存储的数据和可视化平台之间建立了链接。

1. *有关详细说明，请参阅文档[中的配置 InfluxDB 数据源](https://grafana.com/docs/grafana/latest/datasources/influxdb/configure-influxdb-data-source/)。Grafana Labs*

### 为边缘数据创建 Grafana 控制面板 SiteWise
<a name="windows-grafana-create-dashboard"></a>

创建仪表板是构建本地监控解决方案的最后一步。仪表板可直观地呈现您的工业数据，使您可以更轻松地一目了然地识别趋势、异常和潜在问题。
+ 按照指南创建仪表板。有关更多信息，请参阅*Grafana Labs文档*中的[创建您的第一个仪表板](https://grafana.com/docs/grafana/latest/getting-started/build-first-dashboard/)。此模板假设您的存储桶已命名`WindFarmData`，测量值为`TurbineData`。

  您还可以使用快速入门指南，通过导入提供的示例仪表板模板来快速创建带有时间序列图的仪表板，该仪表板包含上一节中 Node-RED 生成的数据的时间序列图。此模板提供了一个起点，您可以对其进行自定义以满足您的特定监控需求。

  ```
  {
    "__inputs": [
      {
        "name": "DS_WINDFARM-DEMO",
        "label": "windfarm-demo",
        "description": "",
        "type": "datasource",
        "pluginId": "influxdb",
        "pluginName": "InfluxDB"
      }
    ],
    "__elements": {},
    "__requires": [
      {
        "type": "grafana",
        "id": "grafana",
        "name": "Grafana",
        "version": "11.6.0-pre"
      },
      {
        "type": "datasource",
        "id": "influxdb",
        "name": "InfluxDB",
        "version": "1.0.0"
      },
      {
        "type": "panel",
        "id": "timeseries",
        "name": "Time series",
        "version": ""
      }
    ],
    "annotations": {
      "list": [
        {
          "builtIn": 1,
          "datasource": {
            "type": "grafana",
            "uid": "-- Grafana --"
          },
          "enable": true,
          "hide": true,
          "iconColor": "rgba(0, 211, 255, 1)",
          "name": "Annotations & Alerts",
          "type": "dashboard"
        }
      ]
    },
    "editable": true,
    "fiscalYearStartMonth": 0,
    "graphTooltip": 0,
    "id": null,
    "links": [],
    "panels": [
      {
        "datasource": {
          "type": "influxdb",
          "uid": "${DS_WINDFARM-DEMO}"
        },
        "fieldConfig": {
          "defaults": {
            "color": {
              "mode": "palette-classic"
            },
            "custom": {
              "axisBorderShow": false,
              "axisCenteredZero": false,
              "axisColorMode": "text",
              "axisLabel": "",
              "axisPlacement": "auto",
              "barAlignment": 0,
              "barWidthFactor": 0.6,
              "drawStyle": "line",
              "fillOpacity": 0,
              "gradientMode": "none",
              "hideFrom": {
                "legend": false,
                "tooltip": false,
                "viz": false
              },
              "insertNulls": false,
              "lineInterpolation": "linear",
              "lineWidth": 1,
              "pointSize": 5,
              "scaleDistribution": {
                "type": "linear"
              },
              "showPoints": "auto",
              "spanNulls": false,
              "stacking": {
                "group": "A",
                "mode": "none"
              },
              "thresholdsStyle": {
                "mode": "off"
              }
            },
            "mappings": [],
            "thresholds": {
              "mode": "absolute",
              "steps": [
                {
                  "color": "green"
                },
                {
                  "color": "red",
                  "value": 80
                }
              ]
            }
          },
          "overrides": []
        },
        "gridPos": {
          "h": 8,
          "w": 12,
          "x": 0,
          "y": 0
        },
        "id": 1,
        "options": {
          "legend": {
            "calcs": [],
            "displayMode": "list",
            "placement": "bottom",
            "showLegend": true
          },
          "tooltip": {
            "hideZeros": false,
            "mode": "single",
            "sort": "none"
          }
        },
        "pluginVersion": "11.6.0-pre",
        "targets": [
          {
            "datasource": {
              "type": "influxdb",
              "uid": "${DS_WINDFARM-DEMO}"
            },
            "query": "from(bucket: \"WindFarmData\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r[\"_measurement\"] == \"TurbineData\")\n  |> filter(fn: (r) => r[\"_field\"] == \"value\")\n  |> filter(fn: (r) => r[\"name\"] == \"/Renton/WindFarm/Turbine/WindSpeed\")\n  |> filter(fn: (r) => r[\"quality\"] == \"GOOD\")\n  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n  |> yield(name: \"mean\")",
            "refId": "A"
          }
        ],
        "title": "Panel Title",
        "type": "timeseries"
      }
    ],
    "schemaVersion": 41,
    "tags": [],
    "templating": {
      "list": []
    },
    "time": {
      "from": "now-6h",
      "to": "now"
    },
    "timepicker": {},
    "timezone": "browser",
    "title": "demo dashboard",
    "uid": "fejc0t08o6d4wb",
    "version": 1,
    "weekStart": ""
  }
  ```