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

 找回密码
 立即注册
查看: 9652|回复: 18

总结:小米路由器改造,实现HA WAN口和温度监控、远程接入

[复制链接]

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11443
金钱
8512
HASS币
460

教程狂人突出贡献

发表于 2021-4-9 21:18:42 | 显示全部楼层 |阅读模式
本帖最后由 XCray 于 2021-10-17 09:20 编辑

前几天手贱在手机app上升级了小米AX1800固件,导致了之前配置好的玩法失效,只好手动降级重新配置,顺便总结记录一下。

以前说过,小米的路由器看着很高大上,硬件也确实不差,但软件做的实在太垃圾,IPv6几乎形同虚设(之前发过帖子)。如果有合适的可以直接运行原生OpenWRT的更为理想。

0. 效果/目标
- HA和群晖的远程接入,基于IPv6
- 对WAN口状态进行监控,在警戒状态下异常断网时自动发短信告警
- HA中增加路由器CPU温度传感器
本文所述方法/思路适用于小米AX3600/AX1800/AX5/AC2100等型号,其实大部分基于OpenWRT的路由器都可以参考。

1. 恢复固件版本1.0.378,以便开启SSH,确认取消app侧的固件自动升级。最新版1.0.385已修补开启ssh所用的漏洞。

2. 开启ssh。参考https://www.right.com.cn/forum/f ... ypeid%26typeid%3D44
在浏览器地址栏输入:
http://x.x.x.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=xcray&ssid=-h%3B%20nvram%20set%20ssh_en%3D1%3B%20nvram%20commit%3B%20sed%20-i%20's%2Fchannel%3D.*%2Fchannel%3D%5C%22debug%5C%22%2Fg'%20%2Fetc%2Finit.d%2Fdropbear%3B%20%2Fetc%2Finit.d%2Fdropbear%20start%3B
回车即可

3. 计算root密码,或者干脆直接修改root密码:
http://x.x.x.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=xcray&ssid=-h%3B%20echo%20-e%20'admin%5Cnadmin'%20%7C%20passwd%20root%3B

4. 确认开启IPv6并设置为Native模式,然后修改防火墙规则,以实现外网接入:
ssh登录后修改/etc/config/firewall,打开特定端口的转发(反对简单粗暴的关闭ipv6防火墙的做法,不安全):
config rule
        option src 'wan'
        option family 'ipv6'
        option target 'ACCEPT'
        option dest 'lan'
        list proto 'tcp'
        option name 'Allow-5080'
        option dest_port '5080'
示例端口号根据需要修改,可以开放多个端口。
然后,/etc/init.d/firewall reload一下,就可以从外网访问内网主机的相应端口了。(最近发现移动宽带已经不行了,即使把ipv6防火墙都关了也无法实现外网访问,可气!)。
20210414修正:其实不是宽带的问题,还是自己学艺不精,在群晖技术支持的帮助下解决了——可能是群晖版本升级修改了默认值,导致ipv6默认网关丢失,从而导致ddns无法获取ipv6地址以及无法从外网访问的现象。

5. wan口状态监控
5.1 在HA配置中增加wan口状态传感器:
binary_sensor:
  - platform: mqtt
    state_topic: "openwrt/pppoe-wan"
    json_attributes_topic: "openwrt/wan-ip"
    name: internet
    device_class: connectivity
5.2 在路由器/etc/hotplug.d/iface目录下增加一个文件,比如99-wan_mon,内容如下:
#!/bin/sh
MQTTSVR=x.x.x.x
date >> /tmp/hotp.log
[ "$INTERFACE" = "wan_6" ] && [ "$ACTION" = "ifupdate" ] && (
    wanip=$(ifconfig pppoe-wan | awk '/inet addr/{print substr($2,6)}')
    lan6ip=$(ifconfig br-lan | grep Scope:Global | awk '{print $3}' | cut -d'/' -f1)
    mosquitto_pub -h $MQTTSVR -t openwrt/wan-ip -m "{"wan-ip":""$wanip"","lan-ip6":""$lan6ip""}" -r
    mosquitto_pub -h $MQTTSVR -t openwrt/pppoe-wan -m ON -r
    echo "ipv6 updated: $wan6ip" >>/tmp/hotp.log )

