반응형

1.  노드 그룹

이번 글에서는 노드레드(Node-RED)에서 플로우를 작성하기 위한 기본 단위인 노드에 대해 설명 주요 노드를 중심으로 설명을 드리려고 하며,  이를 그룹별로 정리한 노드 그룹(Group)에 대해 설명하고자 합니다. 

아래는 노드래드를 실행하면 보이는 좌측 팔레트(Palette Side) 영역에 보이는 노드와 기본 노드 그룹에 대한 설명을 표로 정리하였습니다. 

이 노드는 Node-RED를 처음 실행하면 보이는 기본 그룹이며,   팔레트 관리 메뉴에서 추가적으로 필요한 노드를 라이브러리 검색으로 검색하여 추가시킬 수 있습니다. 
아래는 가장 많이 추가해서 사용되는 Dashboard 노드 그룹과 Raspberry Pi 노드 그룹입니다. 

2.  핵심 노드  설명

  ①  Inject 노드  

인젝트(Inject) 노드는 작업영역에 배치하면 Time Stemp(타임스템프)로 표시되는 노드이며,  좌측에 있는 버튼을 눌러 수동으로 플로우를 발생시킬 때 사용할 수 있는 노드입니다.   또는 일정한 시간 간격(인터벌)으로 플로우를 발생시킬 수 있습니다. 

(타임스템프 노드를 더블 클릭하여 이미지와 같이 설정할 수 있습니다)

또한 아래처럼 지정한 시간 간격, 일시 형태로도 설정이 가능합니다.

전달하는 기본 형태는 msg.payload와 msg.topic을 설정할 수 있는데, 메시지 타입을 숫자, 문자열(String), Josn 타입 등 다양하게 전달할 수 있습니다.

 

그리고 화면 아래  '+추가' 버튼을 클릭하면, 메시지를 추가하거나 삭제 그리고 메시지의 타입을 선택할 수 있습니다.  

inject 노드에서 전달할 수 있는 메시지의 주요 타입(속성)은 아래와 같습니다. 

 

②  디버그(Debug) 노드  

 디버그 노드는 아두이노IDE로 예시를 들자면 시리얼 모니터와 같은 기능을 하는 노드로 이해하면 됩니다.  플로우 사이에 이동되는 메시지를 파악하거나 탐색하기 위해 많이 사용되는 노드입니다.  편집기 화면에서 디버그 내용을 보기 위해서는 측면영역(Side Bar)에 있는 debug 탭을 클릭하면 그곳으로 출력됩니다. 

 

만약,  시스템 콘솔 (system console)로 출력을 선택하면, 아래처럼 Node-Red를 실행시킨 콘솔(터미널) 화면으로 출력 됩니다. 

 

또한, 노드 상태(node status)창으로 출력을 설정할 경우 플로우 작업영역의 노드 아래에 32 character까지 출력해 줍니다. 


그리고 이 옵션들은 중복해서 적용할 수 있습니다.  (동시 출력 가능함)
그리고 이과정에서 디버그 노드는 앞선 글에서도 다루었지만, 활성화 또는 비활성화할 수 있는데요, 필요치 않은 경우 비활성화시켜놓다가 다시 체크해 볼 상황이 되면 활성화시켜 확인해 보는 식으로 하면 편리하게 디버그 노드를 활용할 수 있습니다. 

 

③  함수(function) 노드  

 함수 노드는 전달 받은 메시지를 JavaScript를 활용하여,  처리하고 처리된 결과를 뒷 단의 노드로 전송할 수 있습니다.  사용자가 원하는 기능을 정의한다고 생각하면 됩니다. 

예를 들어 인젝트 노드에서 'Hello World!'라는 문자열을 받아서 문자열 전체 개수를 카운트하여 전달할 수 있습니다.  아래 이미지를 보면, 공백포함하여 정확히 '12'가 카운트되어 전달되는 것을 볼 수 있습니다. 

