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

 找回密码
 立即注册
查看: 2844|回复: 10

[技术探讨] 如何在 esphome 中 通过获取的 ble 广播数据,做相应的动作

[复制链接]

80

主题

388

帖子

1680

积分

金牌会员

Rank: 6Rank: 6

积分
1680
金钱
1292
HASS币
0
发表于 2022-7-20 23:44:09 | 显示全部楼层 |阅读模式
本帖最后由 ciasdmxhxjjpd@c 于 2022-7-21 17:50 编辑

RT,

# BLE    
esp32_ble_tracker:
  on_ble_advertise:
    - mac_address: A4:C1:38:6E:85:0B
      then:
        - lambda: |-
            for (auto data : x.get_service_datas()) {
                ESP_LOGD("ble_adv", "    - %s: (length %i)  - %s", data.uuid.to_string().c_str(), data.data.size(),hexencode(data.data).c_str());
            }
            
sensor:
  - platform: template
    name: "yeelight remote controller"
    id: ble_sensor
ble 获取到指定mac地址的广播数据格式

[D][ble_adv:099]:     - 0xFE95: (length 17)  - 50.30.8E.06.9B.0B.85.6E.38.C1.A4.01.10.03.00.00.00 (17)
[D][ble_adv:099]:     - 0xFE95: (length 17)  - 50.30.8E.06.9C.0B.85.6E.38.C1.A4.01.10.03.01.00.00 (17)
[D][ble_adv:099]:     - 0xFE95: (length 17)  - 50.30.8E.06.9E.0B.85.6E.38.C1.A4.01.10.03.02.00.00 (17)
[D][ble_adv:099]:     - 0xFE95: (length 17)  - 50.30.8E.06.A0.0B.85.6E.38.C1.A4.01.10.03.04.00.00 (17)
[D][ble_adv:099]:     - 0xFE95: (length 17)  - 50.30.8E.06.A1.0B.85.6E.38.C1.A4.01.10.03.03.00.00 (17)
[D][ble_adv:099]:     - 0xFE95: (length 17)  - 50.30.8E.06.A1.0B.85.6E.38.C1.A4.01.10.03.03.00.00 (17)
我在github里,写了数据格式含义。https://github.com/0neday/yeelig ... controller-adv-data

请问,在 lambda 里如何接着检查 获取数据的倒数第三个字节,并通过 if else 比较选择,再执行相应的动作。
比如当获取到开灯的数据,50.30.8E.06.89.0B.85.6E.38.C1.A4.01.10.03.01.00.00,截取倒数第三个字节01,if esle选择下执行体,执行 或者 调用 写好的 script 脚本?
- light.turn_on: light_id
请大佬赐教!


----------------------------已解决
根据 esphome ble 官方文档,on_ble_service_data_advertise 中 的 x 是一个向量,即数组数据,从下标 0 开始,往后数第14 个字节就是我们要找的key code 特征识别字符。同时定义一个全局变量存储数据帧number,防止点一次发多个数据包。frame number = x[4]



globals:
   - id: frame_counter
     type: int
     initial_value: '0'

# BLE    
esp32_ble_tracker:
  on_ble_service_data_advertise:
    - mac_address: A4:C1:38:6E:85:0B
      service_uuid: FE95
      then:
# 吊顶灯切换
         - if:
            condition: 
              lambda: "return(x[14] == 1 && id(frame_counter) != x[4]);"
            then:
             - lambda: |-
                 id(frame_counter) = x[4];
                 id(yeelight_remote_controller).publish_state(x[14]);
             - switch.turn_on: buzzer_beep
             - light.toggle: ceiling_light








回复

使用道具 举报

23

主题

137

帖子

712

积分

高级会员

Rank: 4

积分
712
金钱
575
HASS币
0
发表于 2022-7-20 23:59:11 来自手机 | 显示全部楼层
esphome内应该没办法,用nr控制。
回复

使用道具 举报

80

主题

388

帖子

1680

积分

金牌会员

Rank: 6Rank: 6

积分
1680
金钱
1292
HASS币
0
 楼主| 发表于 2022-7-21 00:22:04 | 显示全部楼层
Brewer 发表于 2022-7-20 23:59
esphome内应该没办法,用nr控制。

ha 和 nr 安装在 n1 上,都不支持 蓝牙,如何控制呢
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12105
金钱
9086
HASS币
460

教程狂人突出贡献

发表于 2022-7-21 06:38:52 | 显示全部楼层
可参考我那个yeelight调光开关的帖子,你这个更简单,因为不涉及加密。
参考小米文档,消息解读:
50.30.8E.06.89.0B.85.6E.38.C1.A4.01.10.03.01.00.00
50:包含mesh、mac、未加密
30:版本3、未绑定无操作旧版本
8E06:产品ID
89:帧序号
9C0B856E38C1:MAC地址
A4:设备能力,前绑定、包含I/O能力
0110:I/O能力,可输出6位数字
03:BLE Object长度
010000:BLE Object内容,旧版本小米没有规范

如果只是倒数第三个字节有用,都不用外部组件,直接在lambda里输出这个字节就行。为了避免重复操作ha侧不更新的问题,可以把帧序号加上
回复

使用道具 举报

80

主题

388

帖子

1680

积分

金牌会员

Rank: 6Rank: 6

积分
1680
金钱
1292
HASS币
0
 楼主| 发表于 2022-7-21 07:55:36 | 显示全部楼层
XCray 发表于 2022-7-21 06:38
可参考我那个yeelight调光开关的帖子,你这个更简单,因为不涉及加密。
参考小米文档,消息解读:
50.30.8E ...

