最近入手了一臺斐訊K3路由器,但是博通的芯片發熱太嚴重,想要隨時瞭解路由器的溫度,因而本身動手實現了一組程序來將路由器溫度經過MQTT加入Homeassistant及Homekit.web
最先的想法是直接在路由器上經過Python獲取數據及經過MQTT發送至HASS服務器,可是一個是opkg的源太慢了,另外一個是不想給路由器增長額外負擔(萬一加了測溫軟件溫度漲幾度就尷尬了),最終採用了以下的軟件結構shell
其中路由器到Node.js經過簡單的HTTP,將溫度數據經過JSON發送過來.
Node.js經過Express.js實現web服務器用於接受路由器數據,mqtt包實現mqtt通信,發送給Homeassistant.express
首先第一步是獲取路由器的溫度數據:npm
cat /proc/dmu/temperature #CPU溫度 wl -i eth1 phy_tempsense #2.4GHz無線芯片溫度 wl -i eth2 phy_tempsense #5GHz無線芯片溫度
運行結果以下:
編程
須要注意的是這裏有一個坑,CPU溫度的文件中又不符合UTF-8的字符,直接用curl發的話會致使錯誤,這裏咱們直接用cut進行處理,這裏暫時不考慮溫度爲或3位的狀況(事實上不太可能發生)
cat /proc/dmu/temperature|cut -c19-20
同理咱們對另外兩項數據也進行處理json
wl -i eth1 phy_tempsense|cut -c0-2 wl -i eth2 phy_tempsense|cut -c0-2
GET Method
數據位於data參數下,內容封裝於JSON中,格式以下
{"type":"data","CPU":61,"W24G":51,"W5G":65}bash
這裏咱們經過curl來發送數據,這裏是用GET方法,爲了之後增長控制信息方便,數據包格式以下服務器
{"type":"data","CPU":61,"W24G":51,"W5G":65}
通過url encode的結果爲curl
%7B%22type%22:%22data%22,%22CPU%22:61,%22W24G%22:51,%22W5G%22:65%7D
個人Node.js服務器地址是192.168.2.103
,端口3000
因此咱們的url是webstorm
url="http://192.168.2.103:3000/?data=%7B%22type%22:%22data%22,%22CPU%22:$cpu,%22W24G%22:$w24,%22W5G%22:$w5%7D"
#!/bin/sh echo " run.. " while true do cpu=$(cat /proc/dmu/temperature|cut -c19-20) w24=$(wl -i eth1 phy_tempsense|cut -c0-2) w5=$(wl -i eth2 phy_tempsense|cut -c0-2) url="http://192.168.2.103:3000/?data=%7B%22type%22:%22data%22,%22CPU%22:$cpu,%22W24G%22:$w24,%22W5G%22:$w5%7D" curl $url sleep 60 #設置1分鐘的查詢週期 continue done echo " end.. "
爲了讓程序不斷運行,推薦用
screen
來管理
這裏咱們基本使用了模版提供的功能,因爲咱們這裏只對數據進行透明傳輸,因此JSON不須要反序列化
router.get('/', function(req, res, next) { var data = req.query.data res.render('index', { title: 'Express' }); });
咱們的數據分別放在三個Topic下
homeassistant/sensor/K3/CPU/state homeassistant/sensor/K3/24G/state homeassistant/sensor/K3/5G/state
Node端程序爲了方便,咱們直接經過webstorm建立Express.js程序模版,咱們的程序之間放在router/index.js
下
記得用npm安裝mqtt包npm install mqtt
首先咱們須要初始化mqtt,填入你的MQTT服務器帳號密碼(若是未設置匿名)
var mqtt = require('mqtt'); var client = mqtt.connect('mqtt://192.168.2.103',{ username: 'homeassistant', password: 'password', clientId: 'K3Server' }); //鏈接到服務端 client.subscribe('presence');
注意,mqtt中客戶端id不可重複,後來者將踢出原先的客戶端
var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { var data = req.query.data client.publish('homeassistant/sensor/K3/CPU/state', data, { qos: 0, retain: true }); client.publish('homeassistant/sensor/K3/24G/state', data, { qos: 0, retain: true }); client.publish('homeassistant/sensor/K3/5G/state', data, { qos: 0, retain: true }); res.render('index', { title: 'Express' }); }); var mqtt = require('mqtt'); var client = mqtt.connect('mqtt://192.168.2.103',{ username: 'homeassistant', password: 'hello', clientId: 'K3Server' }); //鏈接到服務端 client.subscribe('presence'); module.exports = router;
咱們這裏使用HA自帶的MQTT代理,配置以下
# Sensors sensor: - platform: mqtt name: 'K3_CPU' state_topic: 'homeassistant/sensor/K3/CPU/state' unit_of_measurement: '°C' value_template: '{{ value_json.CPU }}' - platform: mqtt name: 'K3_24' state_topic: 'homeassistant/sensor/K3/24G/state' unit_of_measurement: '°C' value_template: '{{ value_json.W24G }}' - platform: mqtt name: 'K3_5' state_topic: 'homeassistant/sensor/K3/5G/state' unit_of_measurement: '°C' value_template: '{{ value_json.W5G }}'