예제 1)  전달 되는 메시지(Hello World!)의 문자열 길이를 출력하는 함수(function) 넣기

▷  Function 함수 내용 :    var msg= { msg.payload.length );     return   msg;

 

예제 2)  다중 함수를 구성하여 기본 전달 메시지(Hello World!)와,  설명 문자열 출력과 전달되는 문자열의 길이를 출력하는 3중 출력 함수 Json코드 넣기.

함수에 입력된 JSON 코드 :

var msg2 = { payload: "메시지의 총길이는:" };
var msg3 = { payload: msg.payload.length };
return [ msg, msg2, msg3 ];

( ※ msg는 기본 전달되는 메시지여서 별도로 객체를 생성할 필요 없습니다)

이때, 함수(function) 노드의 설정창의 Setup탭에서 함수 노드 수를 3개로 변경해 주어야 합니다. 

그럼, 아래와 같이 디버그 창으로 동시에 원하는 3가지 형태의 출력 결과를 얻을 수 있습니다.

 

또한,  if 조건문을 넣어 원하는 입력일 경우 그대로 출력하고 그렇지 않을 경우 에러 메시지 등과 같은 것을 출력하는 등, 좀 더 다양하게 활용할 수 있습니다. 

① 원하는 입력('Hello World!')이 들어오면 설정한 대로 출력합니다.

1. 원하는 입력('Hello World!')이 들어오면 설정한대로 출력합니다.

 

② 만약 원하지 않는 입력('Nice World!')이 들어오면 다시 확인할 수 있도록 메시지를 출력할 수도 있습니다. 

2. 원하지 않는 입력 ('Nice World!')이 들어오면 다시 확인할 수 있도록 메시지를 출력합니다.

 위에서 입력한 function 코드는 아래와 같습니다. 

var msg2 = { payload: "메시지의 총길이는:" };
var msg3 = { payload: msg.payload.length };
var msg4 = { payload: "입력문자를 확인하세요!"};
if (msg.payload == "Hello World!") {
    return [msg, msg2, msg3];
} else {
    return [msg4];
}

 

예제 3) 하나의 디버그 노드로도 여러개의여러 개의 메시지를 순차적으로 출력할 수 있습니다. (한 번의 인젝션으로 여러 개의 메시지를 출력할 수 있음)

 

아래 function 내용을 참고하세요. 

또한, return 에서 대괄호 [ ]는 배열을 의미합니다. 따라서,  function 노드의 Setup에서 출력수를 2로 하고 디버그를 하나더 연결 후 아래와 같이 msg, msg1과  msg2, msg3를 배열의 요소로 따로 분류하면 각각의 디버그 노드로 분리되어 출력되는 것을 볼 수 있습니다.

[ [msg, msg1], [msg2, msg3] ] 으로 Function 코드를 수정하세요

 

배열로 분리된 리턴값이 디버그1과 디버그2로 각각 분리되어 출력됩니다

 

예제 4)  이벤트 로깅

 필요할 때마다 콘솔을 통해 무언가를 기록해야 하거나, 특정 노드에서 주의(경고)나 에러(오류)가 발생하는 상황에 대해 메시지를 출력하도록 할 수 있습니다. 
function 노드에 아래와 같이 코드를 입력하고 실행시켜 보면,  이벤트 로깅이 되는 것을 볼 수 있습니다. 단, node.log ()의 경우는 사이드바로는 출력되지 않고 콘솔로만 출력됩니다. 

node.log("로그 기록입니다.");
node.warn("주의 경고 사항발생!");
node.error("에러 발생~!");
 

그리고 이벤트 함수에 직접 메시지를 입력할 수도 있지만 아래처럼, 변수를 지정해서 할 수도 있습니다.
var msg1 = { payload:"로그 기록입니다."};
var msg2 = { payload: "주의 경고 사항발생!" };
var msg3 = { payload: "에러 발생~!" };
node.log(msg1.payload);
node.warn(msg2.payload);
node.error(msg3.payload, msg3);
return [[msg1, msg2, msg3]];