[ "$INTERFACE" = "wan" ] || exit 0
[ "$ACTION" = "ifdown" ] && ( mosquitto_pub -h $MQTTSVR -t openwrt/pppoe-wan -m OFF -r;echo 'wan down'>>/tmp/hotp.log )
[ "$ACTION" = "ifup" ] && ( mosquitto_pub -h $MQTTSVR -t openwrt/pppoe-wan -m ON -r;echo 'wan up'>>/tmp/hotp.log )
[ "$ACTION" = "ifupdate" ] && (
    wanip=$(ifconfig pppoe-wan | awk '/inet addr/{print substr($2,6)}')
    lan6ip=$(ifconfig br-lan | grep Scope:Global | awk '{print $3}' | cut -d'/' -f1)
    mosquitto_pub -h $MQTTSVR -t openwrt/wan-ip -m "{"wan-ip":""$wanip"","lan-ip6":""$lan6ip""}" -r
    mosquitto_pub -h $MQTTSVR -t openwrt/pppoe-wan -m ON -r
    echo "ip updated: $wanip" >>/tmp/hotp.log )

-r设置为保留消息,便于ha重启后状态的保持。

别忘了修改MQTTSVR的IP地址。然后给这个文件增加可执行权限。
原理:
OpenWRT的Hotplug机制,在发生网络接口变动事件后,会自动执行/etc/hotplug.d/iface目录下的所有可执行文件。
当然,还有其他类型的事件,比如USB等

6. 路由器CPU温度监控
6.1 在HA中增加相应传感器:
sensor:
  - platform: mqtt
    name: rtTemp
    icon: 'mdi:thermometer'
    state_topic: 'openwrt/temp'
    device_class: temperature
    unit_of_measurement: °C
6.2 在路由器/etc/crontabs/root中增加一行:
*/5 * * * * mosquitto_pub -h x.x.x.x -t openwrt/temp -m `cat /sys/class/thermal/thermal_zone0/temp`
意为每5分钟读取一次CPU温度并通过mqtt发布

7. 其他
实现远程接入,还有一个必不可少的要素就是DDNS,我是利用群晖实现的。
近期发现不行了,群晖最新版本下无法自动获取本机ipv6地址,也就无法自动刷新ddns,等群晖技术支持的答复。。。(已解决,见前文)
恢复出厂设置后即使用原来正确的备份恢复,IPv6也仍然会保持关闭状态(即没有被正确备份),需手动重新开启。

评分

参与人数 2金钱 +25 HASS币 +20 收起 理由
neoyang + 5
+ 20 + 20 厉害了word楼主!

查看全部评分

回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11443
金钱
8512
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-4-9 21:56:49 | 显示全部楼层

弃用了MQTT,改为Rest API,更简洁、更优雅

本帖最后由 XCray 于 2022-7-9 19:59 编辑

做一个脚本(这个是获取CPU温度):
#!/bin/sh
temp=`cat /sys/class/thermal/thermal_zone0/temp`
json="{"state":"$temp", "attributes": {"unit_of_measurement": "°C"}}"
curl -X POST -H "Authorization: Bearer XXXXXXX" -H "Content-Type: application/json" -d "$json" http://homeassistant:8123/api/states/sensor.rttemp
根据需要事件触发(如hotplug)或定时触发(crontab)。
此例在/etc/crontabs/root里增加一行,每15分钟执行一次:
*/15 * * * * /root/temprpt >/dev/null 2>&1

回复

使用道具 举报

76

主题

1357

帖子

1万

积分

元老级技术达人

积分
18296
金钱
16899
HASS币
290
发表于 2021-4-9 22:39:29 | 显示全部楼层
这个要学习学习, openwrt 是否也可以用这一句?
在路由器/etc/crontab/root中增加一行:
*/5 * * * * mosquitto_pub -h x.x.x.x -t openwrt/temp -m `cat /sys/class/thermal/thermal_zone0/temp`

