2019년 5월 23일 목요일

IoT 커넥션 오픈소스 NODE-RED 사용법 - node-red + NodeMCU + MQTT

이 글은 IoT 장치들간 연결에 사용되는 오픈소스인 노드레드(NODE-RED)를 사용하는 방법을 간단히 나눔한다. 이 글은 IoT 구현을 위해 노드레드, NodeMCU를 사용한다.

노드레드는 IBM에서 IoT 시스템 개발 지원하는 오픈소스 플랫폼이다. 노드레드를 이용하면, 코딩할 필요없이 다양한 IoT 프로토콜, 입출력 연결을 손쉽게 처리할 수 있다. 노드레드는 아파치 라이센스 2.0을 지원하기 때문에 라이센스 규약만 지키면 상용 패키지를 개발하는 데 큰 문제가 없다.

이 글은 노드레드를 이용해 다음과 같이 IoT 장치와 MQTT방식으로 데이터 교환을 하는 간단한 IoT 시작품 만드는 방법을 보여준다.
노드레드로 만든 간단한 IoT 데쉬보드 테스트
nodered.org 소개

노드레드 설치
설치는 간단하다.

1. Node.js 설치
노드 레드는 노드JS를 사용한다. 우선 아래 링크에서 Node.js LTS 버전을 다운로드 받아 설치한다.

2. Node.js 명령 콘솔 실행 및 버전 확인
다음과 같이 설치된 메뉴 중에 command prompt 메뉴를 실행한다.
실행 후, 다음 명령어로 노드JS 설치 버전을 확인한다.
node --version; npm --version

3. node-red 및 데쉬보드 설치
다음 명령어로 node-red와 데쉬보드를 설치한다. 참고로, node-red는 데쉬보드와 같이 다양한 추가 플러그인을 지원한다.
npm install -g node-red
npm i node-red-dashboard

4. node-red 실행
다음 명령으로 node-red를 실행한다. 만약, network security error (PPSecurityException)발생하면 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned 명령을 터미널에서 실행한다.
node-red

5. node-red 웹브라우저 실행
크롬을 실행한 후 http://127.0.0.1:1880/ 에 접속하면, node-red GUI를 확인할 수 있다. 

노드레드 사용
IoT 시스템 디자인
우리는 MQTT란 IoT 표준 프로토콜을 이용해, NodeMCU 에서 얻은 센서값을 노드레드에 전달해 줄 것이다. 이를 위해, MQTT 데이터를 저장하고 있어야 할 MQTT 브로커가 있어야 한다. 브로커는 http://test.mosquitto.org 란 오픈소스 서버를 사용하기로 한다. 이 서버는 공개이며 무료로 사용할 수 있다.

아울러, 노드레드에서 NodeMCU로 MQTT 데이터를 전달하는 예제도 구현할 것이다. NodeMCU에 전달할 데이터는 단순히 NodeMCU에 연결된 LED를 켜고 끄는 데 사용한다. 

참고로, 센서값과 LED ON/OFF는 노드레드에서 제공하는 데쉬보드를 이용해 GUI를 쉽게 구현할 수 있다. 

NodeMCU 회로 구성 및 코딩
1. 회로구성
다음과 같이 NodeMCU 회로를 구성한다.


   D4 PIN = LED +
   GND PIN = LED -
   GND PIN = 10K 저항 끝단
   A0 PIN = 10K 저항 반대 끝단
   A0 PIN = 조도센서 끝단
   3.3V PIN = 조도센서 반대 끝단

참고로, NodeMCU 핀번호는 다음과 같다. 

2. 코딩
컴퓨터와 NodeMCU를 USB케이블로 연결한다. 그리고, 아두이노 IDE를 실행하고, 툴>보드 메뉴에서 NodeMCU 1.0을 선택하고, 툴>포트 메뉴에서 NodeMCU와 연결된 포트를 선택한다.

다음 코드를 붙여넣고, 코드에서 WiFi ssid와 pwd를 수정한 후, NodeMCU 보드에 업로드한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* mqtt_server="test.mosquitto.org";
WiFiClient espclient;

void callback(char* topic,byte* payload,unsigned int length1){    
  Serial.print("message arrived[");
  Serial.print(topic);
  Serial.println("]");
  
  String data = "";
  for(int i=0;i<length1;i++)
    data = data + payload[i];     
  Serial.println(data);
  Serial.println(payload[0]);

  if(payload[0] == 48)      // if(data == "48")
  {
    digitalWrite(D4, LOW);  //ASCII VALUE OF '0' IS 48
    Serial.println("off");
  }
  else if(payload[0] == 49) // else if(data == "49")
  {
    digitalWrite(D4, HIGH);   //ASCII VALUE OF '1' IS 49
    Serial.println("on");
  }
}

