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

 找回密码
 立即注册
查看: 30733|回复: 105

[修仙教程] YeeLight蓝牙调光开关——最新最完美的用法,纯HA内置组件!

  [复制链接]

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

发表于 2022-4-4 11:29:21 | 显示全部楼层 |阅读模式
本帖最后由 XCray 于 2024-5-11 09:23 编辑

20240505更新:HA内置组件已经提供了非常完美的支持!
采用非常合理的事件实体,比传感器实体更科学(我当初的思路是在传感器数值里完整传递事件数据,当时如果采取事件机制也是更科学的做法)
自动化代码参考:
alias: dimmer
description: 调光开关内置能力
trigger:
  - platform: state
    entity_id:
      - event.dimmer
condition: []
action:
  - choose:
      - conditions:
          - condition: template
            value_template: "{{trigger.to_state.attributes.event_type == 'press'}}"
        sequence:
          - service: input_number.set_value
            metadata: {}
            data:
              value: >-
                {{states('input_number.clicktimes')|int +
                trigger.to_state.attributes.number_of_presses}}
            target:
              entity_id: input_number.clicktimes
      - conditions:
          - condition: template
            value_template: "{{trigger.to_state.attributes.event_type == 'long_press'}}"
        sequence:
          - service: input_number.set_value
            metadata: {}
            data:
              value: >-
                {{states('input_number.pressduration')|int +
                trigger.to_state.attributes.duration}}
            target:
              entity_id: input_number.pressduration
      - conditions:
          - condition: template
            value_template: "{{trigger.to_state.attributes.event_type == 'rotate_left'}}"
        sequence:
          - service: input_number.set_value
            metadata: {}
            data:
              value: >-
                {{states('input_number.tnum')|int -
                trigger.to_state.attributes.steps}}
            target:
              entity_id: input_number.tnum
      - conditions:
          - condition: template
            value_template: "{{trigger.to_state.attributes.event_type == 'rotate_right'}}"
        sequence:
          - service: input_number.set_value
            metadata: {}
            data:
              value: >-
                {{states('input_number.tnum')|int +
                trigger.to_state.attributes.steps}}
            target:
              entity_id: input_number.tnum
      - conditions:
          - condition: template
            value_template: >-
              {{trigger.to_state.attributes.event_type ==
              'rotate_left_pressed'}}
        sequence:
          - service: input_number.set_value
            metadata: {}
            data:
              value: >-
                {{states('input_number.tnumpress')|int -
                trigger.to_state.attributes.steps}}
            target:
              entity_id: input_number.tnumpress
      - conditions:
          - condition: template
            value_template: >-
              {{trigger.to_state.attributes.event_type ==
              'rotate_right_pressed'}}
        sequence:
          - service: input_number.set_value
            metadata: {}
            data:
              value: >-
                {{states('input_number.tnumpress')|int +
                trigger.to_state.attributes.steps}}
            target:
              entity_id: input_number.tnumpress
mode: queued
max: 15
内置的才是最好的,哪怕外部组件是我自己开发的。以下为之前利用ESPHome实现的,可以废弃了:
--------------------------------------------------------

前几天拿到一个YeeLight的智能调光开关,贴装版的,型号YLKG08YL。

前段时间一帮大神搞定了解密算法,ble_monitor也快速跟进增加了支持,虽然还不够完美。

我说它不完美,最大的缺点就是对重复操作考虑欠妥。如果重复执行同样的操作,一定时间内(默认35秒,文档建议改为最小值1秒)只有一次有效。这样不少操作就无法被正确识别!

难道1秒就够短了吗?显然不是。一秒内只能操作一次,这么迟钝你能忍???

于是,只好自己撸代码

我的思路:
1. 有效载荷与消息序号拼接,作为传感器数值传给HA,这么干的好处是每次操作都会触发传感器的更新,哪怕是极短时间内的重复动作;
2. HA利用模板从传感器数值中提取数据、完成自动化;

