개인적으로 공부중인 IoT관련 사항 중 Node-red에 대한 overview + hello world입니다. 처음 접하시는 분에게는 충분할 정도의 글이라고 생각합니다만 좀 어려울 수도 있겠네요. 다음에는 새로운 node를 어떻게 개발하는 지를 올려보려고 합니다만 언제가 될런지는 장담할 수 없겠습니다. IoT에 관심있는 분들이 많으면 소모임 창당을 해도 어떨까 싶기는 한데...흠...하여간 그렇습니다. 개인적으로 node-red를 디바이스에 근접하게 사용하고 openhab / domoticz / home assistant등의 플랫폼을 front-end로만 사용하려고 노력중입니다. 또한 RF/Bluetooth/Zigbee위주의 무선 기기 위주로 갖추려고 하고 있구요. 어쨌든 자바스크립트나 node.js에 익숙하신 분들께는 아주 쉬운 플랫폼이 되리라 생각합니다.
개인 블로그에 올려져 있는 2개의 Node-red 관련 글입니다.
#1 Node-RED – Swiss Army Knife (http://ift.tt/2qxiDki)
#2 Node-RED – Hello world (http://ift.tt/2pLGmdw)
Node-RED – Swiss Army Knife
최근 IoT와 원격 및 자동 제어에 개인적인 관심이 생겨 취미 삼아 공부중이다. Raspberry Pi등의 Open source H/W SBC류, Arduino/ESP8266등으로 DIY, 기성 RF/WIFI 센서/스위치등의 해킹, 자동화 플랫폼 OpenHAB 등의 학습 등을 진행하면서 실제 적용을 위해 집 IoT 및 원격/자동 제어 시스템을 구축해 나가려고 한다. 누구라도 관심이 있는 사람이라면 따라할 수 있을 정도의 내용 기술을 목표로 하고는 있는데 어찌 될런지, 얼마나 걸릴런지는 모르겠다.
그 첫번째로 Node-RED에 대해 알아보자. 찾아보면 정말 많은 자동화 플랫폼이 있다. 오픈소스 진영만 해도 OpenHAB2, Domoticz 와 Home Assistant 등 쟁쟁한 녀석들이 많다. 그런데 Node-RED가 첫번째 내용이 되어야 하는데에는 나름의 이유가 있다.
Node-RED는 Node.js 기반의 HW, API와 온라인 서비스 등의 “Wiring”해주는 브라우저 기반의 프로그래밍 환경이다. 각각의 기능들은 “Node”로 표현되며, 기본적으로 제공되는 Node들 이외에도 수많은 사람들이 기여한 3rd party Node들을 사용할 수 있다. 그러한 Node들을 브라우저 상에서 “연결”하는 것만으로도 HW, API와 온라인 서비스 등을 쉽게 연동할 수 있게 된다. 예를 들어 기본 제공되는 HTTP input node와 HTTP response node만을 가지고 몇 초 안에 HTTP Restful API를 prototyping할 수 있다. 3rd party node 중 Modbus node와 기본제공되는 MQTT node를 사용하면 Modbus 장치에서 값을 읽어서 MQTT로 push하는 기능을 실제 Modbus 장치 없이도 구현/테스트 가능하다.
Node-RED는 손쉬운 테스트/디버깅을 가능하게 해준다. 여타 유명한 자동화 플랫폼에서는 해당 플랫폼에서 사용하는 설정 방법이나 특정 파일 형식 등을 사용해서 어떠한 규칙을 기술함으로써 제어, 자동화 혹은 연동이 이뤄진다. 문제는 그러한 방법에 익숙해지지 않고서는 원하고자 하는 것을 구현하기가 그다지 쉽지 않다는 것이다. 또한 테스트도 쉽지 않다. 규칙을 기술하고 나서 장치를 가지고 실제 테스트를 진행해야, 해당 규칙이 잘 동작하는 지 알 수 있다. 하지만 Node-RED는 정말 강력한 테스트/디버깅 기능을 제공한다. Inject node를 통해 수동 혹은 인터벌 trigger를 쉽게 지정할 수 있고, 테스트할 값도 실제 장치없이도 지정할 수 있어서 테스트가 매우 쉽다. 또한 Debugging node를 어느 Node에나 붙일 수 있고, 디버깅 on/off도 쉽게 조절이 가능해야 디버깅 창에서 문제 확인이 바로 바로 가능하다.
Node-RED에서는 자바스크립트 기반의 custom function을 사용할 수 있는데, 자바스크립트 개발 경험이 있는 많은 사람들에게는 정말 반가운 환경이라고 할 수 있다.
위에 기술한 3가지 강력한 장점들이 여타의 자동화 플랫폼보다 Node-RED에 좀 더 몰두하도록 만들었지만, 그렇다고 해서 Node-RED가 자동화 플랫폼의 대안이 되기는 아직 시기 상조인듯 하다. 웹기반의 Dash board UI도 있고 사용자 인증도 제공하고, DB 연동도 가능하며, HTTPS 등도 가능하기는 하다. 그래도 그보다는 자동화 플랫폼과 HW/API/온라인 서비스 사이에서 기능별 연동/변환용 시스템으로 사용하는 것이, 현 시점에서는 맞는 활용방법인 거 같다. 자동화 플랫폼들을 보면, 각기 지원되는 기능과 지원되지 않는 기능등이 모두 달라서 그 어느 것 하나 “완벽”하지 않고, 또한 “완벽”할 수도 없다고 생각한다. 그러한 점에서 Node-RED가 그러한 자동화 플랫폼들을 보완해주는 Swiss Army Knife같은 주머니속의 강력한 Middleware system이 될 수 있다고 생각한다.
Node-RED – Hello world
이번에는 Node-RED를 가지고 기본적인 설정 후에 간단히 노드 생성 및 테스트/디버깅해봄으로써 Node-RED를 맛보기로 하겠다.
Node-RED를 라즈베리 파이에서 운영하는 것은 너무도 쉽다. 2015년 11월 이후, 그러니까 Raspbian Jessie 이후의 full image를 설치했다면 이미 Node-RED가 설치되어 있다. 만약 수동으로 설치하려면 링크의 글을 보고 하면 된다. 본격적으로 Node-RED를 사용하려면 부팅시마다 자동으로 실행되도록 해주면 되는데 다음의 명령어를 실행해주면 된다.
sudo systemctl enable nodered.service
Node-RED가 실행중이라면 http://ip:1880을 입력해서 다음과 같은 editor에 접근이 가능하다.
그런데 뭔가 이상하다. 아무런 인증 과정없이 editor에 접근이 가능했다. 그렇다. 기본적으로 node-red의 editor는 아무런 인증 과정없이도 사용이 가능하다. 링크의 글을 참조해서 기본적인 사용자 인증을 적용하면 되는데, 다음에 기재한 것만 해도 별 무리는 없을 듯 하다.
sudo apt-get update
sudo apt-get install npm
sudo npm install -g node-red-admin
sudo service nodered restart
node-red-admin hash-pw 실행 후 원하는 암호 입력하면 출력되는 hash된 키를 복사해둔다.
vi ~/.node-red/setting.js해서 adminAuth/httpNodeAuth/httpStaticAuth부분의 주석표시를 제거해서 활성화 후 node-red-admin을 통해 생성한 hash된 키를 복사해 넣고 node-red를 재부팅하면 된다.
adminAuth: {
type: “credentials”,
users: [{
username: “admin”,
password: “생성한 hash암호”,
permissions: “*”
}]
},
httpNodeAuth: {user:”admin”,pass:”생성한 hash암호”},
httpStaticAuth: {user:”admin”,pass:”생성한 hash암호”},
이제 다시 http://ip:1880으로 접속해보면 다음처럼 로그인 화면이 나오고 위에서 지정한 암호를 입력해야 editor 접근이 가능해진다.
이제 Hello world를 해보자. Hello world 용으로 MQTT를 사용해보자. 일단 MQTT 서버와 클라이언트를 라즈베리 파이에 다음처럼 설치하자.
wget http://ift.tt/1Jo2xYJ
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http://ift.tt/1LzneCl
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients
아무 설정없는 상태에서 mosquitto에는 아무 인증없이 누구나 subscribe/publish가 가능하다. 그러므로 다음의 사용자 인증/토픽접근 제어 설정을 적용하도록 하자.
sudo vi /etc/mosquitto/mosquitto.users 해서 아이디:암호 형식으로 다음처럼 1줄에 1개씩 기재
admin:password_1
sudo mosquitto_passwd -U /etc/mosquitto/mosquitto.users
sudo vi /etc/mosquitto/mosquitto.conf 해서 다음을 추가
allow_anonymous false
password_file /etc/mosquitto/mosquitto.users
sudo service mosquitto restart
테스트 해보자.
터미널 1: mosquitto_sub -h localhost -t /sensor/livingroom/state -u admin -P password
터미널 2: mosquitto_pub -h localhost -t /sensor/livingroom/state -m “23 -u user -P password
sudo vi /etc/mosquitto/mosquitto.acl 해서 다음을 추가
user admin
topic/sensor/livingroom/state
sudo service mosquitto restart
테스트 해보자.
터미널 1: mosquitto_sub -h localhost -t /sensor/livingroom/state -u admin -P password
터미널 2: mosquitto_pub -h localhost -t/sensor/livingroom/state -m “23” -u admin -P password
다음으로는 dashboard node를 설치해야 한다(참고로 cd ~/.node-red 하지 않고 설치시 설치된 모듈이 지정된 위치에 다운로드되지 않아 인식되지 않는 오류가 발생함으로 현 시점에서는 디렉토리 변경이 필요함).
cd ~/.node-red
npm install node-red-dashboard
sudo service nodered restart
이제 http://ip:1880을 가면 다음과 같은 dashboard node들을 볼 수 있다.
이제 모든 준비가 끝났다.
editor에서 ctrl + i 누른 후 다음을 붙여넣은 후 다음처럼 설정을 해주면 되고 deploy버튼을 눌러서 작성한 내용이 서버에 반영되도록 한 이후 http://ip:1880/ui에 접근하면 랜덤하게 생성된 값들이 MQTT 토픽에 Publish되고 그 값들이 대쉬보드에 실시간 표시됨을 볼 수 있다.
[{“id”:”e8a6a48f.8953d8″,”type”:”inject”,”z”:”aa0a983c.7cbef8″,”name”:””,”topic”:””,”payload”:””,”payloadType”:”date”,”repeat”:”5″,”crontab”:””,”once”:false,”x”:115,”y”:54,”wires”:[[“fb45a81f.16e8d8”]]},{“id”:”fb45a81f.16e8d8″,”type”:”random”,”z”:”aa0a983c.7cbef8″,”name”:””,”low”:”10″,”high”:”100″,”inte”:”true”,”x”:266,”y”:53,”wires”:[[“147a741a.fcf04c”]]},{“id”:”147a741a.fcf04c”,”type”:”mqtt out”,”z”:”aa0a983c.7cbef8″,”name”:””,”topic”:”/sensor/livingroom/state”,”qos”:”1″,”retain”:”true”,”broker”:”d96006fc.6471d8″,”x”:463,”y”:51,”wires”:[]},{“id”:”89ac48b1.9612a8″,”type”:”mqtt in”,”z”:”aa0a983c.7cbef8″,”name”:””,”topic”:”/sensor/livingroom/state”,”qos”:”2″,”broker”:”d96006fc.6471d8″,”x”:135,”y”:150,”wires”:[[“1adfa2af.934e3d”]]},{“id”:”1adfa2af.934e3d”,”type”:”ui_gauge”,”z”:”aa0a983c.7cbef8″,”name”:””,”group”:”54359e7.e23766″,”order”:0,”width”:0,”height”:0,”gtype”:”donut”,”title”:”Gauge”,”label”:”units”,”format”:””,”min”:”10″,”max”:”100″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:354,”y”:148,”wires”:[]},{“id”:”d96006fc.6471d8″,”type”:”mqtt-broker”,”z”:””,”broker”:”localhost”,”port”:”1883″,”clientid”:””,”usetls”:false,”compatmode”:true,”keepalive”:”60″,”cleansession”:true,”willTopic”:””,”willQos”:”0″,”willPayload”:””,”birthTopic”:””,”birthQos”:”0″,”birthPayload”:””},{“id”:”54359e7.e23766″,”type”:”ui_group”,”z”:””,”name”:”Default”,”tab”:”841c7e06.6255c”,”disp”:true,”width”:”6″},{“id”:”841c7e06.6255c”,”type”:”ui_tab”,”z”:””,”name”:”Home”,”icon”:”dashboard”}]
만약 어떤 값이 Random 노드에서 생성되는지 알고 싶다면 다음처럼 간단히 debug 노드를 붙여주면 된다. 생성한 디버그 노드의 출력은 끝에 달린 버튼을 클릭해서 on/off 시킬 수 있으므로 삭제하지 말고 필요없을 때에는 그냥 off시켜주면 편리하다.
이 예제를 통해 Injetc, debug, random, MQTT read(subscribe)/write(push) 그리고 dashboard 노드 중 Gauge 까지 한번에 다뤄보았다.
May 05, 2017 at 08:34AM
