本帖最后由 XCray 于 2020-5-20 14:50 编辑
原理OpenWRT有一个很棒的特性,叫hotplug,没错,就是那个热插拔,老掉牙的技术?
具体来说呢,就是当网络接口发生变化时,自动执行/etc/hotplug.d/iface目录下的所有可执行文件。
这样,我们就可以在这个目录下存放一个我们制作的脚本、完成我们想让它在发生网络接口变化时去完成的任务。
当然,hass那边还是需要做相应的配合的。
hass方面的准备工作
1. 配置mqtt broker。
使用hass自带的也行,或者自己安装一个更好(著名的mosquitto)。我自己的做法是在路由器上安装了mosquitto,反正路由器是开机时间最长的那个,顺便跑个mosquitto根本不算啥。在hass的configuration.yaml文件中配上就行。都是内网,我也懒得设置用户名密码了。
mqtt:
broker: x.x.x.x #你自己的broker地址
2. 配置传感器
增加一个手动的基于mqtt协议的二进制传感器:
binary_sensor:
- platform: mqtt
state_topic: "openwrt/pppoe-wan"
name: internet
device_class: connectivity
json_attributes_topic: "openwrt/wan-ip"
后面两行不是必须的内容,只是为了看起来更好看、更方便
3. 在路由器的/etc/hotplug.d/iface下面保存一个脚本,名字随便起,比如01wanmon.sh,内容:
#!/bin/sh
date >> /tmp/hotp.log
[ "$INTERFACE" = "wan_6" ] && [ "$ACTION" = "ifupdate" ] && (
wanip=$(ifconfig pppoe-wan | awk '/inet addr/{print substr($2,6)}')
lan6ip=$(ifconfig eth0 | grep Scope:Global | awk '{print $3}' | cut -d'/' -f1)
mosquitto_pub -h 10.0.1.1 -t openwrt/pppoe-wan -m ON
mosquitto_pub -h 10.0.1.1 -t openwrt/wan-ip -m "{"wan-ip":""$wanip"","lan-ip6":""$lan6ip""}"
echo "ipv6 updated: $wan6ip" >>/tmp/hotp.log )
[ "$INTERFACE" = "wan" ] || exit 0
[ "$ACTION" = "ifdown" ] && ( mosquitto_pub -h 10.0.1.1 -t openwrt/pppoe-wan -m OFF;echo 'wan down'>>/tmp/hotp.log )
[ "$ACTION" = "ifup" ] && ( mosquitto_pub -h 10.0.1.1 -t openwrt/pppoe-wan -m ON;echo 'wan up'>>/tmp/hotp.log )
[ "$ACTION" = "ifupdate" ] && (
wanip=$(ifconfig pppoe-wan | awk '/inet addr/{print substr($2,6)}')
lan6ip=$(ifconfig eth0 | grep Scope:Global | awk '{print $3}' | cut -d'/' -f1)
mosquitto_pub -h 10.0.1.1 -t openwrt/pppoe-wan -m ON
mosquitto_pub -h 10.0.1.1 -t openwrt/wan-ip -m "{"wan-ip":""$wanip"","lan-ip6":""$lan6ip""}"
echo "ip updated: $wanip" >>/tmp/hotp.log )
配合上面说的二进制传感器的配置,这个脚本可以在网络接口有任何变化时通过mqtt协议向hass更新名为“internet”的这个二进制传感器的属性,包括连接状态、IPv4和IPv6的地址。如果你不想要地址,有几行可以删掉。
4. 剩下的,就是在hass上定制自动化条目了,相信看到这个帖子的朋友都不陌生,我就不啰嗦了。
|