本帖最后由 shenbo 于 2022-11-23 10:35 编辑
最近一直在折腾通过ESPHOME控制车辆锁、后备箱等设备,由于担心网络连接问题,所以希望有一个本地可以触发解锁的自动化,论坛里https://bbs.hassbian.com/thread-17221-1-1.html,这位兄台是通过NFC解决,实践过程中发现不论通过I2C或SPI总线,只要ESP32到PN532的线缆超过一定长度后,通讯就变得很不稳定,查阅大量资料后发现,两类总线确实对于线缆有长度要求,确保信号稳定,一般情况下I2C可以通过“上拉电阻”方式稳定信号,连接方式可以看下图:
这样可以把线缆控制在5-7米左右,但是ESP32的VDD是3.3V,PN532的VCC是5V,在这样的情况下简单的上拉电阻无法解决问题,网上资料建议的连接方式如下图:
在shadowba提示下,也可以通过I2C中继芯片解决,taobao上找到了下面这个chip(价格10元有找),不过我暂时还没收到,所以不知到底是否能解决问题,看到这里的朋友,不要骂人哈,等我测试后再补充。
上面说了关于I2C通讯问题,下面说说蓝牙追踪iOS设备问题,由于I2C通讯上遇到的问题,所以我就一直尝试通过蓝牙追踪设备来触发自动化,由于本人的Code能力也是弱鸡,所以只能是抄作业为主,查了大量资料后,最终找到了两篇比较重要的参考,分享给大家:
http://www.davidgyoungtech.com/2 ... g-the-overflow-area
https://community.home-assistant ... nt-detection/332914
简单总结一下资料内容,首先iOS设备目前只支持BLE蓝牙连接,Classic蓝牙是不支持的,而且iOS设备在做ble advertising data时,为了安全考虑,mac地址是随机产生的,大概45mins更新一次,并且除了iOS系统自己,所有的APP都不允许在后台发送ble advertising data,关键是iOS自己的ble advertising data有自己独有的编码规则,所以在使用ESPHOME的相关BLE组件时,无法简单直接使用iOS设备的BLE Data或者mac地址,这样自然也无法追踪iOS设备,我总结了两个思路解决问题:
1、解读iOS的ble advertising data。
这也是上述两文的重点!首先要安装一个叫“crownstone”APP[size=15.008px],用来修复iOS的ble overflow area[size=15.008px],如果你的iOS设备重启后,需要再次启动这个APP,还好iPhone几个月也不会重启一次,接下就是编写ESPHOME的YAML文件,基本上就是通过获取特定ble advertising data后,通过RSSI来判断设备远近,然后触发自动化控制,大家可以看原文,我在后面也会分享我的code。
2、通过UUID来调用ESPHOME BLE组建。
鉴于我的目的是解锁,而且是备用方案,所以还有一个简单的方式是iOS设备官方允许可以建成一个iBeacon,https://developer.apple.com/docu ... o_an_ibeacon_device,这样可以通过自己生成一个UUID来作为解锁的唯一识别ID,然后触发自动化,大家可以下载
这个APP来实现,当然如果有大神在,可以考虑做一个集成iBeacon和fixi OS ble overflow area的APP,那就完美啦
下面是我的code:
##BLE追踪器
esp32_ble_tracker:
scan_parameters:
interval: 1s
window: 1s
duration: 30s
on_ble_advertise:
- then:
- lambda: |- ##追踪iPhone,并确保信号强度大于-85分贝时认定为开锁
bool benson12_ble_status = false;
for (auto data : x.get_manufacturer_datas()) {
if (strcmp(format_hex_pretty(data.data).c_str(), "01.XXXXXXXXXXXXXXXXXXX.00 (17)") == 0) {
if (x.get_rssi() > -85){
ESP_LOGD("ble_adv", "benson12_ble found in the car");
benson12_ble_status = true;
}
}
ESP_LOGD("ble_adv", " - %s", format_hex_pretty(data.data).c_str());
}
id(benson12_ble).publish_state(benson12_ble_status);
##传感器---------------------------------------------------------------
sensor:
- platform: wifi_signal ##Wifi信号
name: "WiFi Signal Sensor"
update_interval: 600s
- platform: ble_rssi ##Benons12-iBeacon-信号强度&开锁&关锁
ibeacon_uuid: 'XXXXXXXXXXXXXXX'
name: "Benson12-iBeacon-RSSI"
id: benson12_ibeacon_rssi
binary_sensor:
- platform: template ##ibeacon开锁
name: "Benson12-iBeaconKey"
id: benson12_ibeaconkey
lambda: |-
if (id(benson12_ibeacon_rssi).state > -85) {
return true;
} else {
return false;
}
filters:
- delayed_off: 10s
on_press:
then:
- switch.turn_on: unlockcar
- platform: template ##ble控制锁
name: "Benson12 BLE"
id: benson12_ble
filters:
- delayed_off: 30s
on_press:
then:
- switch.turn_on: unlockcar
on_release:
then:
- switch.turn_on: lockcar
|