透過MQTT將Mikrotik路由器的系統資訊接入Home Assistant

在Home Assistant HACS商店中有第三方編寫好的Mikrotik Router整合可以使用,它是透過Mikrotik的API來做控制及獲取資訊,基本的功能都有也非常好用。然而Mikrotik路由器的機型眾多,各種機型的硬體配置也不盡相同,以我現在在使用的RB5009UPr+S+IN,有三種電源輸入且都有電壓監測的功能,八個埠也都支援PoE,但可惜的是這些資訊都沒有被列出來。

從官方給的文件中來看,Mikrotik在7.11beta2開始支援MQTT訊息的發佈與接收(RouterOS can act as an MQTT publisher and subscriber),而MQTT訊息發佈的功能是在6.48.3的版本中就已經有了。不過MQTT要安裝IoT套件才會有,它並不是預設就有的功能。

安裝IoT套件

MikroTik Routers and Wireless – Software網頁中,選擇對應的Extra packages,下載後解壓縮就可以看到IoT的套件。

利用winbox將IoT套件的.npk檔拖進File裡,重新啟動路由器就可以完成安裝。

設定MQTT伺服器

我的MQTT伺服器是利用Home Assistant附加功能裡的Mosquitto Broker建立的,IP是192.168.xx.yy,預設埠是1883,由於只是在區域網路內使用,我並沒有啟用SSL的功能。要在Mikrotik裡使用MQTT的功能,要先新增MQTT伺服器。

/iot mqtt brokers
add address=192.168.xx.yy name=Home_Assistant password=mqttpwd username=mqttuser

建立Script與Scheduler

建立一個名為UpdateInformation的Script,Script前半部以獲取三種電源輸入方式的電壓值及PoE總輸出功率為例,可以這樣寫

:local TwoPinVoltage ([/system health get [find name="2pin-voltage"] value]) # 取出2pin的輸入電壓值並儲存於TwoPinVoltage變數中
:local JackVoltage ([/system health get [find name="jack-voltage"] value]) # 取出jack的輸入電壓值並儲存於TwoPinVoltage變數中
:local POEInVoltage ([/system health get [find name="poe-in-voltage"] value]) # 取出PoE的輸入電壓值並儲存於POEInVoltage變數中
:local POEOutConsumption ([/system health get [find name="poe-out-consumption"] value]) # 取出PoE的輸出功率並儲存於POEOutConsumption變數中

# 將四種變數改寫成JSON格式並發佈
:local data ("{\"TwoPinVoltage\":\"" . $TwoPinVoltage . "\",\"JackVoltage\":\"" . $JackVoltage . "\",\"POEInVoltage\":\"" . $POEInVoltage . "\",\"POEOutConsumption\":\"" . $POEOutConsumption . "\"}")
/iot mqtt publish message=$data broker=Home_Assistant topic=mikrotik/information retain=yes

Script後半部以獲取八個埠的PoE狀態為例,可以用一個for loop來簡化Script的內容,每一個埠的狀態用一條MQTT主題來發佈,可以這樣寫

for i from 1 to 8 step 1 do {
  :local out ([/interface ethernet poe monitor [find name=("ether" . $i)] once as-value ]->"poe-out")
  :local volt ([/interface ethernet poe monitor [find name=("ether" . $i)] once as-value ]->"poe-voltage")
  :local pwr ([/interface ethernet poe monitor [find name=("ether" . $i)] once as-value ]->"poe-out-status")
  :local topic ("mikrotik/ether" . $i)
  :local data ("{\"poe-out\": \"$out\", \"poe-voltage\": \"$volt\", \"poe-out-status\": \"$pwr\"}")
  /iot mqtt publish message=$data broker=Home_Assistant topic=$topic retain=yes
  :delay 3000ms
}

最後建立一個名為UpdateInformation的Scheduler,每三分鐘執行一次UpdateInformation Script。

/system scheduler
add interval=3m name=UpdateInformation on-event=UpdateInformation

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端