2. 개요
노드-레드(Node-RED)는 웹 페이지에서 쉽고 간단한 설정을 통해서 디바이스 또는 센서를 연결할 수 있게 하며, 필요한
프로토콜을 통해 외부로 데이터를 오픈할 수 있습니다.
https://nodered.org/
“노드-레드(Node-RED)는 하드웨어 장치, API 및 온라인 서비스를 새롭고 흥미로운 방식으로 연결하기 위한 프로그래밍
도구입니다.
노드-레드(Node-RED)는 브라우저 기반 편집기를 제공하며, 팔레트에 있는 다양한 노드를 연결하여 flow를 작성하여 클릭 한
번으로 런타임에 배치할 수 있습니다. “
https://ko.wikipedia.org/wiki/Node-RED
“Node-RED(노드 레드)는 하드웨어 장치들, API, 온라인 서비스를 사물인터넷의 일부로 와이어링(배선화)시키기 위해 본래 IBM이
개발한 시각 프로그래밍을 위한 플로 기반 개발 도구이다.
Node-RED는 브라우저 기반 플로 편집기를 제공하므로 자바스크립트 함수를 개발하는데 사용할 수 있다. 애플리케이션의
요소들은 재사용을 위해 저장하거나 공유할 수 있다. 런타임은 Node.js 위에서 개발되어 있다. Node-RED에서 만든 플로는
JSON을 사용하여 저장된다. 버전 0.14 이후 MQTT 노드들은 적절하게 구성된 TLS 연결을 만들 수 있다.
2016년에 IBM은 Node-RED를 오픈 소스 ‘JS Foundation’ 프로젝트로 기여했다.”
http://www.steves-internet-guide.com/node-red-overview/
“노드-레드(Node-RED)는 IBM이 개발하고 node.js로 작성된 오픈 소스 플로우 기반 툴이며 IOT 플랫폼 으로서 대시보드도
제공합니다.”
*
3. 목표
• Node-RED의 인스톨
• MQTT over WebSocket을 위한 RabbitMQ의 인스톨 및 RabbitMQ의 MQTT 플러그인의 인스톨
• Node-RED에서 Modbus 서버의 설정
• Node-RED에서 Modbus 데이터 읽기
• Node-RED에서 Modbus 데이터 쓰기
• 취득한 Modbus 데이터를 웹 페이지에서 표시
• Node-RED에서 취득한 Modbus 데이터를 REST API를 접근하도록 설정
• Node-RED에서 Modbus 데이터를 REST API를 통해 제어하도록 설정
이 문서를 통해서 다음과 같은 것을 이해할 수 있습니다:
*
4. Node-RED 인스톨
https://nodered.org/
Node.js가 인스톨된 상태에서 윈도우 환경에서 이하의 명령을 실행합니다. (http://127.0.0.1:1880/으로 실행됨)
*
> npm install -g --unsafe-perm node-red
… 인스톨이 완료 되면 이하의 명령으로 node-red를 실행합니다.
> node-red
… 이하와 같은 메시지가 표시됩니다.
6 Feb 17:31:56 - [info]
Welcome to Node-RED
===================
6 Feb 17:31:56 - [info] Node-RED version: v1.0.3
6 Feb 17:31:56 - [info] Node.js version: v8.12.0
6 Feb 17:31:56 - [info] Windows_NT 10.0.18362 x64 LE
6 Feb 17:31:58 - [info] Loading palette nodes
6 Feb 17:32:04 - [info] Settings file : C:Usersmonad.node-redsettings.js
6 Feb 17:32:04 - [info] Context store : 'default' [module=memory]
6 Feb 17:32:04 - [info] User directory : C:Usersmonad.node-red
6 Feb 17:32:04 - [warn] Projects disabled : editorTheme.projects.enabled=false
6 Feb 17:32:04 - [info] Flows file : C:Usersmonad.node-redflows_MONAD.json
6 Feb 17:32:04 - [info] Server now running at http://127.0.0.1:1880/
7. Node-RED Simple Flow Example 2
*
https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_week.csv
8. node-red-contrib-modbus 팔레트 설치
*
1) 오른쪽 상단에 있는 메뉴 버튼 > settings 을 클릭하고, Palette의 Install 탭에서
modbus를 검색합니다.
2) 검색 결과 중 node-red-contrib-modbus를 인스톨합니다.
9. 하드웨어 구성
*
< 각층 경광등>
< 각층 LED >
< 각층 PIR >
< 각층 습도센서 >
< 각층 온도센서 >
< 각층 연기 감지 센서 >
< 각층 FAN >
< 각층 엘리베이터용 근접센서 >
전선
IP: 192.168.0. 55
Modbus Gateway
< DC motor >
층 수 센서 종류 Net address Offset Data Type Driver Object Type
1층 근접센서 1 0 BOOL Input Status
2층 근접센서 1 1 BOOL Input Status
3층 근접센서 1 2 BOOL Input Status
1층 경광등 1 512 BOOL Coil
2층 경광등 1 513 BOOL Coil
3층 경광등 1 514 BOOL Coil
1층 Fan 1 518 BOOL Coil
2층 Fan 1 519 BOOL Coil
3층 Fan 1 520 BOOL Coil
1층 LED 1 523 BOOL Coil
2층 LED 1 525 BOOL Coil
3층 LED 1 526 BOOL Coil
1층 온도센서 1 0 INT Holding Register
2층 온도센서 1 1 INT Holding Register
3층 온도센서 1 3 INT Holding Register
1층 습도센서 1 5 INT Holding Register
2층 습도센서 1 6 INT Holding Register
3층 습도센서 1 7 INT Holding Register
1층 연기감지 1 8 BOOL Input Status
2층 연기감지 1 9 BOOL Input Status
3층 연기감지 1 10 BOOL Input Status
1층 PIR 1 12 BOOL Input Status
2층 PIR 1 13 BOOL Input Status
3층 PIR 1 14 BOOL Input Status
엘리베이터 Down 1 516 BOOL Coil
엘리베이터 Up 1 517 BOOL Coil
INT: Signed Int 16
< 각층 디바이스의 구성 > < 디바이스의 Modbus Address 조견표>
위의 표의 Offset을 통해서 Modbus 데이터의 취득 및 제어를 합니다.
10. Node-RED Modbus Reading(단순 읽기)
*1) 접속할 Modbus 서버를 설정합니다.
2) Modbus 서버로부터 데이터를 취득합니다.
3) Modbus에서 취득한 데이터를 MQTT broker에 publish합니다.
RabbitMQ에 접속 ID/PWD를 설정한 경우, Security
탭에 그 ID/PWD를 기입합니다.
Server: RabbitMQ의 정보입니다.
Topic: publish할 topic을 기입합니다.
11. Node-RED Modbus Reading(Voltage로 읽은 값을 변환)
*
아날로그로 들어오는 데이터의 경우 ADC의 레졸루션, 측정 볼티지, 시스템 볼티지 및
센서의 데이터 시트를 통해서 계산한 결과를 전달합니다.
Analog Voltage Measured = ADC Reading/Resolution of the ADC x System Voltage
온/습도 값 = Analog Voltage Measured x 각 센서의 변환 계수(센서의 데이터시트 참조)
12. Node-RED Modbus Writing
*LED, FAN, Alarm Light와 같은 전원을 ON/OFF하여 조작하는 디바이스에 대한 제어를 하고자 합니다.
RESTful API 작성
층, 디바이스, 동작 명령을
추출
Modbus 서버에 데이터를
쓰기
Node-RED에서는 RESTful API를 작성할 수 있습니다. 또한 RESTful API를 작성할 때 변수를 이용하여 같은 패턴의 URL의 정보를 제어할 수 있습니다.
<동작 흐름>
<전체 Flow>
URL의 형태 예는 다음과 같습니다.
• http://127.0.0.1:1880/write/1f/led/on
• http://127.0.0.1:1880/write/1f/led/off
• http://127.0.0.1:1880/write/2f/fan/on
• http://127.0.0.1:1880/write/2f/fan/on
• http://127.0.0.1:1880/write/3f/alm/on
• http://127.0.0.1:1880/write/3f/alm/on
13. Node-RED Modbus Writing(URL Parsing)
*RESTful API를 통해서 호출된 URL에서 제어할 대상 정보를 추출하고 그 정보를 Modbus Flex Write에게 전달해 줍니다.
msg.payload.value:
동작 제어를 위한 값(true/false)
true: 전원 인가, false: 전원
절단
msg.payload.fc:
function code 5는 Coil 영역
연결
msg.payload.unitid:
modbus gateway id로 하나일 경우
1
msg.payload.address:
제어할 시작 어드레스
msg.payload.quantity:
시작 어드레스로부터 몇 개를 제어할
것인 지를 결정
15. Node-RED Modbus Writing(동작 테스트 1/2)
*웹 브라우저에서 REST API를 통해서 디바이스를 제어하는 동작을 테스트합니다. REST API 테스트를 위해서 Advanced REST client를
이용합니다. (Chrome 웹 스토어에서 검색하여 인스톨 합니다. https://chrome.google.com/webstore/ )
1층의 LED에 전원을 인가
16. Node-RED Modbus Writing(동작 테스트 2/2)
*Advanced REST client를 통해서 전달된 제어 정보를 수행한 이후 http out
이용합니다.
http response를 통해서 돌아온
결과입니다.
Modbus Response를 통해서
동작 결과를 Node-RED Flow
화면에서 확인할 수 있습니다.
17. 결론
*Node-RED의 Modbus 통신 노드를 이용해 디바이스를 제어하는 과정을 거쳐서 다음과 같은 결론을
도출했습니다.
1) 산업용 프로토콜(예: Modbus)과 Node.js 및 JavaScript에 대한 기본 지식은 필요합니다.
2) 웹 페이지에서 flow를 작성할 수 있고 그 flow에 의해서 디바이스가 제어되는 것은 편의성
측면에서 매우 높다고 할 수 있습니다.
3) IOT Framework로서 사용할 수 있으며 디바이스 상태를 MQTT를 통해서 취득하여 웹페이지에
표시하고 REST API를 통해서 디바이스를 제어할 수 있습니다.