最近入手了一台斐讯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 }}'