本帖最后由 neroxps 于 2018-1-21 15:36 编辑
写在最前
一直在尝试wifi追踪是否回家,还有各种解决方案论坛都有,试过大部分人回家几分钟了,homeassistant还是没反应,路由器wifi追踪回家 Android 不亮屏的话是不会连接wifi的(至少我的魅蓝2是这样,即使关闭了锁屏休眠依然不会自动连接wifi)。
甚至论坛有人买了设备做蓝牙定位,但是效果欠佳,思前想后觉得有一个设备一直在扫描蓝牙设备,扫描到就 home,扫描不到就not_home,这样是最简单的。后来折腾了下写了个demo后,就发现《自己寫個藍牙搜尋器檢查是否進入某區域並更新到HA》竟然连 iphone设备都可以使用蓝牙追踪,所以我就改了下,结合我现在的情况写了这个脚本。
实时性绝对一流,但是如果 known_devices.yaml 里面跟踪 track 的设备多的话,其实会减慢速度。
我是用小马V5主机安装 ESXI,安装 debian 系统,homeassistant 是用 hassio 安装的。
到淘宝买了这款USB蓝牙适配器《绿联US192》,Debian 下是免驱的。
sudo apt-get install bluetooth bluez bluez-tools
安装完毕后重启
hciconfig dev
hci0: Type: Primary Bus: USB
BD Address: 00:1A:7D:DD:23:33 ACL MTU: 310:10 SCO MTU: 64:8
UP RUNNING
RX bytes:524360 acl:0 sco:0 events:4109 errors:0
TX bytes:25019 acl:0 sco:0 commands:1768 errors:0
见到以上参数证明蓝牙已经驱动了。
原理
使用 hcitool name $MAC 方法来查询设备是否在家,如在家则通过 Rest_API 更新 device_tracker 的 location_name( home | not_home )。
先决条件
- 运行 docker 的设备必须驱动了蓝牙,能够正常使用蓝牙。
安装
第一步:编辑 Home-Assistant 的 known_devices.yaml 文件
格式如下:
mi3xiaomishouji:
hide_if_away: false
icon:
mac: C4:6A:B7:C5:DD:BF
name: MI3-xiaomishouji
picture:
track: true
vendor: unknown
对于我们来说,只需要编写三个地方。
- mi3xiaomishouji:这个是 Home Assistant device_tracker 的设备ID,必须为英文。
- mac:此处编写需要跟踪设备的蓝牙mac,注意是蓝牙的mac,不是wifi的mac。
- track:此选项控制是否跟踪此设备,如果不需要跟踪则设为 false。
参考自:https://home-assistant.io/components/device_tracker/ known_devices.yaml 部分。
第二步:运行 image
docker run
--net=host
--name bluetooth_scan
-e HA_API_PASSWD="home-assistant_rest_api_passwd"
-e HA_URL="https://home-assistant_url"
-e SLEEP_NUM=2
-v /usr/share/hassio/homeassistant/known_devices.yaml:/known_devices.yaml
-itd neroxps/bluetooth_scan_track
副作用
- 因为是使用 REST_API 更新状态,所以会导致 IOS 和 Android 利用 REST_API 更新设备地理位置被覆盖,导致无法进行地理位置跟踪。(后期看看改一下脚本,做一个mqtt版本就没这个问题了)
- 此方法需要一直占用蓝牙适配器,导致服务器的其他蓝牙服务无法使用。
- 不能与其他基于网络 device_tracker 插件同时使用,因为 known_devices.yaml 的 MAC 只能写一个,这里我们需要写蓝牙的 MAC,我试过自定义叫 btmac 的参数是出错的。
这个镜像是根据 amd64 编译的,所以可能树莓派不能用,我手头上没有树莓派不知道能不能 build 一个支持树莓派的镜像。
源代码:https://github.com/neroxps/bluetooth_scan_track
Docker:https://hub.docker.com/r/neroxps/bluetooth_scan_track/
|