智慧家庭 - 使用 HA 的 Device Tracker 组件实现「在家检测」
本文索引:
前言
HA 提供了 Device Tracker 组件用于追踪设备,该组件支持众多 Platform,不同的 Platform 通过不同的手段实现设备位置变化的检测,它们包括但不限于:
- ios: iOS 设备用户的可选
Platform,可通过HomeAssistant iOS App向 HA 上报位置信息。 - Bluetooth Tracker Platform 和 Bluetooth LE Tracker Platform: 通过蓝牙近距离通信技术,HA 主机与蓝牙设备之间的握手以确定设备是否在家,要求 HA 的主机和设备均支持蓝牙硬件
- MQTT(Message Queue Telemetry Transport) Broker Platform: 设备向
MQTT Broker发布位置变化信息,Device Tracker向MQTT Broker拉取位置变化信息实现。要求移动设备安装能够向MQTT服务发送消息的 App。如果使用 HA 内置的 MQTT Server,则 HA 的 iOS App 已集成了发送消息的功能。 - OpenWrt Platform: 通过路由器
OpenWrt系统的DHCP服务进行检测,要求设备与路由器必须位于同一网络 - Nmap Platform: 通过
Nmap扫描接入同一 LAN 中各个设备的 IP 地址实现,同样要求设备与 HA 主机处于同一网络 - iCloud Platform: Apple 设备通过
Find My iPhone功能持续向iCloud报告位置数据,Device Tracker向iCloud拉取位置变化数据。要求设备必须开启Find My iPhone并在Device Tracker组件中提供iCloud的用户名和密码。
可结合多个不同的 Platform 一起使用,Device Tracker 将以最近报告的 Platform 作为参考。如果设备被标记为「在家」,将不会在地图上显示。一旦一个新的设备以某种 Platform 被 device_tracker 组件捕获,则会在 known_devices.yaml 中创建一条该设备的记录,以 DeviceID 标识,并支持以下参数:
name: 设备的友好名称mac: 设备的 MAC 地址,每设备唯一,要使用诸如Nmap或SNMP等network device tracker时必须为设备指定 MAC 地址picture: 指定一张用于快速辨识设备的图片地址,可新建一个与configuration.yaml同级的www目录并将图片放于该目录下,然后使用/local/{picture-file-name}来引用该图片,也可直接使用网络 Urlicon: 为设备指定图标gravatar: 设备主人的 Email 地址,如果设置该值,将覆盖picture参数track: 根据Platform不同可指定yes/on/true值,均表示该设备需要被追踪,否则它的位置和状态将不会更新hide_if_away: 根据Platform不同可指定yes/on/true值,均表示如果设备「不在家」将隐藏consider_home: 该设备「离开家」之后等待多少时间以将该设备标记为「不在家」,单位为秒,该值将重写platform级别的consider_home值
例如,以下节点表示一台设备:
1 | pangoiphonese: |
iOS 用户的专有追踪平台
HA 社区为 iOS 设备的用户提供了特有的 device_tracker platform。
使用 ios 组件
用到的组件:
由于 iOS App 需要连接至家庭服务器的 HA 实例,所以 iOS 组件要求 HA 实例能够以某种方式被外网访问,具体可参考
ddns和port forwarding。
Home Assistant 0.42.4 自开始支持 iOS 版 App,iOS 用户可在 App Store 下载 Home Assistant App 配置连接到自家的 Home Assistant 的服务器,该 App 以 Web App 加载 HA 的实例,并实现了上报位置信息,通知等功能。首先在 App Store 下载 App,填写配置界面相关信息:
设备 ID 代表 HA 在
known_devices.yaml中识别该设备的 ID
要实现和 HA 服务端的通信,还需要在 configuration.yaml 中启用 ios 组件:
1 | ios: |
启用 ios 组件意味着同时启用 device tracker、zeroconf 和 notify 组件:
- 使得 HA 接收由 iOS App 发送的位置信息
- HA 将通知推送至 App,
- HA 接收 iOS 设备的
sensor信息
重启 HA 实例,之后 iOS App 便会在适当的时刻向指定服务器报告当前设备的信息。由于 Apple 报告位置信息的时机没有对外公开,手机在家时 iOS App 也会时不时向服务器报告位置,为了解决这个问题,在zones.yaml文件中禁用 iOS 设备追踪:1
2
3
4
5
6- name: Home
latitude: xx.xxxxxx
longitude: yy.yyyyyy
radius: 250
icon: mdi:account-multiple
track_ios: false
使用 iCloud 组件
iOS 用户的另一个选择是使用 iCloud Platform,可在 configuration.yaml 文件中添加如下节点:
1 | device_tracker: |
iCloud Platform 提供了以下参数:
username: Apple Id,必填password: Apple Id 的密码,必填account_name: 自定义名称max_interval: 当 Apple 设备静止时使用的位置更新间隔时间,以分钟为单位,默认值为 30 分钟。。当设备移动时,位置更新时间为 1 分钟一次。gps_accuracy_threshold: 位置变化触发更新的阈值,以米为单位,默认值为 1000 米。这意味着当 gps 变化小于 1000 米时,device_tracker将不会更新设备的状态。
设置好 iCloud Platform 之后,重启 HA,此时面板中将出现一个 Configurator 询问要使用该 Apple Id 下关联的哪一个设备作为受信任的设备:
点击 CONFIGURE 按钮,弹出以下对话框,输入代表设备的索引值(此处为 0),点击 Confirm,等待接收短信验证码:
受到手机验证码之后,再次点击 Configurator 的 CONFIGURE 按钮,填入验证码:
等待 HA 与 iCloud 通信完成之后,HA 的面板中会出现代表该设备的 sensor,设置完成。Apple 对这种认证的有效期通常为 2 个月,2 个月之后需要重新认证。
使用 MQTT Broker 组件追踪设备
MQTT 是基于 TCP/IP 定义的专用于 IoT 的通信协议,采用轻量级的订阅/发布消息传输。HA 提供了支持 MQTT Broker 组件,HA 实例和移动设备无需直接通信,而是借助 MQTT Broker 作为通信桥梁。HA 也支持了运行内置的 MQTT 消息代理。要使用内置的 MQTT 组件,在 configuration.yaml 中加入以下配置:
1 | mqtt: |
该组件提供了以下参数:
broker:MQTT Broker服务所在主机的 IP 地址或主机名,可选port:MQTT Broker服务连接所使用的端口,可选,默认值为 1883client_id: HA 访问MQTT Broker服务时所使用的客户端 ID,字符串类型,可选,默认值随机生成keep_alive: 发送keep_alive消息的时间间隔,单位为秒,可选,默认值为 60username: 访问MQTT Broker服务的用户名,可选password: 与username对应的密码,可选protocol: 使用的协议版本,可选值为 3.1 或 3.1.1,默认使用 3.1.1,如果服务不支持则使用 3.1certificate: 证书文件的物理路径,可选为 HA 添加第三方 MQTT Broker
官方推荐使用第三方服务商以确保稳定性,此处选择 CloudMQTT 作为MQTT Broker,其Cat Plan(免费) 最大支持5个并行连接。创建完帐号后,登录到后台,创建专用用户ha及密码,在ACLs面板下选中Topic,选择ha用户,topic输入#: 在 HA 的configuration.yaml中引入MQTT Broker组件并填入以下参数:配置好1
2
3
4
5
6mqtt:
broker: CLOUTMQTT_SERVER // address for the server
port: CLOUDMQTT_PORT // SSL Port
certificate: auto // load corresponding certificate
username: CLOUDMQTT_USER // ha user
password: CLOUDMQTT_PASSWORD // password for hamqtt broker之后,重启 HA 实例,可在其 Web UI 上发现一个新的按钮,并通过发送相应的消息来测试该功能:
为 Device Tracker 组件添加 MQTT Platform
Device Tracker 组件支持 MQTT Platform 平台(MQTT Device Tracker),在 configuration.yaml 中加入以下配置信息:
1 | device_tracker: |
配置好 mqtt platform 之后,被追踪的设备需要以某种方式向远端 mqtt broker 发送消息,否则 HA 将无消息可拉取。官方推荐了 owntracks platform 作为 iOS/Android 设备的消息推送方案,HA 服务端也需要开启 owntracks 组件以设置相关的配置,于是,修改上面的配置用 owntracks platform 代替 mqtt platform:
1 | device_tracker: |
owntracks platform 支持一些额外的参数:
max_gps_accuracy: 设置上报位置信息的最大变化阈值,以过滤在某些情况下的 GPS 错误数据上报,避免造成副作用。可选,默认值 200waypoints:OwnTracksApp 用户可定义WayPoints区域,与 HA 的 Zone 类似,用户可选择在 App 端导出WayPoints而 HA 可将其映射为Zone。可选,默认值为truesecret: Payload 加密密钥,当使用第三方或公共 MQTT 服务商时可能希望对发送的位置数据进行加密。可选,默认值为空,该参数要求 HA 主机安装了libsodium库mqtt_topic: HA 订阅 MQTT Broker 的消息模板。可选,默认值为owntracks/#events_only: 仅拉取地图区域的进入与离开信息,不关注移动设备的位置变更信息。可选,默认值为falseregion_mapping: 配置OwnTracks定义的Region与 HA 实例定义的Zone。字典结构,可选
为手机安装 OwnTracks 发送位置变化消息
OwnTracks 是一个免费开源的位置数据共享 App,支持以 HTTP 或 MQTT 协议向指定服务端发送位置数据。从 App Store 或 Android 应用市场下载 OwnTracks,此处以 iOS 为例,点击左上角的 i -> Settings,填入在 CloudMQTT 实例上获取的配置信息:
解释为文本版的配置信息为:
1 | Mode: MQTT |