PubSubClient client(mqtt_server,1883,callback,espclient);

void setup() {
  pinMode(D2,OUTPUT);
  Serial.begin(115200);
  Serial.print("connecting");
  WiFi.begin("ssid","pwd");         //SSID,PASSWORD 
  while(WiFi.status()!=WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  digitalWrite(LED_BUILTIN, HIGH); 
  
  reconnect();
}

void reconnect(){
  while(WiFi.status()!=WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  while(!client.connected()){
    if(client.connect("ESP8266Client123456789")){
      Serial.println("connected");
      client.subscribe("ledcontrol");
    }
    else{
      Serial.print("failed,rc=");
      Serial.println(client.state());
      delay(500);
    }
  } 
}

int now = 0;
int lastMeasure = 0;

void loop() {
  if(!client.connected()){
    reconnect();
  }
  
  client.loop();

  // Timer variable with current time
  now = millis();
  if (now - lastMeasure > 3000) {
    lastMeasure = now;
    int value = analogRead(A0);
    String data = String(value);
    client.publish("sensor/light", data.c_str());  
  }
}

노드레드 디자인
1. MQTT 노드 설정과 LED ON/OFF 버튼 생성
우선, 노드레드의 입력>mqtt 를 Drag&drop으로 생성한다. 생성된 mqtt노드를 더블클릭해, 다음과 같은 속성창에서 http://test.mosquitto.org 서버(포트 = 1883) 추가하고, 토픽명은 ledcontrol, QoS=0 으로 설정한다.

버튼을 2개 추가하고, 속성을 다음과 같이 각각 설정한다. 참고로, Group에 설정된 값은 데쉬보드에 함께 표시되는 그룹을 결정한다.
LED ON 버튼 설정

LED OFF 버튼 설정

방금 만든 MQTT와 버튼 2개를 다음과 같이 연결한다.

2. 조도센서 MQTT 노드 생성과 데이터 확인용 debug 생성
MQTT노드를 하나 더 추가하고, 아래와 같이 토픽=sensor/light 로 설정한다. 

데쉬보드에서 debug를 만들고, mqtt와 서로 연결한다.

debug의 속성은 다음과 같이 설정한다.

3. 조도센서 MQTT 노드 생성과 데이터 확인용 guage 생성
방금 만든 mqtt (sensor/light)를 복사해 붙여넣어 하나 더 만든다. 
그리고, 데쉬보드에서 다음과 같이 gauge를 만든 후 서로 연결한다.

gauge의 속성은 다음과 같이 설정한다.

이렇게까지 하면, 다음과 같이 노드레드가 구성되었을 것이다. 

데쉬보드 Layout 탭을 선택해 다음과 같이 탭, 그룹을 디자인한다. 다음과 같이 on, off, gauge를 정의한다.

4. 노드레드 설정 배포 및 데쉬보드 확인
이제 배포하기를 클릭한다. 그리고 디버그 탭을 선택한다. 다음과 같이 NodeMCU에서 MQTT로 전달받은 데이터가 로그로 출력되고 있을 것이다. 

Layout 탭의 화살표 아이콘을 클릭하면 데쉬보드가 다음과 같이 실행된다. 

ON/OFF 버튼을 클릭해 보자. 몇초후에 NodeMCU 에 연결된 LED가 동작할 것이다.

차트도 다음과 같이 추가해 mqtt와 연결해 보자. 

다시 배포한 후 데쉬보드를 확인하면, 다음과 같이 차트가 추가된 것을 확인할 수 있다.
노드레드 데쉬보드 결과

만약 좀 더 좋은 사용자 인터페이스가 필요하다면 그라파나(grafana)를 사용할 수도 있다. 참고로, 그라파나는 코딩하지 않고 데이터 소스를 연결해 시각화하는 모니터링 도구로 아파치 라이센스 2.0을 준수하고 있다.

마무리
앞에서 IoT 데이터를 NodeMCU로 부터 MQTT 프로토콜로 받아 데쉬보드로 확인하는 것까지 해 보았다. 노드레드로 하지 않았다면, MQTT 코딩부터 데쉬보드 구현까지 많은 시간이 걸렸을 것이다. 이 과정은 코딩이 불필요하며, 익숙해 지면 몇십분만에 끝낼 수 있다.

노드레드는 오픈소스로 자기 컴퓨터를 서버로 운영하여 데이터를 저장할 수 있으고, 메일, 트위터, MQTT 등 다양한 입출력 유형을 제공하여 가성비가 매우 좋다. 데쉬보드는 N-screen을 지원하여, 크롬, 스마트폰 등을 모두 지원한다.

레퍼런스

댓글 없음:

댓글 쓰기