---
html:
toc: true
offline: true
export_on_save:
html: true
---
# EdgeX 연동을 통한 장치 제어하기
---
EdgeX로부터 센싱 데이터를 수집하고, 이를 전처리한 후, 규칙 기반으로 장치를 제어하는 예제를 소개합니다.
## EdgeX 연동 환경
아래 그림과 같이, EdgeX에는 온도 센서 장치와 스마트 전구가 등록되어 있습니다.
EdgeX에 등록된 온도 센서 장치로부터 온도 센서 데이터를 수집한 후, 온도 값에 따라 스마트 전구를 제어하는 메시지를 EdgeX로 전송하는 워크플로우를 작성해보도록 하겠습니다.
![EdgeX 연동 환경](images/2.5.15_1_01.png)
### 온도 센서 데이터
EdgeX로부터 수신하는 센싱 데이터 메시지는 다음과 같습니다.
```json
{
"pushed": 0,
"device": "dht22-virtual",
"readings": [
{
"pushed": 0,
"name": "temperature",
"value": "22",
"device": "dht22-virtual",
"id": "5b6a81b9e4b0e3fa2f07d372",
"created": 1533706681767,
"modified": 1533706681767,
"origin": 0
},
{
"pushed": 0,
"name": "packetcount",
"value": 22,
"device": "dht22-virtual",
"id": "5b6a81b9e4b0e3fa2f07d373",
"created": 1533706681832,
"modified": 1533706681832,
"origin": 0
}
],
"id": "5b6a81b9e4b0e3fa2f07d374",
"created": 1533706681841,
"modified": 1533706681841,
"origin": 0
}
```
### 스마트 전구 제어 메시지
EdgeX로 전송할 스마트 전구 제어 메시지는 다음과 같습니다.
```json
{
"id": "2",
"state": {
"on": true,
"hue": 21845
}
}
```
## 워크플로우 생성하기
워크플로우 편집기를 이용하여, 다음의 절차에 따라 워크플로우를 생성합니다.
### 엔진 선택
본 예제는 EdgeX로부터 발생되는 센서 스트림 데이터를 처리하므로, StreamToStream 엔진을 선택합니다.
### Reader
HttpServerReader를 선택하고, 아래 표와 같이 속성을 설정합니다.
field |value | 설명
--|---|--
port | 57071 | EdgeX로부터 HTTP 스트림 데이터를 수신할 서버의 포트번호를 입력합니다.
### Writer
HttpClientWriter를 선택하고, 아래 표와 같이 속성을 설정합니다.
field | value | 설명
--|---|--
url | http://{EdgeX-IP}:{EdgeX-Port}}/api/v1/device/5b8756529f8fc2000183fe08/
command/5b8752139f8fc2000183fded | 스마트 전구 제어 메시지를 전달할 URL
method | PUT | HTTP Method 유형
SrcColumnName | hueCommand | 스마트 전구 제어 메시지를 담고 있는 컬럼의 이름
headr | 아래 표 참고 | HTTP header 설정
header 속성을 아래 표와 같이 설정합니다.
field | value | 설명
--|---|--
key | Content-Type | HTTP Content-Type header 이름
value | application/json | 스마트 전구 제어 메시지의 타입
#### Controller
SparkStreamController를 선택하고, 아래 표와 같이 속성을 설정합니다.
field | value | 설명
--|---|--
operationPeriod | 1 | 스트림 데이터를 처리하는 주기 (초 단위)
#### Runner
SimpleSparkRunner를 선택하고, 아래 표와 같이 속성을 설정합니다.
field | value | 설명
--|---|--
inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달
sparkArgs | 아래 표 참고 | Spark Application 설정
sparkArgs 설정은 다음과 같이 합니다.
field | value | 설명
--|---|--
master | local[\*] | 마스터
numExecutors | 4 | Spark Executor 개수
excuterCores | 2 | 각 Spark Executor의 core 개수
executerMemory | 1g | 각 Spark Executor의 메모리 크기
driverMemory | 1g | Spark Driver 메모리
#### Operator
아래의 5개의 Operator를 이용하여, 스트림 데이터를 처리하여 스마트 전구를 제어할 메시지를 생성합니다.
1. **ExplodeColumnOperator**
온도 센서 메시지를 추출하기 위해, Array 타입의 "readings" 컬럼의 각 요소를 row로 변환합니다.
field | value | 설명
--|---|--
srcColumnName | readings | 온도 센서 메시지를 포함하는 컬럼의 이름
2. **SplitColumnOperator**
온도 센서 값을 추출하기 위해, Array 타입의 "readings" 컬럼을 분해합니다.
field | value | 설명
--|---|--
srcColumnName | readings | 온도 센서 값을 포함하는 컬럼의 이름
3. **FilterOperator**
온도 센서 값을 제외한 나머지 데이터를 제거합니다.
field | value | 설명
--|---|--
colName | name | 컬럼명
condition | EXIST | 필터 조건
pattern | temperature | 온도 센서 키 값
4. **ChangeColumnDataTypeOperator**
string 타입의 온도 센서 컬럼을 double 타입을로 변환합니다.
field | value | 설명
--|---|--
columnName | value | 변환할 컬럼의 이름
dataType | DOUBLE | 변환할 데이터 타입
5. **AddConditionalColumnOperator**
온도 센서 값에 따라 스마트 전구 제어 메시지에 대한 규칙을 설정합니다.
field | value | 설명
--|---|--
newColumnName | hueCommand | 스마트 전구 제어 메시지 컬럼의 이름
rules | 아래 표 참고 | 스마트 전구 제어 규칙 설정
rules 설정은 아래와 같이, 3가지 규칙을 입력합니다.
rule | field | value | 설명
--|--|---|--
1 | condition | name = 'temperature' and value >= 30 | 첫번째 규칙의 조건
1 | value | {"id":"2","state":{"on":true,"hue":65535}} | 첫번째 규칙을 만족하는 경우의 스마트 전구 제어 메시지
2 | condition | name = 'temperature' and (value > 15 and value < 30) | 두번째 규칙의 조건
2 | value | {"id":"2","state":{"on":true,"hue":21845}} | 두번째 규칙을 만족하는 경우의 스마트 전구 제어 메시지
3 | condition | name = 'temperature' and value <= 15 | 세번째 규칙의 조건
3 | value | {"id":"2","state":{"on":true,"hue":43690}} | 세번째 규칙을 만족하는 경우의 스마트 전구 제어 메시지
![스마트 전구 제어 규칙](images/2.5.15_2_01.png)
완성된 워크플로우는 다음과 같습니다.
![워크플로우 완성 화면](images/2.5.15_2_02.png)
웹툴킷에 ksbuser@etri.re.kr 계정으로 로그인하면, 본 예제 워크플로우가 이미 만들어져 있는 것을 확인할 수 있습니다.
워크플로우 편집기의 불러오기 메뉴를 통해 본 예제를 실행할 수 있습니다.
## 워크플로우 실행 및 모니터링하기
### 워크플로우 실행하기
워크플로우 편집기 화면 상단의 실행 버튼을 클릭하여, 위에서 작성한 워크플로우를 실행합니다.
본 예제는 스트림 타입의 엔진이므로, Batch 체크박스를 해제하고 Run 버튼을 클릭합니다.
![워크플로우 실행](images/2.5.15_3_01.png)
### 워크플로우 모니터링 하기
#### 워크플로우 상태 확인
웹툴킷 [Monitoring] 화면에서 [Workflow] 탭을 선택하여, 위에서 실행한 워크플로우와 엔진의 동작 상태를 확인할 수 있습니다.
정상적으로 실행되어 Status 값이 Inprogress인 것을 확인할 수 있습니다.
![워크플로우 동작 상태 확인](images/2.5.15_3_02.png)
#### 워크플로우 로그 보기
[Workflow History] 탭을 선택하여, 현재 동작 중인 워크플로우의 로그 정보를 확인할 수 있습니다.
![워크플로우 히스토리](images/2.5.15_3_03.png)
## 결과 확인하기
위에서 작성한 워크플로우를 테스트하기 위해, Postman을 이용하여 온도 센서 데이터를 전송하고 워크플로우 로그 정보를 통해 스마트 전구 제어 메시지가 EdgeX로 전송되는지를 확인하도록 하겠습니다.
1. Postman 프로그램을 이용하여, EdgeX로부터 발생하는 온도 센서 메시지를 전송합니다.
![결과 확인](images/2.5.15_4_01.png)
2. 위에서 설정한 규칙에 따라, 스마트 전구 제어 메시지를 EdgeX로 전송하는지를 로그 정보를 통해 확인합니다.
![결과 확인](images/2.5.15_4_02.png)
## 워크플로우 종료하기
웹툴킷 [Monitoring] 화면의 [Workflow] 탭에서, 현재 Status가 Inprogress인 EdgexDemoSimpleHue 워크플로우의 정지(◼) 버튼을 클릭하여 종료시킵니다.
## 워크플로우 저장하기
워크플로우 편집기에서 작성한 워크플로우를 "Save Workflow" 메뉴를 이용하여 저장합니다.