前言我最近买了一个PhicommK3路由器,但是Broadcom的芯片太热了。想随时了解路由器的温度,于是自己实现了一套程序,通过MQTT将路由器温度添加到Homeassistant和Homekit中。已获取root授权K3路由器部署HomeAssistant内网服务器部署Node.js内网服务器前提知识Shell编程基础HTTP和Web服务器基础知识MQTT基础基础JavaScript编程基础通过Python获取数据,通过MQTT发送到HASS服务器,但一是opkg的源太慢,二是不想给路由器增加额外的负担(加了测温软件温度升高几度就尴尬了),最后采用如下软件结构router--->Node.jsServer--->Homeassistant其中router到Node.js通过简单的HTTP通过JSON发送温度数据。Node.js通过Express.js实现web服务器接收路由数据,mqtt包实现mqtt通信,发送给Homeassistant。服务器端Shell程序获取温度的第一步是获取路由器的温度数据:CPUcat/proc/dmu/temperature#CPU温度wl-ieth1phy_tempsense#2.4GHz无线芯片温度wl-ieth2phy_tempsense#5GHz无线芯片温度跑分结果如下:需要注意的是这里有个坑,CPU温度文件不符合UTF-8字符。直接用curl发送会报错。这里我们直接使用cut来处理,这里不考虑温度为3位数的情况(其实不太可能发生)cat/proc/dmu/temperature|cut-c19-20同样,我们也处理另外两个数据wl-ieth1phy_tempsense|cut-c0-2wl-ieth2phy_tempsense|cut-c0-2发送温度数据HTTP数据协议GET方法数据位于data参数下,内容封装在JSON中,格式如下{"type":"data","CPU":61,"W24G":51,"W5G":65}curl实现这里我们通过curl发送数据,这里是GET方法,以备后用方便添加控制信息。数据包格式如下{"type":"data","CPU":61,"W24G":51,"W5G":65}url编码结果为%7B%22type%22:%22data%22,%22CPU%22:61,%22W24G%22:51,%22W5G%22:65%7D我的Node.js服务器地址是192.168.2.103,端口3000所以我们的url是url="http://192.168.2.103:3000/?data=%7B%22type%22:%22data%22,%22CPU%22:$cpu,%22W24G%22:$w24,%22W5G%22:$w5%7D"增加完成程序后无限循环#!/bin/shecho"run.."whiletruedocpu=$(cat/proc/dmu/temperature|cut-c19-20)w24=$(wl-ieth1phy_tempsense|cut-c0-2)w5=$(wl-ieth2phy_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$urlsleep60#设置查询周期为1分钟continuedoneecho"end.."为了保持程序运行,建议使用screen来管理Node端程序HTTP服务器这里我们基本使用模板提供的功能。由于我们这里只是透传数据,JSON不需要反序列化:'表达'});});MQTT客户端MQTT数据协议我们的数据放在三个Topics下homeassistant/sensor/K3/CPU/statehomeassistant/sensor/K3/24G/statehomeassistant/sensor/K3/5G/stateMQTT实现Node端程序。为了方便,我们直接通过webstorm创建Express.js程序模板,将我们的程序放在router/index.js下。记得先用npm安装mqtt包npminstallmqtt我们需要初始化mqtt,填写你的MQTT服务器账号密码(如果没有设置anonymous)varmqtt=require('mqtt');varclient=mqtt.connect('mqtt://192.168.2.103',{用户名:'homeassistant',密码:'password',clientId:'K3Server'});//连接到服务器client.subscribe('presence');注意mqtt中的clientid不能重复,后来者踢出原client端节点完整程序varexpress=require('express');varrouter=express.Router();/*GET首页。*/router.get('/',function(req,res,next){vardata=req.query.dataclient.publish('homeassistant/sensor/K3/CPU/state',data,{qos:0,retain:true});client.publish('homeassistant/sensor/K3/24G/state',数据,{qos:0,retain:true});client.publish('homeassistant/sensor/K3/5G/state',数据,{qos:0,保留:true});res.render('index',{title:'Express'});});varmqtt=require('mqtt');varclient=mqtt.connect('mqtt://192.168.2.103',{用户名:'homeassistant',密码:'hello',clientId:'K3Server'});//连接服务器client.subscribe('presence');module.exports=router;HomeAssistant配置我们这里使用HA自带的MQTTagent配置如下#Sensorssensor:-platform:mqttname:'K3_CPU'state_topic:'homeassistant/sensor/K3/CPU/state'unit_of_measurement:'°C'value_template:'{{value_json.CPU}}'-平台:mqttname:'K3_24'state_topic:'homeassistant/sensor/K3/24G/state'unit_of_measurement:'°C'value_template:'{{value_json.W24G}}'-平台:mqttname:'K3_5'state_topic:'homeassistant/sensor/K3/5G/state'unit_of_measurement:'°C'value_template:'{{value_json.W5G}}'效果