简单测试了一下,每种动作对应的载荷如下,写自动化必须弄清楚(5楼有完整的很有价值的自动化代码,直接用就行):
000103 单击          最后的03表示按键动作
000203 双击          第二个字节为连击次数
000303 三连击
000403 四连击
000104 右转         最后的04表示旋钮动作,第二个字节为旋转步数
00FF04 左转          左转步数为256-收到的数值
FD0005/FD0004   按住左转   按住旋转时步数在第一个字节(按住左转最后字节有时是04,有时是05,并且消息序号经常是0,显然是一个产品bug!很搞笑是吧?)
020004 按住右转   同样左转时步数为256-收到的数值
010003 按住不转   最后的03还是旋钮,第一个字节01表示没松开
010103 继续按住   第二个字节为按住的时长,大概半秒增加1
010203 继续按住
010303 继续按住
010403 继续按住
010503 继续按住
...
010A03 一直到松开持续累加且实时输出


代码不好看,凑合用吧,我也不是专业程序员,能对付用就行
yeelight_dimmer_0.1.zip (10.11 KB, 下载次数: 252) 解压到ESPHome目录下指定的子目录,然后对应的yaml如下:
external_components:
  - source: mine
sensor:
  - platform: yeelight_dimmer
    mac_address: $mac
    bindkey: $beaconkey
    dimmerevt:
      name: "DimmerEvt"
注:beaconkey需要手工拼接成32位(16字节)。24位key的获取以及拼接方法懂的都懂,不懂的也不需要懂了
~~~~~~~~~~~~~~~~~~~~

不了解这个东西、不了解ESPHome、或者看不懂的也不要问了。

我说最完美就是最完美,不管是和官方的比,还是和开源的比

不是我狂,真心觉得理解这个帖子价值的人不会太多。

致谢:https://github.com/psylity/yeelight-dimmer-esp32
用了其中的部分解密函数代码
以及多位大神的发言,不一一列举了

另:本贴2楼、5楼、13楼提供了更多的相关信息,对小白帮助很大,不明白的建议先好好看看,务必做到理解才行。

评分

参与人数 12金钱 +94 HASS币 +20 收起 理由
gw886 + 5
zhaoyf + 2
360341024 + 5
kaka0992 + 5 高手,这是高手!
eintin + 1 墙都不扶,就服楼主!
jjcs + 10 墙都不扶,就服楼主!
dotlife + 5 我就喜欢你这样拽得一笔的样子。.
blindlight + 16 感谢楼主分享!
+ 20 + 20 厉害了word楼主!
kingwell + 5 感谢楼主分享!
firewater + 10 论坛有你更精彩!
Jerrylee + 10 厉害了word楼主!

查看全部评分

回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2022-4-4 11:36:29 | 显示全部楼层
本帖最后由 XCray 于 2022-11-17 08:52 编辑

HA中利用模板提取数值(去掉最后的序号)的方法:
{{('%08X'|format(states('sensor.dimmerevt')|int))[0:6] }}
~~~~~~~~~~~~~~~~还是简单补充一下必要的信息吧,省得同学们再绕圈子了。
1. 这款产品还是非常好的,只是官方对它的用途定义的太窄了

                               
登录/注册后可看大图

两个型号软件上没有区别。

2. 可以使用现成的脚本很方便的获取到12字节的密钥beacon_key,脚本推荐:
psylity/yeelight-dimmer-python: With this class you can receive, decrypt and handle Yeelight YLKG07YL/YLKG08YL dimmer bluetooth notifications in your python code. (github.com)
再也不要愚蠢地用魔改版app去获取了!
文中第一步用# hcitool lescan 命令可能无效(我试过反正不行),用nRFconnect也看不到,最后还是用esphome中的esp32_ble_tracker发现的mac地址(开关需长按配对键3秒多进入配对模式)。


3. 获取的12字节的beacon_key需要在正中间添加4个字节(8d3d3c97)才是能用于解密的密钥。
我是为了偷懒,没有在程序里做这一步,反正就是配置一次的事情,直接在yaml里完成好了。

4. 非必要信息
这款产品使用的旧版本的mibeacon加密方法(v3),而小米系其它使用了加密的蓝牙期间都是v4/v5,解密方法也一样;另外消息中的载荷也不一样,更简单。

