스마트디바이스실습 ‐ 15주차 - jiho0419/SmartDevice_2025-1 GitHub Wiki

1️⃣ Node-RED

*️⃣ 정의

💠 비주얼 프로그래밍 도구 로서, 브라우저 기반의 플로우(flow) 편집기를 통해 다양한 장치, 서비스, API 등을 연결 하여 워크플로우를 구성할 수 있도록 설계되있다.
💠 IBM에 의해 개발되었고 현재는 JS Foundation의 오픈소스 프로젝트로 관리되고 있다.

*️⃣ 주요 특징

항목 설명
플로우 기반 개발 코딩 없이 시각적으로 노드를 연결하여 동작 흐름을 설계
Node.js 기반 JavaScript 런타임(Node.js)을 사용하여 가볍고 유연함
웹 기반 인터페이스 브라우저를 통해 언제 어디서든 편집 및 배포 가능
확장 가능성 수천 개의 커뮤니티 플러그인 및 사용자 정의 노드 지원
다양한 통신 프로토콜 지원 MQTT, HTTP, WebSocket, Modbus 등 다양한 통신 방식 사용 가능

*️⃣ 구성 요소

💠 노드(Node)

🔸 기능 단위 블록 (예: 입력 노드, 처리 노드, 출력 노드)
🔸 예: inject, function, http request, mqtt in, debug

💠 플로우(Flow)

🔸 노드들을 연결한 흐름 단위
🔸 하나의 서비스 또는 작업 단위로 구성

💠 메시지(msg)

🔸 플로우를 따라 전달되는 데이터 객체
🔸 각 노드에서는 msg.payload, msg.topic 등을 이용하여 데이터를 처리

*️⃣ 주요 활용 분야

분야 활용 예시
스마트 홈 IoT 센서(MQTT) 데이터 수집, 자동 조명/에어컨 제어
산업 자동화 설비 상태 모니터링, 알람 시스템, 로깅
API 통합 외부 API 연동 (RESTful API, Webhook)
데이터 시각화 Grafana, Dashboard 노드를 이용한 실시간 데이터 시각화
AI / ML 연동 TensorFlow, Python 노드와 연계하여 예측 분석

*️⃣ 장 / 단점

💠 장점

🔸 비개발자도 사용 가능 한 직관적인 UI
🔸 Node.js 기반으로 다양한 JS 라이브러리 사용 가능
🔸 IoT와 API 통합에 특화된 구조
🔸 커뮤니티가 활발하고 자료가 풍부

💠 단점

🔸 복잡한 로직 처리에는 한계 (JS로 커버 가능하나 유지보수 어려움)
🔸 대규모 시스템에는 구조적 설계가 부족할 수 있음
🔸 성능 면에서는 Python, C/C++에 비해 제한적

*️⃣ 아키텍처

+-------------------+
|     Web Editor    | ← 사용자 인터페이스 (브라우저)
+-------------------+
         |
         v
+-------------------+         +-------------------+
|    Flow Engine    | <---->  /     Runtime       /
| (Node Execution)  |         | (Node.js 기반)     |
+-------------------+         +-------------------+
         |
         v
+-----------------------------+
|     외부 장치/서비스/API     |
+-----------------------------+

*️⃣ 대표적인 노드 종류

노드 설명
inject 입력 트리거 생성 (주기적 실행 등)
debug 디버깅 메시지 출력
function JavaScript 코드 처리 가능
http in/http response RESTful API 구성
mqtt in/mqtt out MQTT 브로커 연동

2️⃣ 실습

*️⃣ 실습 준비

🔸 node.js
🔸 https://nodejs.org/ko 접속 > 맞는 사양으로 다운 및 설치


🔸 실습 페이지 실행
🔸 cmd 접속 > npm install -g --unsafe-perm node-red 입력 > node-red 입력
🔸 나온 자신의 url 실행 > Node-Red 실습 페이지에서 실습 진행


*️⃣ inject 노드

💠 실습 내용 (현재 날짜, 시간 출력)

