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

 找回密码
 立即注册
查看: 34682|回复: 40

[插件集成] OpenWRT下的高效Device Tracker:基于hostapd与dnsmasq的事件推送

[复制链接]

2

主题

29

帖子

202

积分

论坛技术达人

积分
202
金钱
168
HASS币
20
发表于 2019-12-30 11:34:44 | 显示全部楼层 |阅读模式
本帖最后由 ttimasdf 于 2019-12-30 11:39 编辑

前言
论坛首发哦~
根据HA官方文档,对连接OpenWRT路由器的设备跟踪,我们有三种方式,一个是基于ubus RPC的定时拉取,一个是基于luci API的定时拉取,还有一种是基于hostapd事件的推送。基于定时拉取的方式,坛子里有人提过(基于RPC的基于MQTT的),缺点人家文档里也提过,查询对路由器来说,那就是CPU负载哇。而且还要往路由器上装额外的库,占地方。
但文档里提的第三种方式,基于hostapd Wi-Fi连接事件的device tracker,原版的脚本(位于Github:mueslo/openwrt_hass_devicetracker)有很多问题,我试了一下基本没法用。因为新Wifi设备连接事件触发时,IP地址还没有分配,而设备名字只有在设备发送DHCP request之后才能获取到,所以推送到Home Assistant的时候只有光秃秃一个mac。然而第二次连接的时候又能获取到mac了,最后我们就会拥有两个名字不一样的device tracker,一个是mac地址命名的,一个是hostname命名的……
所以我对这个脚本做了一些改进,除了hostapd的事件之外,还监听了dnsmasq的事件。dnsmasq发的消息中,一定会告诉我们这个设备的MAC地址、IP地址和hostname,这样推过去的消息就完整了。
功能与优势
继承自原版的优势:
  • 延迟极低,Wi-Fi连接后,在线状态实时推送。断开连接后3分钟报告设备断开(超时时间可配置)。
  • 没有后台进程,推送时系统会拉起一个shell脚本,执行后退出
  • 占用空间小,本体就是几个shell脚本。但这个说法不准确,因为依赖curl,如果你的HA服务器是https的话,还需要ustream-ssl。Github中有基于netcat的实现,还没merge进主仓库。
我实现的新功能:
  • 监听dnsmasq事件,即使IP变化也能获取到设备的hostname,原版这里会触发bug
  • 增加whitelist白名单功能,只推送指定设备的事件,其他设备忽略
  • 过滤无效事件,如果获取不到hostname就不推送,这样避免同一个设备在HA中出现两个device_tracker。
  • 增加curl_insecure跳过SSL校验功能。因为我家内网和外网的域名是不一样的……不过后来我改hosts给绕过了。
使用方法
  • 安装原版的ipk。(见附件)
  • 用下面的functions.sh 替换路由器中 /usr/lib/hass-tracker/functions.sh (劳资懒得打包……)
  • 在Home Assistant中新建一个长期访问令牌,复制下来,粘贴到下面文件的token字段。
  • 编辑 /etc/config/hass-tracker ,取消对应的注释就代表启用相应的功能。

config hass-tracker 'global'
        option host 'http://your-ha-instance.lan:8123'
        option token 'long-time-token'
        option timeout_conn '24:00'
        option timeout_disc '00:03'
        #option whitelist 'phone1 phone2 laptop'
        #option curl_insecure 1


解释一下参数。
  • timeout_conn:Wi-Fi连接事件、DHCP连接事件会向HA报告一次设备的在线状态,比如上面的配置中,一个设备连接后,脚本会推送设备在线,持续24小时,24小时后,在线状态会自动转变为离开。
  • timeout_disc:Wifi断开连接会向HA报告一次状态。脚本会推送一个持续3分钟的在线状态,3分钟后,设备状态转换为离开。
  • whitelist:白名单,里面是空格隔开的,Wi-Fi主机名。这个主机名可以在Luci的DHCP/DNS那个页面获得。应该是区分大小写的吧,反正我的设备名字都是小写,没测试。
  • curl_insecure:让curl不检查证书。过期呀、主机名不匹配啥的统统不管。

5. 注册dnsmasq事件。

echo "dhcp-script=/usr/lib/hass-tracker/push_event.sh" >> /etc/dnsmasq.conf

6. 启动
/etc/init.d/hass-tracker enable
/etc/init.d/hass-tracker start
/etc/init.d/dnsmasq restart


完成!
如果怕漏掉事件,想要增加轮询功能,可以参考说明文档的最后一段,照着搞就行了。这里不再赘述。
然后在HA里就可以看到效果咯。

                               
登录/注册后可看大图

源代码:

https://github.com/ttimasdf/openwrt_hass_devicetracker

functions.sh (5.35 KB, 下载次数: 124)

hass-tracker_0.1.4-1_all.ipk (2.87 KB, 下载次数: 124)

说好的论坛支持markdown呢……这格式改的我脑壳疼

评分

参与人数 3金钱 +41 HASS币 +20 收起 理由
meiniandad + 1 高手,这是高手!
+ 20 + 20 厉害了word楼主!
Roger + 20 我来瀚思就为看你!

查看全部评分

回复

使用道具 举报

2

主题

29

