找回密码
 立即注册

微信扫码登录

搜索
查看: 2563|回复: 51

[进阶教程] 2.9元廉价iTag防丢器通过ESPHome接入HA

[复制链接]

230

主题

3485

回帖

1万

积分

元老级技术达人

积分
11687
金钱
7952
HASS币
100
发表于 2026-8-20 10:37:44 | 显示全部楼层 |阅读模式
本帖最后由 bugensui 于 2026-8-22 22:58 编辑

itag_ha_article_cover.jpg

说实话,这玩意儿我去年就在某宝买过一个,当时它便宜,随手就扔钥匙扣上挂着了。那时候也没想着怎么折腾,就当个单纯的防丢挂件用。直到前两天,我在论坛看到大佬“雪晴科技HTH”推荐这东西,说它能完美接入Home Assistant,而且功能还不少。这下勾起了我的折腾欲,2块9的东西(用了3块优惠券,原价5.9元),要是真能变身智能按钮加蓝牙追踪,那性价比简直逆天了。

什么是 iTag?

iTag 这类产品其实是个通用的 BLE(低功耗蓝牙)标签。外观大多是个小水滴形状,里面藏着一个纽扣电池、一个蜂鸣器和一个物理按键。本质上,它就是一个标准的 BLE GATT 设备。虽然各家厂商出的固件可能稍有不同,但底层逻辑是一样的:通过不同的“特征(Characteristic)”来传输按键信号、电量信息或者触发蜂鸣器。

为什么选它?

对我这种家里还没装智能门锁、还在用机械钥匙的人来说,iTag 简直是刚需。

  1. 无线按钮:它支持单击和双击判定。挂在钥匙上,进门顺手一按就能触发开关灯或者控制指定设备。
  2. 居家/离家判定:利用 ESP32 的蓝牙连接上itag防丢器。只要钥匙在范围内,我就在,可以做自动化离家和回家场景。
  3. 寻物报警:找不到钥匙了?手机点一下,钥匙扣就开始尖叫。
  4. 超低成本:2块9,坏了丢了完全不心疼。

逆向与折腾:从抓包到接入

主要用到了esp32开发板,然后在esphome代码里启用(esp32_ble_tracker)BLE 扫描跟踪组件和(ble_client)BLE 客户端组件,如果家里有esp32芯片的智能设备,可以加几行代码进去就可以实现把itag防丢器接入HA。

折腾的第一步是逆向调试。我用了 Web Bluetooth API 工具连接了 iTag,发现它的按键信号是通过服务 0xFFE0 的特征 0xFFE1 推送的。不同芯片方案(有的用 Ti CC2541,有的用杰理)推送的 HEX 数据不一样,我这个单击发的是 0x01

最大的坑在于那个模式控制寄存器 0x1802 / 0x2A06。它其实是个 3态互斥寄存器:写入 0x01 是寻物报警,0x00 是按键提示音,0x02 是静音。如果你把它当成普通的开关配置,肯定会打架。所以我最后在 ESPHome 里用了一个 select 选择器来统一管理,效果非常稳。

QQ20260820-020502.jpg

QQ20260820-023550.jpg

针对双击手感,我还微调了 ESPHome 的 on_multi_click 时间参数。因为人手操作总是有快慢,把判定窗口放宽到 0.6 秒后,识别率几乎达到了 100%。

完整的 ESPHome 配置代码

直接把下面这段代码粘进你的配置里,改下 MAC 地址就能用。我已经把电量查询、寻物开关、ITAG单击双击和ITAG连接状态全都写好了。

substitutions:
  device_name: "itag_button"
  itag_mac: "FF:******F"

esphome:
  name: esp32kf
  friendly_name: esp32kf
  on_boot:
    priority: 600 # 优先级设为 600,确保在传感器组件加载完成后立即执行
    then:
      - text_sensor.template.publish:
          id: last_action
          state: "null" # 👈 重启后立即显示为 null
      - binary_sensor.template.publish:
          id: itag_button_pulse
          state: OFF # 👈 顺便把按键脉冲也初始化为 OFF

esp32:
  board: esp32dev
  framework:
    type: esp-idf

logger:

esp32_ble_tracker:
  scan_parameters:
    active: true
    interval: 150ms
    window: 100ms

