本帖最后由 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楼提供了更多的相关信息,对小白帮助很大,不明白的建议先好好看看,务必做到理解才行。
|