아래 이미지를 보면, 이벤트 로깅 함수에의해 발생되는 것(분홍색 표시)과  일반 메시지로 출력되는 것(주황색 표시)의 차이를 구분하실 수 있을 거예요.

 

④  Catch 노드  

catch 노드를 통해서는  노드 전체나 특정 노드에서 발생하는 에러가 있을 경우 이벤트 메시지를 발생시키도록 할 수 있습니다. 

 

⑤  Change 노드  

Change 노드는 Function노드에서 처럼 JavaScript  코드에 의존하지 않고 사용할 수 있는 노드로서, Node-RED에서 자주 사용될 수 있는 기능인,  payload값을 변경하거나, 설정, 삭제, 이동 같은 작업들을 처리해 줄 수 있는 노드입니다. 

Change노드의 설정으로 들어가보면 4가지 속성을 선택할 수 있는데요, 각각의 예시를 들어 볼게요.

예제 1)  값의 대입 (Set)   속성
Change노드의 설정부분에서 "값의 대입(Set)"으로 놓고 대입하고자 하는 값('Welcome!')을 입력해 놓으면,  인젝터에 입력값이 없는 경우에도 특정 값을 대입(설정,Set)시킬 수 있습니다. 

 

예제 2) 값의 치환(Change) 속성

치환 속성은 예를들어 인젝트 노드로부터 입력되는 값에서 특정 문자열을 검색하여 바꾸고자 하는 문자열로 변경해 주는 속성입니다.

"Hello World!" 문자열에서 Hello를 검색하고 이 문자열 대신 "Nice"로 치환하여 출력 하도록 합니다. 
그래서 결국 "Hello World!" 문자열은 Change 노드를 거친 결과 값은  "Nice World!"로 바뀌어 출력되게 되는거죠.


예제 3) 값의 삭제(Delete) 속성

값의 삭제(Delete)속성은 입력되는 payload 값을 삭제하도록 합니다. 아래처럼 Change의 속성을 값의 삭제로 변경하게 되면,  

Change 노드를 거친 "디버그 2" 노드로는 출력값이 나오지 않게 됩니다. 

 

예제 4) 값의 이동(Move) 속성

 값의 이동은 이동(Move)이라는 말보다는 추출이라는 말로 생각하면 더 빠르게 이해할 수 있는데요, 예를 들어, Raspberry Pi에 연결 된 dht11 온도센서가 있다면,  센서로부터 전달 받는 데이터(payload)는 오브젝트(객체)로 전달 받게 되는데요  즉, dht11이라는 정보 객체 속에는 온도값과 습도값의 데이터 집합(뭉텅이) 형태로 전달 받게 되는데, 실제로 활용하고자 하는 온도(Temperature) 값이나 습도(Humidity)값을 추출(이동-Move)해야 활용할 수 있게 되겠죠?   따라서 이런 상황에서 아래처럼, 이동(Move) 속성을 이용하여 플로우를 구성하여 사용할 수 있습니다. 

반응형
반응형

지난 시간에는  노드레드를 라즈베리파이 또는 윈도에 설치하는 것에 대해 다루었습니다.  이와 관련하여서는 아래 게시물을 참고해 주세요.
【Node-RED #1】라즈베리파이(Raspberry pi)에 Node-RED 설치하기

 이번 시간부터는 본격적으로 노드레드에 대해 알아보고 활용해 보도록 시작해 보겠습니다. 

1. Node-RED의 개념

 노드레드는 플로우(Flow) 즉, 흐름 기반의 프로그래밍으로써 시각적 표현에 매우 적합하고, 복잡하고 어려운 프로그래밍 사용을 자제하고, 사용자가 보다 쉽게 접근할 수 있도록 설계된 모듈입니다.   노드레드에서의 각 노드는 마치 블록코딩의 대명사인 스크래치의 블록과 유사한 개념으로  노드레드는 다수의 노드를 이용하여 각 노드별 원하는 요구사항에 맞는 플로우를 만들 수 있으며 이를 아두이노, 라즈베리파이 및 각종 센서, 디스플레이 등 제어모듈과 같은 하드웨어와 연결하여 시각적으로 보여주거나 제어가능하도록 ioT 시스템을 쉽게 구축할 수 있는 특징이 있습니다. 

