Aug 18, 2014

[IBM IoT Foundation Bootcamp @Korea] 6. Node-RED Flow Design

[Hands-on Lab]
Bluemix 상에서 Node-RED UI를 구동하고 Node-RED를 활용하여 Galileo 보드에서 수집하여 보내는 CPU 온도 값만 추출하여 출력하는 flow를 만들어 보자.

Step 1. "2. Device Recipe"에서 실습한 과정을 반복하여 Galileo 보드가 IoT Cloud에 접속하고 CPU 온도 측정값을 송신하게 한다.

Step 2. "4. IBM PaaS -- Bluemix"에서 실습한 과정을 반복하여 IoT application이 정상적으로 running하게 한다.

Step 3. 아래 예시처럼 dashboard에서 "Routes:" 이후에 있는 hyperlink를 클릭하거나 web browser의 주소창에 직접 <app-name>.mybluemix.net을 입력한다.

Step 4. Node-RED의 welcome page에서 "Go to your Node-RED flow editor" 버튼을 클릭하여 바로 flow editor 화면으로 이동한다.
Welcome Page
Flow Editor
Step 5. Node-RED의 flow editor 화면에서 가장 먼저 작업할 것은 Galileo 보드에서 보내는 데이터를 수신할 수 있는 인스턴스를 하나 생성해 보는 것이다. 아래 예시의 순서를 따라 작업해보도록 하자.
1) "inputs" 카테고리에서 mqtt 수신 노드를 선택하여 Sheet로 drag-and-drop
2) mqtt 수신 노드를 더블클릭하면 아래 그림과 같이 속성 편집 팝업이 뜨는데 여기에서 해당 topic을 입력하고 -- topic 설정 방법은 "3. MQTT Based Messaging" 참조 -- broker 연결 설정 정보 편집을 위해 버튼을 실행
Topic  설정
3) MQTT Broker 연결을 위한 설정 정보까지 입력하고 우측 상단 Deploy 버튼 실행
  • Broker - <org-id>.messaging.internetofthings.ibmcloud.com
  • Port - 1883
  • Client ID - a:<org-id>:<device-id>
  • Username - API Key의 key 파트
  • Password - API Key의 auth-token 파트
Broker 설정
4)  선택된 mqtt 수신 노드의 상태를 확인하기 위하여 "Node Status" 클릭
Node Status 확인 활성화
5) IoT Cloud에 연결 상태 정보 확인 (green: connected)
Connected 상태 확인

Step 6. mqtt 수신 노드의 output은 JSON String 형태이므로 JSON Object로 변경해 주어야 논리적 조작이 가능하다. 이를 위하여 mqtt 수신 노드에 json 변환 노드를 연결하도록 하자.


Step 7. 이제 JSON Object 형태로 데이터가 변환되었으니 CPU 온도값에 액세스하여 그 값만 추출할 수 있게 되었다. 이러한 논리적인 조작은 function 노드를 이용하여 가능하다. 아래 예시를 참조하여 구현해 보자.


Step 8. 마지막으로 값을 출력하기 위하여 debug 노드를 이용한다. 디버그 데이터 출력은 Node-RED flow editor에 있는 debug 탭과 server console 상에 가능하며 여기서는 debug 탭만 선택하여 출력해 보기로 한다.

Deploy 버튼을 실행하면 debug 탭에 CPU 온도 값만 출력되는 것을 확인할 수 있을 것이다.


[Hands-on Lab]
Galileo 보드가 주기적으로 수집하여 보내는 CPU 온도가 특정 값이하이면 송신중단 명령 처리를 하는 Node-RED flow를 구현해 보자.
Step 1. 앞의 Hands-on Lab에서 작성한 flow에서 mqtt 수신 노드와 json 변환 노드는 재사용하되 mqtt 수신 노드의 Client ID만 아래와 같이 변경한다.
  • Client ID - a:<org-id>:<device-id>:evt
  • 위와 같이 변경하는 이유는 동일한 MQTT broker에 mqtt 수신 노드와 송신 노드를 모두 연결하여 양방향 메시징이 되게 하려면 각 노드의 Client ID를 다르게 하여 식별 가능하게 해야 하기 때문이다. 



Step 2. 이제 특정 온도이하이면 상태정보 전송을 중단하라는 명령 메시지를 만드는 기능을 구현해 보자. 여기서는 CPU 온도가 67도이하이면 상태보고를 중단하도록 하였다. "3. MQTT Based Messaging"에서 같이 살펴 보았듯이 Galileo에서 command를 수신하면 payload에 포함된 JSON 객체에 "send-status" 프로퍼티가 포함되어 있는지 확인하여 그 값이 true일 경우는 상태정보를 보내고 false일 때는 상태 정보 송신을 중단하도록 구현되어 있다. 이에 착안하여 CPU 온도가 67도 이하임을 detect하면 바로 "send-status" 프로퍼티를 false로 설정한 메시지를 다음 단계로 넘기는 로직을 작성한다.


Step 3. 앞 단계에서 작성한 function 노드의 output은 2개로 설정하였고 그 중 하나는 debug 탭에 Galileo로부터 수신한 데이터를 출력하게 한다.

Step 4. 나머지 하나의 output은 mqtt 송신 노드에 연결하여 해당 온도 조건을 만족하면 Galileo로 MQTT publish하게 한다. Step 1에서 강조하였듯이 Client ID를 mqtt 수신 노드와 다르게 설정하여함에 유의한다. 나머지는 mqtt 수신 노드와 동일하게 설정한다.
  • Client ID - a:<org-id>:<device-id>:cmd



Step 5. Command 송신을 위한 topic을 다음과 같이 설정한다.
  • iot-2/type/<type-id>/id/<device-id>/cmd/<cmd-id>/fmt/json


Step 6. 완성된 flow는 아래 그림과 같으며, Deploy를 실행한다. 성공적으로 deploy되고 나면 설정에서 "Node Status"를 체크하여 mqtt 수신/송신 노드의 connection 상태를 확인한다.
Deploy 이전
Deploy 완료 후 Node Status 체크

Step 7. 터미널 상에서 SSH로 Galileo에 접속하여 ibm-iot-quickstart를 실행시킨다. Console log 정보를 보면 CPU 온도가 71도에서 시작하였는데 팬을 이용하여 강제로 CPU 외부 온도를 낮추어 주었고 이로 인하여 CPU 온도가 점차 내려갔음을 확인할 수 있다. CPU 온도가 66도가 된 순간 IoT Cloud로부터 stop command를 수신하였고 Galileo가 해당 command를 정상적으로 수행함으로써 주기적으로(1초 단위로 주기 설정) 송신하던 것을 중단하였음을 확인할 수 있다.


Step 8. Node-RED 상의 debug 탭 결과도 확인해보니 66도로 온도가 낮추어진 이후에 MQTT 메시지 수신도 중단되었음을 확인할 수 있다.

No comments:

Post a Comment