簡介
Node-RED 是由 IBM 開發的基于 Node.js 的開源可視化編程工具,通過圖形化界面組裝連接各種節點,實現物聯網設備、API 及在線服務的連接。同時支持多協議、跨平臺,社區活躍,適用于智能家居、工業自動化等場景的事件驅動應用開發,其主要特點是低代碼、可視化。
TDengine 與 Node-RED 深度融合為工業 IoT 場景提供全棧式解決方案。通過 Node-RED 的 MQTT/OPC UA/Modbus 等協議節點,實現 PLC、傳感器等設備毫秒級數據采集。同時 Node-RED 中基于 TDengine 的毫秒級實時查詢結果,觸發繼電器動作、閥門開合等物理控制,實現更實時的聯動控制。
node-red-node-tdengine 是 TDengine 為 Node-RED 開發的官方插件,由兩個節點組成:
- tdengine-operator:提供 SQL 語句執行能力,可實現數據寫入/查詢/元數據管理等功能。
- tdengine-consumer:提供數據訂閱消費能力,可實現從指定訂閱服務器消費指定 TOPIC 的功能。
前置條件
準備以下環境:
- TDengine 3.3.2.0 及以上版本集群已部署并正常運行(企業/社區/云服務版均可)。
- taosAdapter 能夠正常運行,詳細參考 taosAdapter 參考手冊。
- Node-RED 3.0.0 及以上版本,Node-RED 安裝。
- Node.js 語言連接器 3.1.8 及以上版本,可從 npmjs.com 下載。
- node-red-node-tdengine 插件 1.0.0 及以上版本,可從 npmjs.com 下載。
以上各安裝組件調用關系如下圖:
配置數據源
插件數據源在節點屬性中配置,通過 Node.js 語言連接器 連接數據源,配置步驟如下:
-
啟動 Node-RED 服務,使用瀏覽器進入 Node-RED 主頁。
-
畫布左側在節點選擇區域選擇 tdengine-operator 或 tdengine-consumer 節點拖至畫布。
-
雙擊畫布中選中節點,彈出屬性設置窗口,填寫數據庫連接信息:
- tdengine-operator 節點連接串格式:
ws://user:password@host:port
- tdengine-consumer 節點連接串格式:
ws://host:port
更多詳細內容請點擊畫布右側上方區域中字典圖標按鈕,參考在線幫助文檔。
- tdengine-operator 節點連接串格式:
-
配置完成后,點擊右上角“部署”按鈕,節點狀態為綠色,表示數據源配置正確且連接正常。
驗證方法
tdengine-operator
參考下一節“使用示例->采集數據”章節:
- 配置好 tdengine-operator 數據庫連接屬性。
- 節點前增加 inject 節點,配置 msg.topic 為預期寫入 SQL。
- 點擊 inject 節點“注入”按鈕觸發 SQL 執行。
- 使用 taos-CLI 查詢預期寫入數據是否存在,驗證寫入成功。
tdengine-consumer
參考下一節“使用示例->數據訂閱”章節:
- 配置好 tdengine-consumer 節點訂閱各屬性。
- 其后增加 debug 節點。
- 在節點屬性中勾選“節點狀態”,下拉列表中選擇“消息數量”。
- 使用 taos-CLI 向 TOPIC 所在表寫入一條數據。
- 觀察 debug 節點計數預期會加 1。
- 驗證輸出 payload 數據預期與寫入數據一致。
- 全部符合預期即為驗證成功。
使用示例
場景準備
場景介紹
某生產車間有多臺智能電表,電表每一秒產生一條數據,數據準備存儲在 TDengine 數據庫中,要求實時輸出每分鐘各智能電表平均電流、電壓及用電量,同時要對電流 > 25A 或電壓 > 230V 負載過大設備進行報警。
我們使用 Node-RED + TDengine 來實現需求:
- 使用 Inject + function 節點模擬設備產生數據。
- tdengine-operator 節點負責寫入數據。
- 實時統計使用 tdengine-operator 節點查詢功能。
- 過載報警使用 tdengine-consumer 訂閱功能。
假設:
- TDengine 服務器:
www.example.com
。 - WEBSOCKET 端口:6041。
- 用戶名/密碼:默認。
- 模擬設備:三臺(d0,d1,d2)。
數據建模
使用數據庫管理工具 taos-CLI,為采集數據進行手工建模,采用一張設備一張表建模思路:
- 創建超級表:meters。
- 創建子表:d0,d1,d2。
建模 SQL 如下:
create database test;
create stable test.meters (ts timestamp, current float, voltage int, phase float ) tags (groupid int, location varchar(24));
create table test.d0 using test.meters tags(1, 'workshop1');
create table test.d1 using test.meters tags(2, 'workshop1');
create table test.d2 using test.meters tags(2, 'workshop2');
業務處理
數據采集
示例使用生成隨機數方式模擬真實設備生產數據,tdengine-operator 節點配置 TDengine 數據源連接信息,并把數據寫入 TDengine,同時使用 debug 節點監控寫入成功數據量并展示于界面。
操作步驟如下:
-
增加寫入節點
- 在節點選擇區域選擇 tdengine-operator 節點,拖動至畫布中。
- 雙擊節點打開屬性設置,名稱填寫 ‘td-writer’,數據庫項右側點擊“+”號圖標。
- 彈出窗口中,名稱填寫 ‘db-server’,連接類型選擇使用字符串連接,輸入:
ws://root:taosdata@www.example.com:6041
- 點擊“添加”并返回。
-
模擬設備產生數據
- 在節點選擇區域選擇 function 節點,拖動至畫布 td-writer 節點前。
- 雙擊節點打開屬性設置,名稱填寫‘write d0’,下面選項卡選擇“運行函數”,填寫如下內容后保存并返回畫布。
// generate randconst value2 = Math.floor(Math.random() * (30 - 5 + 1)) + 5; // 5-30const value3 = Math.floor(Math.random() * (240 - 198 + 1)) + 198; // 198-240const value4 = Math.floor(Math.random() * (3 - 1 + 1)) + 1; // 1-3// sqlmsg.topic = `insert into test.d0 values (now, ${value2}, ${value3}, ${value4});`;return msg;
-
在節點選擇區域選擇 inject 節點,拖動至畫布 write d0 節點前。
-
雙擊節點打開屬性設置,名稱填寫‘inject1’,下拉列表中選擇“周期性執行”,周期選擇每隔 1 秒,保存并返回畫布。
-
重復 1 ~ 4 步完成另外兩臺設備 (d1,d2) 流程。
-
增加信息輸出
- 在節點選擇區域選擇 debug 節點,拖動至畫布 td-writer 節點后。
- 雙擊節點打開屬性設置,勾選“節點狀態”,下拉列表中選擇消息數量。
以上節點增加完成后,依次把上面節點按順序連接起來,形成一條流水線,數據采集流程制作完成。
點擊右上角“部署”按鈕發布修改內容,運行成功后可以看到:
- td-writer 節點狀態變成綠色,表示流程工作正常。
- debug 節點下的數字表示成功采集次數。
向下游節點輸出寫入成功結果,若失敗拋出異常:
{"topic": "insert into test.d1 values (now, 20, 203, 2);","isQuery": false,"payload":{"affectRows": 1,"totalTime": 2,"timing": "961982"}
}
數據查詢
查詢流程由三個節點(inject/tdengine-operator/debug)組成,完成每分鐘實時輸出各智能電表平均電流、電壓及用電量需求。
由 inject 節點完成觸發查詢請求,結果輸出至下游 debug 節點中,節點上顯示查詢執行成功數量。
操作步驟如下:
- 將 inject 節點拖動至畫布中,雙擊節點設置屬性,名稱填寫 ‘query’, msg.topic 填寫并保存并返回畫布:
select tbname, avg(current), avg(voltage), sum(p)
from ( select tbname,current,voltage,current*voltage/60 as p from test.meters where ts > now-60s partition by tbname)
group by tbname;
- 將 tdengine-operator 節點拖動至畫布中,雙擊節點設置屬性,“數據庫”選擇前面已創建好的數據源 ‘db-server’,保存并返回畫布。
- 將 debug 節點拖動至畫布中,雙擊節點設置屬性,勾選“節點狀態”,下拉列表中選擇“消息數量”,保存并返回畫布。
- 依次把以上節點按順序連接起來,點擊“部署”按鈕發布修改內容。
流程啟動成功后:
- td-reader 節點狀態變成“綠色”,表示流程工作正常。
- debug 節點顯示查詢成功次數。
向下游節點輸出查詢結果,若失敗拋出異常:
{"topic": "select tbname,avg(current) ...","isQuery": true,"payload": [{"tbname": "d2","avg(current)": 26.7,"avg(voltage)": 235,"sum(p)": 6329},{"tbname": "d0","avg(current)": 16.5,"avg(voltage)": 222,"sum(p)": 121},{"tbname": "d1","avg(current)": 29,"avg(voltage)": 202,"sum(p)": 5833}]
}
數據訂閱
數據訂閱流程由兩個節點(tdengine-consumer/debug)組成,實現過載告警。
debug 節點展示向下游節點推送數據次數,生產中可把 debug 節點更換為處理訂閱數據的功能節點。
操作步驟如下:
- 使用 taos-CLI 手工創建訂閱主題”topic_overload“, SQL 如下:
create topic topic_overload as select tbname,* from test.meters where current > 25 or voltage > 230;
-
tdengine-consumer 節點拖動至畫布中,雙擊節點設置屬性,填寫如下內容后保存并返回畫布。
- 名稱:td-consumer
- 訂閱服務器:
ws://www.example.com:6041
- 用戶名:root
- 密碼:taosdata
- 訂閱主題:topic_overload
- 消費開始位置:latest
- 其它項保持默認
-
將 debug 節點拖動至畫布中,雙擊節點設置屬性,勾選“節點狀態”,下拉列表中選擇“消息數量”,保存并返回畫布。
-
依次把以上節點按順序連接起來,點擊”部署“按鈕發布修改內容。
流程啟動成功后可看到 td-consumer 節點狀態變成“綠色”表示流程工作正常,debug 節點數字表示消費次數,如下圖:
向下游節點推送的過載設備警告信息,若失敗拋出異常:
{"topic": "topic_overload","payload": [{"tbname": "d1","ts": "1750140456777","current": 31,"voltage": 217,"phase": 2,"groupid": 4,"location": "California.MountainView"}],"database": "test","vgroup_id": 4,"precision": 0
}
異常捕獲
在數據采集、查詢及訂閱流程中,發生錯誤均按拋出異常機制來處理,需建立異常監控流程:
- 將 catch 節點拖動至畫布中。
- 雙擊節點打開屬性設置,名稱填寫 ‘catch all except’,捕獲范圍選擇“所有節點”。
- 將 debug 節點拖動至畫布 catch all except 節點后。
- 雙擊節點設置屬性,勾選“節點狀態”,下拉列表中選擇“消息數量”,保存并返回畫布。
- 依次把以上節點按順序連接起來,點擊”部署“按鈕發布修改內容。
流程啟動后監控所有節點異常產生:
- debug 節點展示發生異常數量。
- 可通過 NODE-RED 日志系統查看異常詳細。
運行效果
以上流程制作完成后,點擊“部署”發布,進入運行狀態,如下:
總結
本文通過工業監控場景展示了:
- Node-RED 與 TDengine 的三種集成模式:
- 數據采集(tdengine-operator 寫入)
- 實時查詢(tdengine-operator 查詢)
- 事件驅動(tdengine-consumer 訂閱)
- 完整的錯誤處理機制
- 生產環境部署參考方案
本文側重從示例角度介紹,全部功能文檔請在 Node-RED 節點在線文檔中獲取。