Node-Red --> MQTT --> Fuxa
FUXA(一個開源的 Web HMI / SCADA 自動化監控軟體)的專案設定檔。
這份設定檔完整定義了 HMI 監控畫面的後端通訊(MQTT 連線、點位標籤)與前端網頁圖形介面(SVG 畫布、視窗排版、開關元件)。
以下為您詳細說明這支程式(專案)的核心結構與運作原理:
一、 後端通訊與標籤設定 (Devices & Tags)
FUXA 透過這個區塊與外界的物聯網設備或 Node-RED 進行資料交換:
通訊客戶端 (MQTT Client):
專案中配置了一個名為
mqtt1的通訊介面,連接到公共的 MQTT 代理伺服器(Broker):mqtt://mqttgo.io:1883。系統內建了一個系統標籤
mqtt1 Connection Status,用來監測此 MQTT 連線是否正常。
點位標籤 (Tags Mapping): 專案中定義了 4 個與前端元件連動的按鈕標籤(Tags),其對應的 MQTT 主題 (Topic) 分別為:
button1 ➔ 訂閱與發送主題:
alex9ufo/btn/1/setbutton2 ➔ 訂閱與發送主題:
alex9ufo/btn/2/setbutton3 ➔ 訂閱與發送主題:
alex9ufo/btn/3/setbutton4 ➔ 訂閱與發送主題:
alex9ufo/btn/4/set
當前端畫面上的開關被切換,或是遠端設備透過這些主題發送數據時,FUXA 都會進行雙向的同步更新。
二、 前端圖形視覺介面 (Views & UI Components)
這部分定義了操作員在瀏覽器畫面上看見的 SCADA / HMI 控制面板:
畫布與主視覺設定 (Views):
建立了一個名為
v_67ba4a88的中大型監控畫面(寬 1520 像素、高 850 像素)。背景顏色設定為帶有科技感的深灰色(
#2A2A2A),非常符合工業自動化控制台的暗色系風格。
前端圖形元件 (SVG Elements): 畫面上配置了數個基於 SVG 向量圖形的動態控制元件,包含:
文字與排版:包含了標題文字,並使用特定字型(如 Arial)與色彩配置。
互動式切換開關 (NGX-SWITCH):畫面上擺放了對應按鈕的網頁開關切換元件。
當開關處於關閉狀態時,畫面上會渲染出紅色、並顯示 "OFF" 字樣的圓形按鈕。
這些開關元件在 HTML/SVG 結構中被賦予了特定的
id,並直接與後端的button1~button4標籤進行綁定(Binding)。
三、 專案整體運作邏輯
這份設定檔在 FUXA 系統中啟動後,會實現以下物聯網(IoT)雙向控制情境:
下達控制指令(發送端): 當操作員在瀏覽器打開這個 FUXA HMI 網頁,手動點擊畫面上的開關由 OFF 變更為 ON 時,FUXA 會立刻透過
mqttgo.io伺服器,向alex9ufo/btn/x/set主題發送變更訊號,藉此操控遠端的實體設備(如 PLC 或 ESP32 開發板)。接收設備狀態(接收端): 如果遠端實體設備的狀態改變(例如由現場按鈕觸發),設備會發送最新的狀態到相同的 MQTT 主題,FUXA 收到通知後,網頁畫面上的紅色 "OFF" 開關就會自動跳轉為 ON 的狀態,達到即時監控的效果。
總結
這是一個非常標準的 Web-based HMI/SCADA(網頁型人機介面)專案設定。它利用 FUXA 的視覺化優勢,結合 MQTT 輕量化通訊協定,為管理員提供了一個跨平台、直覺且具備動態反饋的遠端設備控制面板。
Node-RED 的流程設定檔(Flows)。它的核心功能是建立一個網頁圖形介面(Dashboard),讓使用者可以用來遠端控制 4 個虛擬按鈕,並將控制指令透過 MQTT 物聯網通訊協定發送出去,用以控制現場的實體設備(如 HMI 系統 FUXA、PLC 或 LED 燈)。
以下為您詳細拆解這段程式的運作邏輯與各個節點的功能:
1. 核心運作邏輯(運作流程)
這段程式主要分為兩大邏輯區塊:
【發送控制端】網頁開關 ➔ 發送 MQTT 指令: 當使用者在 Node-RED 網頁上切換「遠端控制按鈕」時,程式會根據開關狀態(開啟/關閉),透過 MQTT 發送數字
1或0到雲端 MQTT 伺服器,用來設定遠端設備。【接收監聽端】監聽 MQTT ➔ 偵錯輸出: 程式另外拉出了一條線,專門監聽控制按鈕 1 的主題(Topic)。只要該主題有任何資料變動,就會在 Node-RED 的後台偵錯視窗(Debug)印出數值,方便開發者確認指令是否有成功送出。
2. 節點詳細功能說明
⓵ 使用者介面(UI Dashboard 節點)
ui_tab(工業物聯網控制台) &ui_group(現場設備控制 (4按鈕)): 在網頁上建立一個名為「工業物聯網控制台」的頁面,並在裡面規劃了一個寬度為 5 的區塊,專門擺放這 4 個按鈕。ui_switch(UI 控制按鈕 1 ~ 4): 這是網頁上的 4 個切換開關(Switch)。當切換到 ON (開啟):會送出數值
1(onvalue": "1")。當切換到 OFF (關閉):會送出數值
0(offvalue": "0")。每個按鈕都有自己獨立的
topic(分別為"1","2","3","4"),代表它們的編號。
⓶ 雲端通訊(MQTT 節點)
mqtt-broker(mqttgo): 這是通訊的基礎設定。這段程式使用了一個免費公開的 MQTT 伺服器,網址為mqttgo.io,通訊連接埠為1883。mqtt out(發送控制指令至 FUXA): 當網頁按鈕被觸發時,這四個節點會負責把1或0打向雲端伺服器,它們發送的 MQTT 主題 (Topic) 分別為:按鈕 1 ➔
alex9ufo/btn/1/set按鈕 2 ➔
alex9ufo/btn/2/set按鈕 3 ➔
alex9ufo/btn/3/set按鈕 4 ➔
alex9ufo/btn/4/set(註:名稱中的 FUXA 代表這些指令預期是要給一個叫做 FUXA 的 Web HMI/SCADA 自動化監控軟體接收並執行的。)
⓷ 監聽與除錯(MQTT In & Debug 節點)
mqtt in節點: 獨立監聽了alex9ufo/btn/1/set(按鈕 1)的主題。當任何地方(不論是網頁端或外部實體設備)更改了按鈕 1 的數值,它都會接收到。debug(debug 392) 節點: 接收到mqtt in的資料後,直接顯示在 Node-RED 介面右側的 Debug 欄位中,用來即時觀測按鈕 1 的狀態變化。
總結
這是一段非常標準的 IoT 設備雙向通訊/控制雛形。使用者只要啟動這個 Node-RED 流程,開啟網頁瀏覽器,就可以直接點擊畫面上的 4 個開關,透過雲端的 mqttgo.io 伺服器,對遠端的工業設備或微控制器(如 ESP32、PLC)進行開關(0與1)控制。
[{"id":"ui.switch.btn1","type":"ui_switch","z":"f8a1b2c3.flow1","name":"UI 控制按鈕 1","label":"🔘 遠端控制按鈕 1","tooltip":"","group":"ui.group.btn","order":1,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"1","topicType":"str","style":"","onvalue":"1","onvalueType":"num","onicon":"","oncolor":"","offvalue":"0","offvalueType":"num","officon":"","offcolor":"","animate":true,"className":"","x":140,"y":220,"wires":[["mqtt.out.btn"]]},{"id":"ui.switch.btn2","type":"ui_switch","z":"f8a1b2c3.flow1","name":"UI 控制按鈕 2","label":"🔘 遠端控制按鈕 2","tooltip":"","group":"ui.group.btn","order":2,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"2","topicType":"str","style":"","onvalue":"1","onvalueType":"num","onicon":"","oncolor":"","offvalue":"0","offvalueType":"num","officon":"","offcolor":"","animate":true,"className":"","x":140,"y":260,"wires":[["ad806271d836e060"]]},{"id":"ui.switch.btn3","type":"ui_switch","z":"f8a1b2c3.flow1","name":"UI 控制按鈕 3","label":"🔘 遠端控制按鈕 3","tooltip":"","group":"ui.group.btn","order":3,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"3","topicType":"str","style":"","onvalue":"1","onvalueType":"num","onicon":"","oncolor":"","offvalue":"0","offvalueType":"num","officon":"","offcolor":"","animate":true,"className":"","x":140,"y":300,"wires":[["dc6f8581d5294e65"]]},{"id":"ui.switch.btn4","type":"ui_switch","z":"f8a1b2c3.flow1","name":"UI 控制按鈕 4","label":"🔘 遠端控制按鈕 4","tooltip":"","group":"ui.group.btn","order":4,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"4","topicType":"str","style":"","onvalue":"1","onvalueType":"num","onicon":"","oncolor":"","offvalue":"0","offvalueType":"num","officon":"","offcolor":"","animate":true,"className":"","x":140,"y":340,"wires":[["62cf2b25030192df"]]},{"id":"mqtt.out.btn","type":"mqtt out","z":"f8a1b2c3.flow1","name":"發送控制指令至 FUXA (SET1)","topic":"alex9ufo/btn/1/set","qos":"1","retain":"false","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"192c2b20bef1e71a","x":450,"y":220,"wires":[]},{"id":"ad806271d836e060","type":"mqtt out","z":"f8a1b2c3.flow1","name":"發送控制指令至 FUXA (SET2)","topic":"alex9ufo/btn/2/set","qos":"1","retain":"false","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"192c2b20bef1e71a","x":450,"y":260,"wires":[]},{"id":"dc6f8581d5294e65","type":"mqtt out","z":"f8a1b2c3.flow1","name":"發送控制指令至 FUXA (SET3)","topic":"alex9ufo/btn/3/set","qos":"1","retain":"false","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"192c2b20bef1e71a","x":450,"y":300,"wires":[]},{"id":"62cf2b25030192df","type":"mqtt out","z":"f8a1b2c3.flow1","name":"發送控制指令至 FUXA (SET4)","topic":"alex9ufo/btn/4/set","qos":"1","retain":"false","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"192c2b20bef1e71a","x":450,"y":340,"wires":[]},{"id":"5067b3d71bbb541e","type":"debug","z":"f8a1b2c3.flow1","name":"debug 392","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":390,"y":400,"wires":[]},{"id":"19327f627d40f5c3","type":"mqtt in","z":"f8a1b2c3.flow1","name":"","topic":"alex9ufo/btn/1/set","qos":"1","datatype":"auto-detect","broker":"192c2b20bef1e71a","nl":false,"rap":true,"rh":0,"inputs":0,"x":150,"y":400,"wires":[["5067b3d71bbb541e"]]},{"id":"ui.group.btn","type":"ui_group","name":"現場設備控制 (4按鈕)","tab":"ui.tab.main","order":1,"disp":true,"width":"5","collapse":false,"className":""},{"id":"192c2b20bef1e71a","type":"mqtt-broker","name":"mqttgo","broker":"mqttgo.io","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"ui.tab.main","type":"ui_tab","name":"工業物聯網控制台","icon":"dashboard","order":1,"disabled":false,"hidden":false}]




