아래는 노드레드 Flow 구성 및 편집 예시입니다.

이미지 출처 : nodered.org

아래는 노드레드 UI 예시입니다.

이미지 출처 : hackaday.com

아래는 노드레드 UI 예시입니다.

이미지 출처 : Yaser Ali Husen

아래는 노드레드 UI 예시입니다.

이미지 출처 : Yaser Ali Husen

 

기본 화면 구성은 아래 이미지와 같습니다.

① 노드레드 편집기 화면 구성

 

노드레드는 크게 4개의 영역으로 구성되는데요,,

→ ① 상단(Header) 영역에는 배포(Deploy) 메뉴와(Deploy) 팔레트관리와 같은 설정 메뉴가 배치되어 있습니다.

→ ② 팔레트(Palette) 영역은 각종 기능 구현해 주는 노드 블록들로 배치되어 있습니다.

→ ③ 측면(Sidebar) 영역은 노드에 대한정보/도움말/디버그/노드설정에 대한 메뉴로 구성되어 있습니다.

→ ④ 작업공간(Workspace) 영역은 노드들을 배치하고 이어주며 함수 노드에 프로그래밍을 하는 영역입니다.

 

상단(Header) 영역에 있는 배포(Deploy) 메뉴는 작업공간영역에서 완성된 노드들의 플로우를 실행시키는 역할을 합니다. 만약 UI(User Interface)가 있는 플로우라면 “http://localhost:1880/ui” 주소를 통해서 UI를 확인하거나 실행할 수 있습니다. 그리고 배포하기 옆에 세줄로 표시된 부분을 클릭하면, 라이브러리 추가 등 팔레트관리와 같은 설정 메뉴가 있는데, 제세한 내용은 이후 계속 설명이 됩니다.

팔레트(Palette) 영역은 작업영역 좌측에 있으며, 기본적으로 6개 그룹(카테고리)의 메뉴로 구성되어 있습니다. 여기에서 필요한 노드 블록을 선택하여 작업영역으로 끌어다 놓는 식으로 작업합니다. 기본 그룹 외에 추가적으로 팔레트관리 메뉴에 있는 라이브러리 추가를 통해 대시보드(dashboard)나 라즈베리파이(Raspberry Pi) 노드 그룹 같은 것들을 추가해서 사용할 수 있습니다.  
대략 2,700개 이상의 모듈을 추가 설치가 가능하며, 사용자 정의로 직접 모듈을 등록하고 관리할 수 있습니다.

 

측면(Sidebar) 영역은 노드 편집기 내의 유용한 도구를 제공하는 패널로 구성되어 있는데요, Information/Help/Debug/Configuration nodes/Context Data/Dashboard, 6개의 탭으로 구성되어 있습니다.

주로 Debug탭을 많이 활용하게 되는데요, 작업공간에서 사용한 디버그 노드의 출력을 확인할 수 있습니다. 측면영역은 작업영역 확보를 위해 숨김/보이기 처리할 수 있으며, (Ctrl+Space) 단축키도 할당되어 있습니다. 가령,  "Hello world!"와 같은 

 

작업공간(Workspace) 영역은 필요한 노드 블록을 끌어다 놓고 블록들 사이의 플로우(Flow)를 연결하며, 함수 노드의 경우 Javascript로 프로그래밍을 추가해 넣을 수 있는 작업 공간입니다. 노드들을 클릭하면 세부 설정을 변경하거나 코드를 입력할 수 있는 메뉴가 표시됩니다.  노드레드에서 노드는 플로우를 작성하는 기본 구성단위 요소입니다. 