pve主机中是否也有类似的语句或脚本?
回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11443
金钱
8512
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-4-10 08:07:52 | 显示全部楼层
dscao 发表于 2021-4-9 22:39
这个要学习学习, openwrt 是否也可以用这一句?

pve主机中是否也有类似的语句或脚本? ...

可以啊,基本上所有基于OpenWRT、或者基于Linux的系统都可以使用crontab设定计划任务。

只是温度读取的路径、mosquitto客户端是否需要单独安装等,要看具体系统
回复

使用道具 举报

76

主题

1357

帖子

1万

积分

元老级技术达人

积分
18296
金钱
16899
HASS币
290
发表于 2021-4-11 01:39:41 | 显示全部楼层
XCray 发表于 2021-4-10 08:07
可以啊,基本上所有基于OpenWRT、或者基于Linux的系统都可以使用crontab设定计划任务。

只是温度读取的 ...

谢谢!终于可以了。

openwrt系统:
opkg update
opkg install libmosquitto-nossl
opkg install mosquitto-client-nossl

在路由器/etc/crontabs/root或计划任务中增加一行:
*/5 * * * * mosquitto_pub -h XXX.XXX.XXX.XXX -u username -P password -t openwrt/temp -m `sensors | tail -n +8 |cut -c16-19`

PVE系统:
apt-get update -y
apt-get install -y mosquitto-clients
在路由器/etc/crontab文件中增加一行:
*/5 * * * * mosquitto_pub -h XXX.XXX.XXX.XXX -u username -P password -t pve/temp -m `sensors | tail -2 |cut -c17-20`
回复

使用道具 举报

0

主题

83

帖子

698

积分

高级会员

Rank: 4

积分
698
金钱
615
HASS币
0
发表于 2021-4-14 08:46:13 | 显示全部楼层
太感谢了,回去试试
回复

使用道具 举报

7

主题

66

帖子

374

积分

中级会员

Rank: 3Rank: 3

积分
374
金钱
308
HASS币
0
发表于 2021-4-15 09:36:43 | 显示全部楼层
太感谢了,回去试试
回复

使用道具 举报

32

主题

1992

帖子

5063

积分

论坛元老

Rank: 8Rank: 8

积分
5063
金钱
3071
HASS币
50
QQ
发表于 2021-6-24 21:51:25 | 显示全部楼层
膜拜大佬。
我不生产技术,我只是技术的搬运工。
回复

使用道具 举报

1

主题

64

帖子

620

积分

高级会员

Rank: 4

积分
620
金钱
556
HASS币
0
发表于 2021-8-15 20:10:41 | 显示全部楼层
弱弱的问下,这个需要刷OpenWrt才行吗,还是说只需要获取ssh权限即可呢?刚看了OpenWrt的教程,比较复杂,只是想能检测路由器的外网是否连接即可。对于刷OpenWrt并无需求。
回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11443
金钱
8512
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-8-15 20:44:36 | 显示全部楼层
本帖最后由 XCray 于 2021-8-15 20:54 编辑
sujiayin0 发表于 2021-8-15 20:10
弱弱的问下,这个需要刷OpenWrt才行吗,还是说只需要获取ssh权限即可呢?刚看了OpenWrt的教程,比较复杂, ...

理论上任何系统都可以,前提是你得知道自己的路由器如何获取外网连接状态变动的事件通知(当然也可以轮询)、以及如何通知ha(mqtt只是一种方法,当然还有其他方法)。

甚至可以通过路由器大部分都支持的web界面或其他接口(比如rsyslog、比如snmp,比如其他api等等)查询状态然后提交到ha,都是软件方面的事情,只要自己弄明白了,都不是困难。

只是我现在恰好用的是openwrt、恰好也喜欢玩ha、恰好也知道openwrt有这么一个方便的方法而已。
前几年我用苹果的时间胶囊,利用其远程日志功能也实现了类似的效果,原来发帖子说过,感兴趣的话可以找来看看。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-25 00:35 , Processed in 4.616265 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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