5. 很多同学没有想明白我说的“完美”一词的具体含义!
ble_monitor总的来说是个很好的工具,但是在重复的传感器触发方面处理的并不十分科学。
就比如接入本主题这个调光开关,如果匀速朝同一个方向旋转、大概每秒触发2~3次、每次都是1步,这种情况下ha是不会触发自动化的,因为ble_monitor报告的传感器状态一直没变!
ble_monitor设置了一个重置计时器,默认35秒最短可设置为1秒,含义是无操作1秒后把传感器状态重置,而如果1秒内有重复操作,则什么都不会发生。
本贴这个思路的最大差异点,就是确保无论间隔多久,每次操作都会得到正确的处理。
回复

使用道具 举报

3

主题

192

帖子

1139

积分

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
947
HASS币
0
发表于 2022-4-4 14:00:56 来自手机 | 显示全部楼层
不明觉厉
回复

使用道具 举报

10

主题

107

帖子

1635

积分

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1528
HASS币
0
发表于 2022-4-4 14:07:19 | 显示全部楼层
点赞大佬,感谢分享
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2022-4-5 20:56:41 | 显示全部楼层
本帖最后由 XCray 于 2022-4-9 19:57 编辑

基于我的代码,可以充分利用这个东西的全部能力。尤其是快速连续的操作,而其它接入方法,必须等一秒以上才可以进行下次操作,这么狠的限制你真的能接受???

这个开关提供4种操作:点击、长按、旋转、按住旋转(还有其它的吗?如果发现了请一定说出来)。
为了更好的演示其效果,我创建了4个input_number,如图,用一个自动化根据具体动作去更新相应的数值。在实际应用中,直接修改action中的实体和具体动作就行了。
dimmer.png
连击我试过9次,实话说我自己都数不清楚几下了


自动化的yaml代码详见附件。考虑到快速频繁操作,建议模式设置成队列或并行。
dimmer_automation.zip (725 Bytes, 下载次数: 114)
注:后来发现按住左转时第三个字节有时是04,有时是05(产品bug,有时序号会是00)
这个自动化的流程如图:
dimmera.png
触发后提取信息设置为一个变量、然后修改一个文本框显示一下(调试用),然后判断出5种情况并分别执行相应的动作,最后一种表示未知,也是调试的目的,实际用可以不要。

别的不说,就这个自动化的写法就有很大的参考价值。再原始一点的做法就是写成4条自动化。
回复

使用道具 举报

35

主题

410

帖子

2611

积分

金牌会员

Rank: 6Rank: 6

积分
2611
金钱
2201
HASS币
10
发表于 2022-4-6 13:42:50 | 显示全部楼层
大佬牛逼,没说的。
我一直在找旋钮带屏幕的那种款式,不知道能不能接入HA
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2022-4-6 16:58:12 | 显示全部楼层
lexcao 发表于 2022-4-6 13:42
大佬牛逼,没说的。
我一直在找旋钮带屏幕的那种款式,不知道能不能接入HA ...

得看具体情况了,主要是有没有加密、加密的话有没有具体算法说明
回复

使用道具 举报

3

主题

48

帖子

1063

积分

金牌会员

Rank: 6Rank: 6

积分
1063
金钱
1015
HASS币
0
发表于 2022-4-7 00:47:22 | 显示全部楼层
牛哇,最想要的就是这种旋钮的开关  比那种按键的开关更好玩     就是怕有延迟体验不好  现在被大佬解决了
回复

使用道具 举报

3

主题

133

帖子

1266

积分

金牌会员

Rank: 6Rank: 6

积分
1266
金钱
1133
HASS币
0
发表于 2022-4-8 16:29:43 | 显示全部楼层
这个太强了,有空我一定搞起来,现在就有两个现成的。改成旋转控制窗帘,想想就刺激
回复

使用道具 举报

3

主题

80

帖子

777

积分

高级会员

Rank: 4

积分
777
金钱
697
HASS币
0
发表于 2022-4-8 16:54:28 | 显示全部楼层
太强了,家里有两个 我都拿来控制易来的窗帘了
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-12-28 01:18 , Processed in 1.304907 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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