『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 7469|回复: 7

将路由器温度通过MQTT协议加入Homeassistant及Homekit

[复制链接]

2

主题

9

帖子

102

积分

论坛分享达人

积分
102
金钱
93
HASS币
0
发表于 2019-7-2 12:11:36 | 显示全部楼层 |阅读模式
本帖最后由 Hydrogen 于 2019-7-2 12:28 编辑

最近入手了一台斐讯K3路由器,可是博通的芯片发热太严重,想要随时了解路由器的温度,于是自己动手实现了一组程序来将路由器温度通过MQTT加Homeassistant及Homekit.

#准备
1. 已经获取root权限的K3路由器
2. 部署好HomeAssistant的内网服务器
3. 部署好Node.js的内网服务器

#前置知识
- 基本的Shell编程
- 基本的HTTP及web服务器知识
- 基本的MQTT原理
- 基础JavaScript编程

#软件结构
最早的想法是直接在路由器上通过Python获取数据及通过MQTT发送至HASS服务器,但是一个是opkg的源太慢了,另一个是不想给路由器增加额外负担(万一加了测温软件温度涨几度就尴尬了),最终采用了如下的软件结构

- 路由器---> Node.js Server ---> Homeassistant
其中路由器到Node.js通过简单的HTTP,将温度数据通过JSON发送过来.
Node.js通过Express.js实现web服务器用于接受路由器数据,mqtt包实现mqtt通讯,发送给Homeassistant.


#服务器端Shell程序
##温度获取
首先第一步是获取路由器的温度数据:
- CPU
cat /proc/dmu/temperature #CPU温度
wl -i eth1 phy_tempsense  #2.4GHz无线芯片温度
wl -i eth2 phy_tempsense  #5GHz无线芯片温度

运行结果如下: 4067015768-5d1acab01aece_articlex.png


需要注意的是这里有一个坑,CPU温度的文件中又不符合UTF-8的字符,直接用curl发的话会导致错误,这里我们直接用cut进行处理,这里暂时不考虑温度为或3位的情况(事实上不太可能发生)
cat /proc/dmu/temperature|cut -c19-20

同理我们对另外两项数据也进行处理
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}
###curl实现
这里我们通过curl来发送数据,这里是用GET方法,为了以后增加控制信息方便,数据包格式如下
```JSON
{"type":"data","CPU":61,"W24G":51,"W5G":65}
```
经过url encode的结果为
```
%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/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 }}'


#效果 4166173441-5d1ad6adde5f4_articlex.png IMG_8699.PNG







评分

参与人数 2金钱 +40 收起 理由
neroxps + 20 感谢楼主分享!
+ 20 感谢楼主分享!

查看全部评分

回复

使用道具 举报

123

主题

4661

帖子

1万

积分

管理员

囧死

Rank: 9Rank: 9Rank: 9

积分
16412
金钱
11666
HASS币
45
发表于 2019-7-2 12:50:26 | 显示全部楼层
首先感谢楼主分享,提点建议,因为这个再弄个nodejs有点没必要了,不如直接post数据到hass的API上。

我发过相关帖子:

梅林路由器CPU和无线芯片温度接入Home Assistant
https://bbs.hassbian.com/thread-3517-1-1.html

回复

使用道具 举报

40

主题

3056

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11149
金钱
8042
HASS币
182
发表于 2019-7-2 13:05:15 | 显示全部楼层
Jones 发表于 2019-7-2 12:50
首先感谢楼主分享,提点建议,因为这个再弄个nodejs有点没必要了,不如直接post数据到hass的API上。

我发 ...

我感觉直接在路由系统上写个json文件放到http路径下,让ha读就是了。楼主确实比较复杂
Nero
回复

使用道具 举报

123

主题

4661

帖子

1万

积分

管理员

囧死

Rank: 9Rank: 9Rank: 9

积分
16412
金钱
11666
HASS币
45
发表于 2019-7-2 14:27:26 | 显示全部楼层
neroxps 发表于 2019-7-2 13:05
我感觉直接在路由系统上写个json文件放到http路径下,让ha读就是了。楼主确实比较复杂 ...

搞搞看看,这是你特长
回复

使用道具 举报

40

主题

3056

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11149
金钱
8042
HASS币
182
发表于 2019-7-2 14:38:32 | 显示全部楼层
Jones 发表于 2019-7-2 14:27
搞搞看看,这是你特长

我现在特长装修~等装修完了再说。HA我好就没动(只升级不加设备)
Nero
回复

使用道具 举报

9

主题

534

帖子

4530

积分

元老级技术达人

积分
4530
金钱
3986
HASS币
60
发表于 2019-7-2 15:44:54 | 显示全部楼层
应该路由器安装 mqtt 客户端发送,比较简单吧?
回复

使用道具 举报

18

主题

704

帖子

4024

积分

元老级技术达人

积分
4024
金钱
3310
HASS币
60
发表于 2019-7-3 08:29:42 | 显示全部楼层
已经不搞这些虚的了。只添加了安装HASSIO的N1的数据,路由器这块信息被我删了。
回复

使用道具 举报

7

主题

76

帖子

748

积分

高级会员

Rank: 4

积分
748
金钱
672
HASS币
0
发表于 2023-2-16 15:00:25 | 显示全部楼层
要是能加上下载,上传的流量之类就更好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-28 06:43 , Processed in 0.194838 second(s), 33 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表