將路由器溫度經過MQTT協議加入Homeassistant及Homekit

前言

最近入手了一臺斐訊K3路由器,但是博通的芯片發熱太嚴重,想要隨時瞭解路由器的溫度,因而本身動手實現了一組程序來將路由器溫度經過MQTT加入Homeassistant及Homekit.web

準備

  1. 已經獲取root權限的K3路由器
  2. 部署好HomeAssistant的內網服務器
  3. 部署好Node.js的內網服務器

前置知識

  • 基本的Shell編程
  • 基本的HTTP及web服務器知識
  • 基本的MQTT原理
  • 基礎JavaScript編程

軟件結構

最先的想法是直接在路由器上經過Python獲取數據及經過MQTT發送至HASS服務器,可是一個是opkg的源太慢了,另外一個是不想給路由器增長額外負擔(萬一加了測溫軟件溫度漲幾度就尷尬了),最終採用了以下的軟件結構shell

  • 路由器---> Node.js Server ---> Homeassistant

其中路由器到Node.js經過簡單的HTTP,將溫度數據經過JSON發送過來.
Node.js經過Express.js實現web服務器用於接受路由器數據,mqtt包實現mqtt通信,發送給Homeassistant.express

服務器端Shell程序

溫度獲取

首先第一步是獲取路由器的溫度數據:npm

  • CPU
cat /proc/dmu/temperature #CPU溫度
wl -i eth1 phy_tempsense  #2.4GHz無線芯片溫度
wl -i eth2 phy_tempsense  #5GHz無線芯片溫度

運行結果以下:
clipboard.png編程

須要注意的是這裏有一個坑,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

發送溫度數據

HTTP數據約定

GET Method
數據位於data參數下,內容封裝於JSON中,格式以下
{"type":"data","CPU":61,"W24G":51,"W5G":65}bash

curl實現

這裏咱們經過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來管理

Node端程序

HTTP服務器

這裏咱們基本使用了模版提供的功能,因爲咱們這裏只對數據進行透明傳輸,因此JSON不須要反序列化

router.get('/', function(req, res, next) {
  var data = req.query.data
  res.render('index', { title: 'Express' });
});

MQTT客戶端

MQTT數據約定

咱們的數據分別放在三個Topic下

homeassistant/sensor/K3/CPU/state
homeassistant/sensor/K3/24G/state
homeassistant/sensor/K3/5G/state

MQTT實現

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不可重複,後來者將踢出原先的客戶端

Node完整程序

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;

HomeAssistant配置

咱們這裏使用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 }}'

效果

clipboard.png

clipboard.png

相關文章
相關標籤/搜索