

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 수동으로 오픈 소스 통합 설정(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 게이트웨이를 설치합니다. 자세한 내용은 [AWS IoT SiteWise Edge용 MQTT 지원 V3 게이트웨이](mqtt-enabled-v3-gateway.md) 단원을 참조하십시오.
+ 로컬에서 이러한 서비스를 설치하고 실행합니다.
  + InfluxDB OSS v2. 설치 단계는 [ InfluxDB 설치를](https://docs.influxdata.com/influxdb/v2/install/) 참조하세요.
  + 노드-빨간색. 설치 단계는 [로컬에 노드-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. 사전 조건 단계를 완료하고 모든 도구가 동일한 호스트에서 실행되고 있는지 확인한 후 웹 브라우저를 열고 [http://127.0.0.1:8086](http://127.0.0.1:8086) 이동합니다.

1. (선택 사항) 보안 강화를 위해 TLS 암호화를 활성화합니다. 자세한 내용은의 [TLS 암호화 활성화](https://docs.influxdata.com/influxdb/v2/admin/security/enable-tls/)를 참조하세요*InfluxData Documentation*.

1. Node-RED의 데이터를 저장할 시계열 InfluxDB 버킷을 생성합니다. 버킷은 풍력 발전소 데이터의 전용 컨테이너 역할을 하므로이 데이터 세트와 관련된 보존 정책을 구성하고 관리할 수 있습니다. 자세한 내용은의 [버킷 관리를 참조하세요](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와 같은 다른 구성 요소 간의 보안 통신이 가능합니다. 이렇게 하면 승인된 서비스만 데이터 스토어에서 읽거나 쓸 수 있습니다. 자세한 내용은의 [토큰 생성을](https://docs.influxdata.com/influxdb/cloud/admin/tokens/create-token/) 참조하세요*InfluxData Documentation*.

이 단계를 완료한 후 InfluxDB 인스턴스에 시계열 데이터를 저장하여 엣지 환경에서 로컬 데이터 지속성 및 분석을 위한 기반을 제공할 수 있습니다.

# AWS IoT SiteWise 데이터 통합을 위한 노드-RED 흐름 구성
<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** - SiteWise Edge 게이트웨이와의 호환성을 보장하기 위해 데이터를 AWS IoT SiteWise 형식으로 변환합니다.
+ **MQTT 게시자** - SiteWise Edge MQTT 브로커에 데이터를 게시하여 로컬 소비자와 클라우드 소비자가 모두 사용할 수 있도록 합니다.

![\[Node-RED 데이터 게시 흐름을 보여주는 다이어그램입니다. SiteWise Edge Gateway에서 픽업할 수 있도록 시뮬레이션된 디바이스 데이터를 SiteWise Edge MQTT 브로커로 전송한 다음 클라우드로 AWS IoT SiteWise 전송합니다.\]](http://docs.aws.amazon.com/ko_kr/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 주입 노드에 대한 자세한 내용은 *Node-RED 설명서*의 [주입](https://nodered.org/docs/user-guide/nodes#inject) 섹션을 참조하세요.

터빈 시뮬레이터는이 표준화된 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>

SiteWise Edge 게이트웨이는 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",
  }]
}
```

**참고**  
를 MQTT 주제 계층 구조(예: `/Renton/WindFarm/Turbine/WindSpeed`)`propertyAlias`와 일치시킵니다. 이렇게 하면 데이터가의 올바른 자산 속성과 올바르게 연결됩니다 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 브로커에 데이터를 게시할 준비가 되었습니다.

SiteWise Edge MQTT 브로커로 데이터를 전송하도록 다음 설정으로 MQTT 게시자를 구성합니다.

**MQTT 출력 노드를 가져오려면**

1. 를 사용하여 MQTT 출력 구성 노드를 가져옵니다`"type": "mqtt out"`. 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 연결을 생성합니다.
+ 서버: `127.0.0.1`
+ 포트: `1883`
+ 프로토콜: `MQTT V5`

그런 다음 MQTT 출력 노드는 다음 정보로 메시지 라우팅을 구성합니다.
+ 주제: `/Renton/WindFarm/Turbine/WindSpeed`
+ QoS: `1`

## 노드 배포 및 확인
<a name="windows-verify-deployment"></a>

세 개의 데이터 게시 흐름 노드를 구성한 후 다음 단계에 따라 흐름을 배포하고 데이터가 로 올바르게 전송되고 있는지 확인합니다. AWS IoT SiteWise

**연결을 배포하고 확인하려면**

1. 데이터 게시 흐름에 표시된 대로 노드 3개를 연결합니다.  
![\[Data publish flow diagram showing input from turbine simulator to AWS IoT SiteWise to MQTT broker.\]](http://docs.aws.amazon.com/ko_kr/iot-sitewise/latest/userguide/images/gateway-open-source-nodered-publish-flow.png)

1. **배포**를 선택하여 모든 노드 연결 변경 사항을 적용합니다.

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/ko_kr/iot-sitewise/latest/userguide/images/gateway-open-source-nodered-data-retention.png)


## MQTT 구독 클라이언트 설정
<a name="windows-nodered-mqtt-subscriber"></a>
+ 아래 예제를 가져 AWS IoT SiteWise 와서에서 MQTT EMQX 브로커로부터 데이터를 수신하도록 Node-RED로 MQTT 구독 클라이언트를 구성합니다.  
**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`
+ QoS - `1`

자세한 내용은 *Node-RED 설명서*의 [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) 사용하여 데이터를 구성합니다. 이 조직은 시계열 데이터의 쿼리 성능과 스토리지 효율성을 최적화합니다. JavaScript 코드가 포함된 예제 함수 노드를 가져와 AWS IoT SiteWise 페이로드를 InfluxDB 형식으로 변환합니다. 변환기는 속성을 두 그룹으로 분할합니다.
+ 태그 - 효율적인 인덱싱을 위한 품질 및 이름 속성
+ 필드 - 타임스탬프(에포크 이후 밀리초) 및 값

**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)를 참조하세요. GitHub 

## 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으로 설정 - 이전 버전과 다른 API를 사용하는 InfluxDB v2.x에 연결하도록 지정합니다.

   1. URL을 로 설정 `http://127.0.0.1:8086` - 로컬 InfluxDB 인스턴스를 가리킵니다.

   1. InfluxDB 인증 토큰을 입력합니다. 이 보안 토큰은 데이터베이스에 대한 연결을 승인합니다. [InfluxDB를 사용하여 로컬 스토리지 설정](windows-influxdb-setup.md) 절차 중에 토큰을 생성했습니다.

1. 스토리지 위치 파라미터를 지정하여 데이터가 저장되는 위치와 방법을 정의합니다.

   1. InfluxDB 조직 이름 입력 - 조직은 버킷과 대시보드가 속한 사용자 그룹을 위한 워크스페이스입니다. 자세한 내용은의 [조직 관리를](https://docs.influxdata.com/influxdb/v2/admin/organizations/) 참조하세요*InfluxData Documentation*.

   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. 데이터 보존 흐름도에 표시된 대로 노드 3개를 연결합니다. 이렇게 하면 로컬 스토리지에 대한 데이터 구독에서 전체 파이프라인이 생성됩니다.  
![\[Node-RED 데이터 보존 흐름\]](http://docs.aws.amazon.com/ko_kr/iot-sitewise/latest/userguide/images/gateway-open-source-nodered-data-retention.png)

1. **배포**를 선택하여 변경 사항을 적용하고 흐름을 활성화합니다. 그러면 데이터 수집 및 스토리지 프로세스가 시작됩니다.

1. InfluxDB Data Explorer를 사용하여 데이터를 쿼리하고 시각화합니다. 이 도구를 사용하면 데이터가 올바르게 저장되고 있는지 확인하고 시계열 데이터의 초기 시각화를 생성할 수 있습니다.

   Data Explorer에서는 시간 경과에 따라 풍속 측정값이 기록되는 것을 확인하여 데이터 생성부터 로컬 스토리지까지 전체 파이프라인이 올바르게 작동하는지 확인할 수 있습니다.

   자세한 내용은 [의 Data Explorer에서 쿼리](https://docs.influxdata.com/influxdb/v2/query-data/execute-queries/data-explorer/)를 참조하세요*InfluxData Documentation*.

이제 데이터 게시 흐름과 데이터 보존 흐름이 모두 배포되면 즉각적인 액세스와 복원력을 위해 로컬 복사본을 유지하면서 AWS IoT SiteWise 클라우드로 데이터를 전송하는 완전한 시스템을 갖게 됩니다. 이 이중 경로 접근 방식을 사용하면 클라우드 기반 분석 및 스토리지의 이점을 얻는 동시에 엣지에서 운영 가시성을 유지할 수 있습니다.

# SiteWise Edge용 Grafana 설정
<a name="windows-grafana"></a>

 Grafana®를 사용하면 산업 데이터에 대한 로컬 실시간 모니터링 대시보드를 생성할 수 있습니다. InfluxDB®에 저장된 데이터를 시각화하면 운영자에게 장비 성능, 프로세스 효율성 및 잠재적 문제에 대한 즉각적인 인사이트를 제공할 수 있습니다. 엣지에서의 이러한 가시성은 시간에 민감한 운영과 네트워크 중단 시 연속성 유지에 중요합니다.

## 데이터 소스 구성
<a name="windows-grafana-data-source-config"></a>

Grafana를 InfluxDB 데이터베이스에 연결하면 산업 데이터를 위한 강력한 시각화 계층이 생성됩니다. 이 연결을 통해 운영자가 클라우드 종속성 없이 정보에 입각한 결정을 내리는 데 사용할 수 있는 실시간 모니터링 대시보드를 사용할 수 있습니다.

1. 브라우저에서 [http://127.0.0.1:3000](http://127.0.0.1:3000) 이동하여 Grafana 인스턴스에 로컬로 액세스합니다. TLS 활성화가 필요한 경우 *Grafana Labs 설명서*의 [안전한 웹 트래픽을 위한 Grafana HTTPS 설정을](https://grafana.com/docs/grafana/latest/setup-grafana/set-up-https/) 참조할 수 있습니다.

1. Node-RED가 데이터를 쓰는 InfluxDB 시계열 버킷을 가리키는 InfluxDB 데이터 소스를 추가합니다. 예를 들어 `WindFarmData`입니다. 이 연결은 저장된 데이터와 시각화 플랫폼 간의 링크를 설정합니다.

1. 자세한 지침은 *Grafana Labs 설명서*[의 InfluxDB 데이터 소스 구성을](https://grafana.com/docs/grafana/latest/datasources/influxdb/configure-influxdb-data-source/) 참조하세요.

### SiteWise Edge 데이터에 대한 Grafana 대시보드 생성
<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": ""
  }
  ```