작업공간 상단 우측에 보면 + 표시와 서브메뉴가 보이는데요,  이를 클릭하면 플로우 페이지를 추가하거나 보이기 감추기 등을 할 수 있습니다. 

또한, 불필요한 플로우 삭제는 아래처럼,  플로우를 더블클릭 후 나타나는 메뉴에서 플로우를 삭제할 수 있습니다.

 

그럼, 사용법을 익히기 위해 먼저 간단한 플로우를 작성해 볼게요.

▶ Hello world ! 문자 출력해 보기

프로그래밍을 배울 때 제일 처음 출력해 보는 것이 “Hello world!”인 것은 이제 국룰? 인데요, 여기서도 그 문장을 출력해 볼게요.

먼저 위 이미지처럼, 공통노드(common node) 그룹에서 inject(타임스탬프)를 플로우 작업화면으로 끌어다 놓으세요.   
그리고, 타임스탬프노드를 더블 클릭하면 설정창이 열리는데, 아래 ②번 부분을 클릭하여 전달할 메시지 타입을 String(문자열)으로 선택합니다. 

그런 다음, 아래 ④번과 같이 "Hello world !" 메시지를 입력하고 완료 버튼을 눌러주세요.

 

 이제 공통그룹에서 debug 노드를 ⑤ 위치에 끌어다 놓으세요. 

그리고 "Hello world! " 노드 끝에 있는 포인트를 마우스로 드래그하면 연결할 수 있는 주황색 선이 나오는데요,  이를 debug노드의 연결점에 이어 붙여주세요.  (아래 이미지 참조)


각각의 노드 오른쪽에 보면, 파란색 점이 있는 것을 볼 수 있는데요, 이는 현재 새로운 노드가 삽입되었거나, 변경 사항이 발생한 표시이며, 아직 배포(적용)되기 전이라는 뜻입니다.     그럼,  이 상태에서 상단메뉴에 보이는 "베포하기" 버튼을 눌러주세요. 

 

그럼, 아래처럼 파란색 점이 사라진 것을 볼 수 있습니다.     이제 "Hello world!"라는 전달 내용(payload)을 가진 타임스탬프 노드의 왼쪽 버튼 부분(Inject)을 클릭하면 디버그 노드로 전달이 이루어집니다.   이윽고 우측 Sidebar의 디버그 창으로 "Hello world !"가 출력되는 것을 볼 수 있게 됩니다.    또한, Inject 버튼을 여러 번 클릭하는 만큼 출력이 됩니다.

 

참고로,  노드레드의 언어 설정은 기본적으로  영어, 독일어, 일본어, 러시아어를 지원하며, 한글도 지원하지만 간혹 한글 표현이 조금 어색한 경우도 있습니다.  
언어 설정 메뉴는 상단메뉴의 "배포하기" 버튼 오른쪽에 있는 삼선을 클릭 후,  창 탭을 클릭하면 나옵니다.

그리고 디버그 창에 출력된 내용이 지저분하거나 하여 삭제하고 싶을 때는 아래 휴지통 버튼을 클릭하면 됩니다. 

 

참고로 디버그(debug) 노드를 클릭 후 보이는 설정메뉴 하단에 "ㅇ사용가능" 표시가 있는데요, 이를 클릭하면 "Ø사용불가능"으로 표시가 바뀌며,  해당 디버그 노드는 실행을 시켜도 디버그 창으로 메시지 출력이 되지 않도록 사용이 중단됩니다. 

아래 이미지처럼,  해당 노드는 점선으로 처리되며,  Inject 버튼을 눌러도 아무것도 출력되지 않게 됩니다.

 노드의 삭제는 삭제하고자 하는 개별 노드를 선택한 다음 Delete 키로 쉽게 삭제 가능합니다.
노드간 연결된 선도 마우스로 선택 후 Delete 키로 삭제할 수 있습니다. 

그럼  "Node-RED의 시작!" 첫 글은 여기까지 하고,  다음 게시글에서 계속 이어가도록 하겠습니다.

반응형