MQTT+Node-RED + InfluxDB 可視化OpenWRT的系統數據

上一文小U分享了在OpenWRT路由器上部署MQTT服務,每分鐘讀取OpenWRT的系統數值並透過MQTT分發。本文就繼續怎麼把這些每分鐘的一個離散數字、變成時序曲線。例如文章主題圖👆

不同的雞蛋應該放在不同的籃子:系統的分工考量

IoT系統搜集數據和串接很多人都首選Node-RED (nodered.org),因爲它是難得的簡單強大而且免費的應用。本次畫的flow也十分簡單:

由於OpenWRT路由器不是一個善於“長期記憶”的系統(受制與SPI FLASH的天生的短可刷寫壽命),所以數據的搜集儲存並不適合也放在OpenWRT上。

說到儲存數據,就要一個數據庫,小U本來的想法是透過Node-RED爲每個數據點添加一個timestamp,然後再存入數據庫。但後來發現IoT的大家都在InfluxDB之類的自帶時序數據庫,就免除了這一步驟。後來更發現InfluxDB最新版的GUI已經集成了圖表呈現,連Grafana都未必要裝了。

Node-RED和InfluxDB的安裝

小U分享我 Node-RED 和 InfluxDB 的docker-compose 腳本:

# Node-RED

version: "3.7"

services:
  node-red:
    image: nodered/node-red:latest
    environment:
      - TZ=Asia/Taipei
    ports:
      - "1880:1880"
    volumes:
      - ./data:/data
    restart: unless-stopped

要留意Node-RED本身是沒有InfluxDB的Node,需要在 Node-RED 界面的 Manage palette 那裏後加安裝:

# InfluxDB
version: '3'

services:
  influxdb:
    image: influxdb:latest
    volumes:
      # Mount for influxdb data directory and configuration
      - ./data:/var/lib/influxdb2:rw #官網的這段爲什麼要加‘rw’有網友能解釋一下嗎?
      - ./config:/etc/influxdb2
    ports:
      - "8086:8086"
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=influx-user
      - DOCKER_INFLUXDB_INIT_PASSWORD=influx-password
      - DOCKER_INFLUXDB_INIT_ORG=influx-org
      - DOCKER_INFLUXDB_INIT_BUCKET=influx-bucket
    restart: unless-stopped

InfluxDB docker-compose.yaml的environment那裏我加入了首次設定的參數,就不用進行首次設定(但後來發現InfluxDB有網頁GUI – 8086端口登入,其實網頁也很簡單)。

做得不夠好的是我沒有用 network 把兩個container 連接起來,放到同一個 network 會更省系統管理資源和能用 localhost 或 127.0.0.1 來指定自己。

串接MQTT、Node-RED和InfluxDB

Node-RED裡面只需要加入三個Node:

三個node節點的設定截圖如下:

mqtt in 節點
change 節點
influx out節點

最有趣的是change節點那裏可以用JSONata expression直接將 MQTT的單個數字讀數(payload)轉化成JSON格式,交付給InfluxDB。我是讓CHATGPT幫我寫的,因爲我沒接觸過JSONata,一次成功。

在InfluxDB中呈現曲線

InfluxDB網頁登入端口8086,十分現代化的UI設計,要看數據到 Data Explorer,選擇數據所在的 bucket,然後所屬的 measurement , 要顯示的 field ,最後按一下右手邊的 SUBMIT 即可顯示:

忘了說,InfluxDB V2的數據結構叫法和MongoDB是一樣了,“數據庫”改爲了叫“bucket”,更符合object database/Non-SQL database的“行情”。小U在看YouTube學習的視頻是用InfluxDB V1的,操作只限於命令行沒有網頁,名稱還沒有改過來,被搞混亂了一陣。要新增一個 bucket 就在Load Data那裡按 CREATE BUCKET:

撇除教學視頻用到的是InfluxDBV1,其他的我都覺得值得推薦,而且展示也是在RaspberryPi 4B上部署,理論上用Orangepi 3B可以平價替代(300元內能買到最大的快樂:香橙派Orange Pi 3B 評測 | 樹莓派的最佳替代? – by Upsangel):

小U本次是用手搓MQTT的方法,自己用bash去提取OpenWRT系統中的讀數,有沒有更加簡單(懶人)的預設套件,能夠方便我們監控OpenWRT的情況?還真的有!我們下次分享借助火種之神 Prometheus /prəˈmiː.θi.əs/ 的力量來更系統的監控OpenWRT的狀態。

本文是小U的「玩開源、從OpenWRT開始」系列文章的其中一篇。自從Ups-WR30U開源路由器得到大家的熱烈支持,小U也收到了客戶的各種使用OpenWRT的問題查詢,順勢就着手把大家會遇到的,想要用的,都集結成這個系列的文章,希望讓各位從OpenWRT體驗和玩樂開源系統。不需要靠AI,你就能讓路由器變得更”聰明“!

如果你還未有OpenWRT路由器,不妨從 Ups-WR30U 上手吧:

歡迎你的留言討論:

你可以一針見血

by Upsangel
Logo