帖子

202

积分

论坛技术达人

积分
202
金钱
168
HASS币
20
 楼主| 发表于 2019-12-31 13:28:45 | 显示全部楼层
本帖最后由 ttimasdf 于 2019-12-31 13:30 编辑
SkyNet 发表于 2019-12-31 12:32
ha 需要怎么配置??我没看到ha里面有任何变化

HA不需要配置,脚本会调用HA的API往里添加device tracker,如果添加进去了,在事件和历史里面都能看见。

如果啥也没有的话,看一下你的/etc/config里面的配置,在路由器shell里用curl访问一下你填的url,调试一下连接问题。不行就贴logcat上来看看。运行 /etc/init.d/hass-tracker restart 会执行一次刷新,注册所有设备。成功还是失败在logcat里都能看见。
回复

使用道具 举报

19

主题

597

帖子

4043

积分

版主

Rank: 7Rank: 7Rank: 7

积分
4043
金钱
3431
HASS币
40
发表于 2019-12-30 12:18:15 | 显示全部楼层
好文。
目前我是用Ping来实现追踪,请问楼主,您的方法和Ping有什么功能上的区别?
回复

使用道具 举报

2

主题

29

帖子

202

积分

论坛技术达人

积分
202
金钱
168
HASS币
20
 楼主| 发表于 2019-12-30 12:38:52 | 显示全部楼层
whxciotw 发表于 2019-12-30 12:18
好文。
目前我是用Ping来实现追踪,请问楼主,您的方法和Ping有什么功能上的区别? ...

个人感觉ping不够稳定,如果作为自动化的trigger的话,断连容易造成误触发,特别是手机……我有一个手机就是,息屏后就ping不通了(但Wi-Fi是不断的)。而且我的电脑也是禁ping的,所以也有一部分个人需求在里面
回复

使用道具 举报

19

主题

597

帖子

4043

积分

版主

Rank: 7Rank: 7Rank: 7

积分
4043
金钱
3431
HASS币
40
发表于 2019-12-30 13:45:28 | 显示全部楼层
ttimasdf 发表于 2019-12-30 12:38
个人感觉ping不够稳定,如果作为自动化的trigger的话,断连容易造成误触发,特别是手机……我有一个手机就 ...

好的,谢谢解释。
我2部华为是通过ping来追踪,很稳定。1部iphone是安装了HACS里面的一个iphone detect插件,用它来追中,也很稳定。
不论是以上哪种,自手机连通wifi后,大约15s~30s后,HA能触发回家。断wifi后3min,HA则触发离家。
回复

使用道具 举报

6

主题

274

帖子

3933

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3933
金钱
3654
HASS币
0
发表于 2019-12-30 16:31:00 | 显示全部楼层
谢谢楼主分享!
回复

使用道具 举报

123

主题

4626

帖子

1万

积分

管理员

囧死

Rank: 9Rank: 9Rank: 9

积分
16013
金钱
11302
HASS币
45
发表于 2019-12-30 19:25:15 | 显示全部楼层
这个真心牛了,有时间一定测试一下!OP的device tracker终于有救了!
回复

使用道具 举报

7

主题

219

帖子

1298

积分

金牌会员

Rank: 6Rank: 6

积分
1298
金钱
1074
HASS币
0
发表于 2019-12-30 22:51:57 | 显示全部楼层
启动完成哪里看效果???完全做了一遍ha没反应。。。。
回复

使用道具 举报

9

主题

205

帖子

2360

积分

金牌会员

Rank: 6Rank: 6

积分
2360
金钱
2155
HASS币
0
发表于 2019-12-30 23:13:59 | 显示全部楼层
谢谢分享
回复

使用道具 举报

2

主题

29

帖子

202

积分

论坛技术达人

积分
202
金钱
168
HASS币
20
 楼主| 发表于 2019-12-30 23:22:07 | 显示全部楼层
本帖最后由 ttimasdf 于 2019-12-30 23:25 编辑
SkyNet 发表于 2019-12-30 22:51
启动完成哪里看效果???完全做了一遍ha没反应。。。。

运行/etc/init.d/hass-tracker restart的时候,看一看logcat,看看是哪里报错。 http 和 https 一定要写对,程序不会检测它的……

还有就是如果你的HA用了https的话,路由器上可能得按需装 libustream-mbedtls 或者 libustream-openssl ,简单的验证方式就是在路由器上用curl访问一下HA首页看通不通。

还遇到过一个坑就是,openwrt上设置的端口映射,在路由器上是无法通过外网IP、外网端口访问的……我也不知道为啥……反正如果访问不了就用内网IP去访问试试

回复

使用道具 举报

4

主题

339

帖子

3198

积分

论坛元老

Rank: 8Rank: 8

积分
3198
金钱
2859
HASS币
0
发表于 2019-12-31 08:55:32 | 显示全部楼层
ttimasdf 发表于 2019-12-30 23:22
运行/etc/init.d/hass-tracker restart的时候,看一看logcat,看看是哪里报错。 http 和 https 一定要写对 ...

内网设备不能用外网域名和外网IP访问,这个问题我也遇到过,换了个OP固件就解决,很诡异!
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-26 04:33 , Processed in 2.263015 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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