ble_client:
  - mac_address: ${itag_mac}
    id: itag_client
    on_connect:
      then:
        # 1. 立即更新传感器状态为“已连接/在家”
        - binary_sensor.template.publish:
            id: itag_connected_real
            state: ON
        - logger.log: "iTag 链路已建立,状态同步为:在家"
        # 🔥 新增:延时 3 秒,给蓝牙链路预留稳定的时间
        - delay: 3s
        # 2. 写入静音/关闭报警指令 (防止离家报警)
        - ble_client.ble_write:
            id: itag_client
            service_uuid: 'FFE0'
            characteristic_uuid: 'FFE2'
            value: [0x00]
    on_disconnect:
      then:
        - binary_sensor.template.publish:
            id: itag_connected_real
            state: OFF
        - logger.log: "iTag 链路已断开,状态同步为:离家"

sensor:
  - platform: internal_temperature
    name: "esp32 Temperature"
  - platform: ble_client
    type: characteristic
    ble_client_id: itag_client
    name: "iTag battery"
    icon: "mdi:battery"
    service_uuid: '180F'
    characteristic_uuid: '2A19'
    unit_of_measurement: "%"
    accuracy_decimals: 0
    update_interval: 2h

binary_sensor:
  - platform: template
    name: "钥匙扣实际状态"
    id: itag_connected_real
    device_class: connectivity
  - platform: template
    id: itag_button_pulse
    internal: true
    on_multi_click:
      - timing:
          - ON for at most 0.4s
          - OFF for at least 0.4s
        then:
          - text_sensor.template.publish:
              id: last_action
              state: "单击 (Single Click)"
          - delay: 500ms
          - text_sensor.template.publish:
              id: last_action
              state: "null"
      - timing:
          - ON for at most 0.4s
          - OFF for at most 0.4s
          - ON for at most 0.4s
        then:
          - text_sensor.template.publish:
              id: last_action
              state: "双击 (Double Click)"
          - delay: 500ms
          - text_sensor.template.publish:
              id: last_action
              state: "null"

select:
  - platform: template
    name: "钥匙扣工作模式"
    id: itag_work_mode
    icon: "mdi:tune-vertical"
    optimistic: true
    restore_value: true
    options:
      - "静音模式"
      - "按键提示音"
      - "寻物蜂鸣"
    set_action:
      - logger.log:
          format: "【模式切换】iTag 当前设为: %s"
          args: ["x.c_str()"]
      - if:
          condition:
            lambda: 'return x == "静音模式";'
          then:
            - ble_client.ble_write:
                id: itag_client
                service_uuid: '1802'
                characteristic_uuid: '2A06'
                value: [0x02]
      - if:
          condition:
            lambda: 'return x == "按键提示音";'
          then:
            - ble_client.ble_write:
                id: itag_client
                service_uuid: '1802'
                characteristic_uuid: '2A06'
                value: [0x00]
      - if:
          condition:
            lambda: 'return x == "寻物蜂鸣";'
          then:
            - ble_client.ble_write:
                id: itag_client
                service_uuid: '1802'
                characteristic_uuid: '2A06'
                value: [0x01]

text_sensor:
  - platform: ble_client
    ble_client_id: itag_client
    service_uuid: 'FFE0'
    id: djkj
    characteristic_uuid: 'FFE1'
    internal: true
    notify: true
    on_notify:
      then:
        - if:
            condition:
              lambda: 'return !x.empty() && ((uint8_t)x[0]) == 0x01;'
            then:
              - logger.log: "【iTag】捕获到硬件按键按下事件!"
              - binary_sensor.template.publish:
                  id: itag_button_pulse
                  state: ON
              - delay: 50ms
              - binary_sensor.template.publish:
                  id: itag_button_pulse
                  state: OFF
  - platform: template
    name: "钥匙扣最后动作"
    id: last_action
    icon: "mdi:gesture-tap"

总结

折腾完之后,我发现这小玩意儿比我想象中要稳。虽然它只是个 2.9 元的硬件,但配合 ESPHome 和 HA 的自动化,能玩出的花样真的很多。如果你手里也有吃灰的防丢器,不妨动手试一试,这绝对是入坑智能家居成本最低、乐趣最高的方式之一了。

评分

参与人数 3金钱 +50 HASS币 +10 收起 理由
penguinmm + 10 大神666!
sorrypqa + 20 贴王发力了!!
admin + 20 + 10 楼主太高产了,辛苦了!

查看全部评分

公众号:Home Assistant分享
回复

使用道具 举报

15

主题

361

回帖

1518

积分

金牌会员

积分
1518
金钱
1142
HASS币
10
发表于 2026-8-20 10:50:58 来自手机 | 显示全部楼层
大佬辛苦了!感谢分享!
回复

使用道具 举报

230

主题

3485

回帖