🔸 inject debug 가져와 연결


🔸 inject 노드 설정
🔸 이름 타입스크립트 변경
🔸 msg.payload YYYY-MM-DDTHH:mm:ss.sssZ 로 변경 > 완료 클릭


💠 배포 결과

🔸 디버그에 현재 년도 월 일 시간 분 초가 표기됨


💠 실습 내용 (문자[string] 출력)

🔸 inject debug 가져와 연결


🔸 inject 노드 설정
🔸 이름 인사 변경
🔸 msg.payload string 변경 > 안녕하세요 입력
🔸 2번째 msg topic 변경 > 완료 클릭


💠 배포 결과

🔸 문자(string)형식으로 안녕하세요 가 출력되는 것을 확인


*️⃣ 메시지 객체 출력

💠 실습 내용

🔸 inject debug 가져와 연결


🔸 inject 노드 설정
🔸 이름 인사설명 변경
🔸 msg.payload string 변경 > 인사페이로드 입력
🔸 2번째 msg topic 변경 > 인사토픽 입력 > 완료 클릭


🔸 debug 노드 설정
🔸 대상 > msg오브젝트 전체 변경 > 완료 클릭


💠 배포 결과

🔸 msg오브젝트 전체가 출력되는 것을 확인


*️⃣ 각 속성 값 전달

💠 실습 내용

🔸 inject debug 가져와 연결


🔸 inject 노드 설정
🔸 이름 인사말을 전하는 노드입니다 변경
🔸 msg.payload string 변경 > 안녕하세요 입력
🔸 2번째 msg topic 변경 > 인사토픽 입력 > 완료 클릭


🔸 debug 1 노드 설정
🔸 대상 > msg오브젝트 전체 변경 > 완료 클릭
🔸 debug 1 에 연결된 출력 값 > msg오브젝트 전체가 출력됨


🔸 debug 2 노드 설정
🔸 대상 > msg. 설정 > topic 입력 > 완료 클릭
🔸 debug 2 에 연결된 출력 값 > topic만 출력 됨


🔸 debug 3 노드 설정
🔸 대상 > msg. 설정 > _msgid 입력 > 완료 클릭
🔸 debug 3 에 연결된 출력 값 > _msgid만 출력 됨


💠 배포 결과

🔸 각 debug에 설정에 맞게 출력되는 것을 확인


*️⃣ function 노드

💠 실습 내용 (문자열 변경)

🔸 inject debug function가져와 연결


🔸 inject 노드 설정
🔸 이름 반말로 인사하는 노드 변경
🔸 msg.payload string 변경 > 안녕 입력
🔸 2번째 msg topic 변경 > 반말 입력 > 완료 클릭


🔸 function 노드 설정
🔸 이름 존댓말로 변환 입력
🔸 msg.payload = msg.payload+"하세요!" 코드 추가 > 완료 클릭


💠 배포 결과

🔸 inject의 msg 에서 function의 코드 msg가 합쳐져 안녕하세요! 가 정상적으로 출력됨


💠 실습 내용 (덧셈처리)

🔸 inject debug function가져와 연결


🔸 inject 노드 설정
🔸 이름 `` > 입력하지 않음
🔸 msg.payload number 변경 > `3` 입력
🔸 2번째 msg `topic` 변경 > `숫자 메시지` 입력 > `완료` 클릭
⚠️ msg.payload 을 `string`으로 하면 `number`로 되지 않고 `string` 인식하게 됨 > 꼭 `number`로 변경해야 된다.


🔸 function 노드 설정
🔸 이름 더하기 3 입력
🔸 msg.payload = msg.payload + 3 코드 추가 > 완료 클릭


💠 배포 결과

🔸 inject의 msg 에서 function의 코드 msg가 합쳐져 출력됨
⚠️ intect의 msg string 설정할 경우 > string + number > string으로 출력 > 33
💡 intect의 msg number 설정할 경우 > number + number > number으로 출력 > 6

⚠️ **GitHub.com Fallback** ⚠️