안녕하세요.
데이터 테스트를 위해서 자동으로 DB table에 값이 저장되거나 혹은 시간이 지난 Sensor 데이터가 삭제되었으면 좋겠다는 생각이 들 때가 있습니다. influxDB 같은 경우 시계열 데이터 위주이다 보니 기본적으로 가지고 있고, 다른 DB들도 스케줄러 기능이 있어 쿼리를 주기적으로 사용할 수 있는 것으로 알고 있습니다.
위의 상황이 아닌 예외상황이 생길 경우, 관리자 권한이 없어 DB스케줄러 기능을 사용할 수 없다거나, InfluxDB를 사용하고 있지 않다고 한다면, Node-RED의 Inject 기능을 이용해서 유사한 기능을 만들 수 있을 것이라 생각해서 확인해 보았습니다.
1. Inject Node
1) 개 요
Inject 노드(node)는 사용자가 특정 시간에 데이터를 흐름으로 주입(inject, 전달) 혹은 메시지나 내용물을 만들어 주는 역할을 합니다. 이를 통해 특정 시간 간격으로 데이터를 생성하거나, 수동으로 흐름을 테스트할 수 있습니다.
2) 주요 기능
데이터 전달 : Inject 노드는 숫자, 문자열, JSON 객체 등 다양한 형태의 데이터를 전달할 수 있습니다.
주기적 실행 : 특정 시간 간격마다 주기적으로 데이터를 전달할 수 있도록 설정할 수 있습니다.
수동 트리거 : 사용자가 직접 버튼을 클릭하여 데이터를 전달할 수 있습니다.
3) 설정 방법
노드 추가 : Node-RED 편집기에서 Inject 노드를 작업창에 드래그 앤 드롭합니다.
데이터 유형 설정 : inject 노드를 더블 클릭하여 설정 창을 열고 이름을 “데이터_전달자”이라고 입력합니다. 전달할 데이터의 유형을 숫자, 문자열, JSON 등으로 정할 수 있습니다. 테스트로 “테스트 메시지”를 입력합니다.
타이밍 설정 : 주기적 실행을 원할 경우, 전달할 시간 간격을 설정합니다. 예를 들어, 매 1분마다, 매 시간마다 등으로 설정할 수 있습니다. 반복 항목에 “지정한 시간간격”을 선택하고 원하는 시간간격을 입력합니다. 여기서는 10초를 정했습니다.
“완료” 버튼을 눌러 노드 설정을 저장하고 주기적으로 데이터가 전달되는 것을 확인하기 위해서 debug 노드와 연결합니다.
주기 데이터 확인 : “배포하기” 눌러 실행시키고 왼쪽에 디버그 버튼 눌러 메시지 창을 보면 10초마다 메시지가 나타나는 것을 알 수 있습니다.
2. DB에 주기적으로 데이터 추가하기
DB query 테스트하기 위한 사전 준비 작업이 있어야 아래 내용을 확인할 수 있습니다.
1) MariaDB 설정: MariaDB 서버와 데이터베이스가 설정
(테스트 설정 : database : userdb / table : testtable )
2) 테스트용 테이블 생성 쿼리
CREATE TABLE testtable (
id INT AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(255),
date_column DATETIME DEFAULT CURRENT_TIMESTAMP
);
3) Node-RED 설정: Node-RED가 설치
4) Node-RED 추가 라이브러리 : Node-RED 플로우 라이브러리(파렛트 관리)에서 node-red-node-mysql 노드를 설치해야 합니다.
“1. Inject node ” 이어서 DB에 자동으로 값을 넣으려면 플로우를 아래와 같이 연결합니다.
Inject(데이터_전달자) 설정 : DB에 데이터를 삽입할 주기를 설정합니다. payload는 String으로 설정해서 table에 임시로 넣을 값을 입력합니다.
function 노드에 query가 연동될 수 있게 코드를 입력합니다.
Inject에서 전달된 데이터(payload)가 query에 data 변수에 바인딩되어 전달됩니다.
var data = msg.payload;
msg.topic = "INSERT INTO testtable (data, date_column) VALUES (?, NOW())";
msg.payload = [data];
return msg;
Mysql 노드에는 테스트할 Database 연결 정보를 입력합니다.
데이터가 전달될 때마다 디버그 화면에 내용이 나타납니다.
Database client 프로그램을 통해서 table에 저장된 데이터 확인해 보면 사용자가 설정한 주기로 데이터가 저장된 것을 확인할 수 있습니다.
참고로, 7일 이전 데이터 주기적으로 7일 이전 데이터를 삭제할 경우 function 노드 코드에 아래와 같이 입력하면 됩니다.
msg.topic = "DELETE FROM testtable WHERE date_column < NOW() - INTERVAL 7 DAY";
return msg;
3. 마무리
MariaDB의 스케줄러 기능을 사용하면 위와 같은 Node-RED에서 할 필요가 없지만, 스케줄러 기능 ON/OFF는 관리자권한이 있어야 하므로 불가능할 수 있습니다. 그래서 Inject의 스케줄러 기능을 대안으로 유사한 작업을 할 수 있음을 확인했습니다.
Inject 노드는 Node-RED에서 매우 유용한 도구로, 다양한 시나리오에서 데이터를 전달하고 흐름을 제어하는 데 필수적인 역할을 합니다. 이를 통해 다른 음성을 주기적으로 알려주는 등 자동화된 작업을 수행할 수 있을 것으로 생각됩니다.
감사합니다.