1万

积分

元老级技术达人

积分
11687
金钱
7952
HASS币
100
 楼主| 发表于 2026-8-20 10:54:04 | 显示全部楼层
hass7079 发表于 2026-8-20 10:50
大佬辛苦了!感谢分享!

昨天esphome调试到凌晨1点半,花了20分钟发文章,到2点多才睡。
公众号:Home Assistant分享
回复

使用道具 举报

0

主题

183

回帖

1776

积分

金牌会员

积分
1776
金钱
1593
HASS币
0
发表于 2026-8-20 11:07:30 | 显示全部楼层
感谢分享!学习一下!
回复

使用道具 举报

46

主题

569

回帖

3898

积分

论坛元老

积分
3898
金钱
3283
HASS币
10
发表于 2026-8-20 11:18:02 | 显示全部楼层
感谢分享。
回复

使用道具 举报

0

主题

111

回帖

484

积分

中级会员

积分
484
金钱
373
HASS币
0
发表于 2026-8-20 11:27:02 | 显示全部楼层
感谢分享
回复

使用道具 举报

21

主题

570

回帖

2639

积分

金牌会员

积分
2639
金钱
2038
HASS币
40
发表于 2026-8-20 11:55:12 | 显示全部楼层
一个ESP蓝牙代理 范围有限,如果要全屋可用,需要每个ESP蓝牙代理都写死这个蓝牙MAC地址 和 交互逻辑,不太方便。
是否可以写一个HA集成,将和蓝牙设备交互的逻辑从ESPHome固件中剥离,然后放到HomeAssistant集成中?

我问过Gemini,说是可以的。楼主可以试试看
123123.jpg

回复

使用道具 举报

15

主题

361

回帖

1518

积分

金牌会员

积分
1518
金钱
1142
HASS币
10
发表于 2026-8-20 12:09:34 来自手机 | 显示全部楼层
本帖最后由 hass7079 于 2026-8-20 12:13 编辑
lovelyelfpop 发表于 2026-8-20 11:55
一个ESP蓝牙代理 范围有限,如果要全屋可用,需要每个ESP蓝牙代理都写死这个蓝牙MAC地址 和 交互逻辑,不太 ...


感觉只需要把楼主的代码揉进bermuda这个集成就OK了,揉进去后,tag自动跟最近的esp代理连接
Screenshot_20260820_120735_com.microsoft.emmx.jpg
回复

使用道具 举报

230

主题

3485

回帖

1万

积分

元老级技术达人

积分
11687
金钱
7952
HASS币
100
 楼主| 发表于 2026-8-20 12:21:10 | 显示全部楼层
本帖最后由 bugensui 于 2026-8-20 12:45 编辑
lovelyelfpop 发表于 2026-8-20 11:55
一个ESP蓝牙代理 范围有限,如果要全屋可用,需要每个ESP蓝牙代理都写死这个蓝牙MAC地址 和 交互逻辑,不太 ...

这个确实是个问题,不过我家里不大,100平方以内,直接部署在房间中心的区域的一个esp设备上应该全屋可用,因为最多只隔一堵墙。

这个设备的工作逻辑是(ai分析的),未连接状态:广播mac地址,信号强度数据, 等esp设备的蓝牙成功连接配对后,才会广播具体的内容数据:电量、点击动作,触发报警响铃,itag钥匙扣的连接状态。并且停止广播mac地址和信号强度数据(连接上了,其他蓝牙就搜不到这个设备了。我测试过。确实如此)

所以你的那个思路实现起来可能会比较复杂,特别是按钮的单击和双击,而且ai逆向给出的结论是,不能一对多,就是一个itag只能连接一个esp32网关,连接上了甚至原厂的app都不能连接,因为搜索不到了。但是可以多对一,多个itag可以绑定在一个esp32网关上。


有知道的大佬,也可以给出专业的知识科普
公众号:Home Assistant分享
回复

使用道具 举报

230

主题

3485

回帖

1万

积分

元老级技术达人

积分
11687
金钱
7952
HASS币
100
 楼主| 发表于 2026-8-20 12:26:32 | 显示全部楼层
本帖最后由 bugensui 于 2026-8-20 12:46 编辑
hass7079 发表于 2026-8-20 12:09
感觉只需要把楼主的代码揉进bermuda这个集成就OK了,揉进去后,tag自动跟最近的esp代理连接
...

这种类型的设备,可能不一定好弄
公众号:Home Assistant分享
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )|网站地图

GMT+8, 2026-9-9 17:48 , Processed in 0.015889 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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