已更新。
有时按一次按键,会有多个广播数据,导致使用 light.toggle 的时候,会出现闪灭闪开!请问,有没有解决办法!

还有一个问题,当通过ha关闭灯的时候,会有微光
这是晚上关灯后,拍的
微信图片_20220721075451.jpg
回复

使用道具 举报

3

主题

203

帖子

1841

积分

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1638
HASS币
15
发表于 2022-7-21 09:21:36 | 显示全部楼层
ciasdmxhxjjpd@c 发表于 2022-7-21 07:55
已更新。
有时按一次按键,会有多个广播数据,导致使用 light.toggle 的时候,会出现闪灭闪开!请问,有 ...

你这个是通过单火智能开关控制的普通灯吧?有的灯用单火智能开关会微亮
回复

使用道具 举报

80

主题

388

帖子

1680

积分

金牌会员

Rank: 6Rank: 6

积分
1680
金钱
1292
HASS币
0
 楼主| 发表于 2022-7-21 10:07:26 | 显示全部楼层
OliverY 发表于 2022-7-21 09:21
你这个是通过单火智能开关控制的普通灯吧?有的灯用单火智能开关会微亮 ...

就是普通机械开关。用 ha 关灯后,有微亮,必须彻底关闭机械开关。零火线都是安装提示装的。
回复

使用道具 举报

3

主题

203

帖子

1841

积分

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1638
HASS币
15
发表于 2022-7-22 09:37:54 | 显示全部楼层
Passive BLE monitor好像可以直接集成这个yeelight remote,要不换个思路?我也有个这遥控,晚上回家我试试看

N1蓝牙是可以用的https://bbs.hassbian.com/forum.php?mod=viewthread&tid=14469按这个帖子里安装蓝牙部分操作一下,亲测可用
回复

使用道具 举报

80

主题

388

帖子

1680

积分

金牌会员

Rank: 6Rank: 6

积分
1680
金钱
1292
HASS币
0
 楼主| 发表于 2022-7-24 10:14:59 | 显示全部楼层
本帖最后由 ciasdmxhxjjpd@c 于 2022-7-24 10:16 编辑
XCray 发表于 2022-7-21 06:38
可参考我那个yeelight调光开关的帖子,你这个更简单,因为不涉及加密。
参考小米文档,消息解读:
50.30.8E ...

今天发现一个奇怪的问题,有时会发 长度为 16 的数据包,这个包的出现没有什么规律,所有的按键都有可能触发。
[D][ble_adv:170]:   - 0xFE95: (length 17)  - 50.30.8E.06.5A.0B.85.6E.38.C1.A4.01.10.03.00.00.00 (17)
[D][fan:022]: 'yeelight ceiling fan' - Setting:
[D][fan:025]:   State: ON
[D][fan:108]: 'yeelight ceiling fan' - Sending state:
[D][fan:109]:   State: ON
[D][fan:111]:   Speed: 78
[D][fan:115]:   Direction: FORWARD
[D][switch:013]: 'buzzer_beep' Turning ON.
[D][switch:037]: 'buzzer_beep': Sending state ON
[D][uart_debug:114]: >>> 01:04:01:18:13:03:01:03:01:52:4E:03
[I][yeelight_fan_controller:105]: Command successful
[I][yeelight_fan_controller:105]: Command successful
[D][binary_sensor:036]: 'fan running': Sending state ON
[D][switch:017]: 'buzzer_beep' Turning OFF.
[D][switch:037]: 'buzzer_beep': Sending state OFF
[D][uart_debug:114]: <<< 01:F3:01:07:13:03:01:F3:01:42:4E:03
[D][ble_adv:170]:   - 0xFE95: (length 17)  - 50.30.8E.06.5B.0B.85.6E.38.C1.A4.01.10.03.02.00.00 (17)
[D][switch:013]: 'buzzer_beep' Turning ON.
[D][switch:037]: 'buzzer_beep': Sending state ON
[D][uart_debug:114]: >>> 01:03:01:05:01:03
[D][switch:017]: 'buzzer_beep' Turning OFF.
[D][switch:037]: 'buzzer_beep': Sending state OFF
[D][uart_debug:114]: <<< 01:F3:01:F5:01:03
[D][sensor:125]: 'fan speed level': Sending state 1.00000  with 0 decimals of accuracy
[D][ble_adv:170]:   - 0xFE95: (length 16)  - 51.32.8E.06.01.0B.85.6E.38.C1.A4.02.00.02.01.10 (16)
[D][ble_adv:170]:   - 0xFE95: (length 17)  - 50.30.8E.06.5D.0B.85.6E.38.C1.A4.01.10.03.02.00.00 (17)


回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12105
金钱
9086
HASS币
460

教程狂人突出贡献

发表于 2022-7-24 10:54:37 | 显示全部楼层
ciasdmxhxjjpd@c 发表于 2022-7-24 10:14
今天发现一个奇怪的问题,有时会发 长度为 16 的数据包,这个包的出现没有什么规律,所有的按键都有可能触 ...

你多看看小米的文档就不觉得奇怪了

我大概看了看,你说的这条消息翻译应该在这儿:
9        solicited        0:无操作;1:请求 APP 进行注册绑定。当用户在开发者平台选择设备确认配对时才有效,否则置0。此项原名称为bindingCfm,重命名为solicited “主动请求,招揽” APP进行注册绑定

评分

参与人数 1金钱 +5 收起 理由
ciasdmxhxjjpd@c + 5

查看全部评分

回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-29 00:45 , Processed in 0.109816 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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