请选择 进入手机版 | 继续访问电脑版

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

 找回密码
 立即注册
查看: 1780|回复: 38

[经验分享] 米家无线八键旋钮:接入,自动化编写和维护

[复制链接]

31

主题

989

帖子

4464

积分

论坛元老

Rank: 8Rank: 8

积分
4464
金钱
3460
HASS币
90
发表于 2024-5-11 06:26:31 | 显示全部楼层 |阅读模式
本帖最后由 relliky 于 2024-5-14 19:11 编辑

麻蛋,写了好长一篇结果因为加了一个emoji的表情结果全没了,现在重新打一遍,可能有省略的地方,大家意思意思看下。。

1.设备和接入
mars.z在这个帖子分享四键旋钮https://bbs.hassbian.com/thread-24820-1-1.html入的,因为孩子出生的原因,岳父岳母来我家住了,与其用手机控制,还是传统的开关控制的方法更适合他们。因为家里的设备日益增多,一直都想入手一个键位多的,又能灵活控制的方法,这个八键开关刚好能满足需求,可以刻字,很漂亮。(唯一不足就是不带屏幕,如果带屏幕感觉电池也撑不住)

拼多多上买的,老板意外的懂技术且人超级好,我在纠结哪个颜色时,老板还不停给我发图。刻字快递什么的服务都超级好,我一开始弄不懂旋钮具体的使用方法,老板居然直接给我打了电话解释,有点受宠若惊了。都有点想帮他免费引流了
原来这个旋钮可以识别是哪个按键按下去后旋转的,而且旋转的时候,那个被选中的按键还会亮灯,免得还得想一下刚刚按的是啥。(虽然这些状态机都可以在HA里实现,但是按键能记住少了很多工作量,而且亮灯这点实在太棒了)
旋钮还有个功能是哪怕是对应一个按键的设备,比如吸顶灯,可以有4个旋钮动作,来调整两种旋钮参数:一个是直接旋转,一个是按一下旋钮后再旋转,这样出来的按键状态是不一样的,我把它用英文分成了下面四个状态,这样就可以分别控制比如亮度和色温。

knob_clockwise_after_toggling_button_2                                 -> 2号按键的灯亮度+
knob_anticlockwise_after_toggling_button_2                           -> 2号按键的灯亮度-
knob_clockwise_after_toggling_button_2_and_knob                -> 2号按键的灯色温+
knob_anticlockwise_after_toggling_button_2_and_knob          -> 2号按键的灯色温-
当然,还支持米家里面的极速模式等,但对于只用ha的我来说标准模式更合适。

如果你只需要旋钮控制这个按键对应设备的一个参数,那建议把两个trigger合并起来使用。
Screenshot 2024-05-10 at 23.21.54.png

无线开关是蓝牙mesh的,gateway3 可以直接接入,但是最近作者在大更新的时候把旋钮重新坏了,我提了一个PR把它改好了然后触发的名字改的清晰了点 https://github.com/AlexxIT/XiaomiGateway3/pull/1352,但还没合并进去。如果需要抢先使用的,直接把下面代码放到custom_components/xiaomi_gateway3/core/devices.py里面即可

    17825: ["Unknown", "Eight scene knob switch", "cxw.remote.ble006"],
    "spec": [
        BaseConv("battery", mi="7.p.1003"),  # uint8
        BaseConv("action", "sensor"),
        MapConv("action", mi="5.e.1012.p.1", map={1: BUTTON_1_SINGLE, 2: BUTTON_2_SINGLE, 3: BUTTON_3_SINGLE, 4: BUTTON_4_SINGLE, 5: "button_5_single", 6: "button_6_single", 7: "button_7_single", 8: "button_8_single"}),
        MapConv("action", mi="5.e.1013.p.1", map={1: BUTTON_1_DOUBLE, 2: BUTTON_2_DOUBLE, 3: BUTTON_3_DOUBLE, 4: BUTTON_4_DOUBLE, 5: "button_5_double", 6: "button_6_double", 7: "button_7_double", 8: "button_8_double"}),
        MapConv("action", mi="5.e.1014.p.1", map={1: BUTTON_1_HOLD, 2: BUTTON_2_HOLD, 3: BUTTON_3_HOLD, 4: BUTTON_4_HOLD, 5: "button_5_hold", 6: "button_6_hold", 7: "button_7_hold", 8: "button_8_hold"}),
        ConstConv("action", mi="5.e.1036", value="rotate"),
        BaseConv("rotate", mi="5.e.1036.p.2"),
        # The knob in this device can be tuned clockwise and anti-clockwise. It can also be pressed. 
        # The device does not report how much the knob is turned and only report one knob event per second.
        # However, the device remembers the previous state and report the previous state along with the knob event.
        # Such complex events are designed to map different clockwise/anti-clockwise knob events to each button, so users do not need to create dedicated state machine to track it.
        # e.g. a usecase is that button 1 controls the ceiling light and knob for its brightness. Button 2 controls lamps and knob for their brightness.
        #      When the knob is pressed, the knob events controls the temperature of these lights instead.
        # The toggling knob state will get reset after you press a different button
        # e.g. 1) press button_1 and turn knob -> knob_anti_clockwise_after_pressing_button_1
        #      2) press the knob and turn knob -> knob_anti_clockwise_after_toggling_knob_and_pressing_button_1
        #      3) press button_2 and turn knob -> knob_anti_clockwise_after_pressing_button_2
        # Therefore, if you only uses clockwise and anti-clockwise events on its own, you need to merge these events into two triggers in your automation.
        MapConv("action", mi="5.e.1036.p.2", map={-11: "knob_anticlockwise_after_toggling_button_1", 
                                                  -12: "knob_anticlockwise_after_toggling_button_2", 
                                                  -13: "knob_anticlockwise_after_toggling_button_3",
                                                  -14: "knob_anticlockwise_after_toggling_button_4", 
                                                  -15: "knob_anticlockwise_after_toggling_button_5", 
                                                  -16: "knob_anticlockwise_after_toggling_button_6",
                                                  -17: "knob_anticlockwise_after_toggling_button_7", 
                                                  -18: "knob_anticlockwise_after_toggling_button_8", 
                                                  11: "knob_clockwise_after_toggling_button_1", 
                                                  12: "knob_clockwise_after_toggling_button_2", 
                                                  13: "knob_clockwise_after_toggling_button_3",
                                                  14: "knob_clockwise_after_toggling_button_4", 
                                                  15: "knob_clockwise_after_toggling_button_5", 
                                                  16: "knob_clockwise_after_toggling_button_6",
                                                  17: "knob_clockwise_after_toggling_button_7", 
                                                  18: "knob_clockwise_after_toggling_button_8", 
                                                  -21: "knob_anticlockwise_after_toggling_button_1_and_knob", 
                                                  -22: "knob_anticlockwise_after_toggling_button_2_and_knob", 
                                                  -23: "knob_anticlockwise_after_toggling_button_3_and_knob",
                                                  -24: "knob_anticlockwise_after_toggling_button_4_and_knob", 
                                                  -25: "knob_anticlockwise_after_toggling_button_5_and_knob", 
                                                  -26: "knob_anticlockwise_after_toggling_button_6_and_knob",
                                                  -27: "knob_anticlockwise_after_toggling_button_7_and_knob", 
                                                  -28: "knob_anticlockwise_after_toggling_button_8_and_knob", 
                                                  22: "knob_clockwise_after_toggling_button_1_and_knob", 
                                                  22: "knob_clockwise_after_toggling_button_2_and_knob", 
                                                  23: "knob_clockwise_after_toggling_button_3_and_knob",
                                                  24: "knob_clockwise_after_toggling_button_4_and_knob", 
                                                  25: "knob_clockwise_after_toggling_button_5_and_knob", 
                                                  26: "knob_clockwise_after_toggling_button_6_and_knob",
                                                  27: "knob_clockwise_after_toggling_button_7_and_knob", 
                                                  28: "knob_clockwise_after_toggling_button_8_and_knob",}),

    ],

优缺点mars.z 的帖子已经分享过了https://bbs.hassbian.com/thread-24820-1-1.html,转到它那里看。可以低延直连乐视灯,但我没乐视灯。我只用走HA无线开关的方式链接,对延迟敏感的小伙伴也可以出门右转了。


2.按键和旋钮控制视频


https://www.bilibili.com/video/BV1uE421V7sE/



3.按键具体自动化和实现

1. 日/夜模式
单击:切换adaptive lighting的睡眠模式。睡眠模式关的时候,白天就是按照太阳角度要调整亮度和温度,睡眠模式开启后就是最暖且亮度15%
              service: homeassistant.toggle
              entity_id: switch.adaptive_lighting_sleep_mode_master_room
双击,长按,旋钮+/旋钮-:按顺序切换预定的场景,我用一个input_select的状态机来控制场景,比如如果当前是All Off的场景,触发后就换切换了All White。
游客,如果您要查看本帖隐藏内容请回复

2. 吸顶灯,以及5.灯带,7.左床头灯,8.右床头灯
单击:开关这个灯
              service: homeassistant.toggle
              entity_id: light.master_room_light
双击,长按:什么都不会发生,但会让旋钮选中这个灯,选中后就可以用旋钮调整啦
旋钮+/旋钮-(再按了这个2号按键后):调亮/调暗这个灯的亮度,我设置了4档,如果亮度低于等于0,灯会关掉。
          service: light.turn_on
          target:
            entity_id:
            - light.master_room_ceiling_light
          data:
            brightness_step_pct: 25
按下旋钮+/旋钮-(再按了这个2号按键再按下旋钮后旋转):这个还没做,暂时的想法是改变这个灯的色温和颜色搭配。比如我的这个贴子提到的搭配https://bbs.hassbian.com/thread-17553-1-1.html

3. 暖气
单击:开关暖气
              service: homeassistant.toggle
              entity_id: climate.master_room
双击,长按:什么都不会发生,但会让旋钮选中这个暖气,选中后就可以用旋钮调整啦
旋钮+/旋钮-(再按了这个设备按键后):调高/调低暖气温度1度。如果暖气关闭的时候调高,会直接调到比室温高一度。

          service: climate.set_temperature
          target:
            entity_id: climate.master_room
          data:
            temperature: '{{ (state_attr(''climate.master_room'', ''temperature'')) + -1}}'

4. 电视
单击:切换电视亮度,这个是通过事先在电视里把四个不同的色彩模式设置到四种不同的亮度,然后和第一个按键一样用状态机来在四个亮度之间顺序切换,Dynamic (4) -> Standard(3) -> Natural (2) -> Movie (1)。
游客,如果您要查看本帖隐藏内容请回复
双击:什么都不会发生,但会让旋钮选中这个设备,选中后就可以用旋钮调整啦
长按: 开关电视
游客,如果您要查看本帖隐藏内容请回复
旋钮+/旋钮-(再按了这个4号按键后):调高/调低音量3格。
              service: media_player.volume_set
              entity_id:
              - media_player.master_room_tv
              data_template:
                volume_level: '{{ (state_attr(''media_player.master_room_tv'', ''volume_level'')) + 0.03 }}'


6. 窗帘
单击:开关窗帘
              service: homeassistant.toggle
              entity_id: cover.master_room_curtain
双击,长按:什么都不会发生,但会让旋钮选中这个设备,选中后就可以用旋钮调整啦
旋钮+/旋钮-(再按了这个设备按键后):打开/关闭窗帘一部分,我设置了3档,如果开合低于等于0,和高于100,窗帘会完全开合/关闭。(
游客,如果您要查看本帖隐藏内容请回复


4.自动化的维护和精简
1. 一个房间可能有多个不同种类的无线开关,都会控制同一个动作,何不把动作的代码共用起来?把触发和动作利用trigger id来解耦。

trigger这边给相应的trigger的动作命名
  trigger:
  - platform: state
    entity_id:
    - sensor.cf0c1f9b4dbc_action
    to:
    - knob_anticlockwise_after_toggling_button_4
    - knob_anticlockwise_after_toggling_button_4_and_knob
    id: DECREMENT_TV_VOLUME
然后动作那边用命名的trigger来调用相应动作
action:
  choose:
    - conditions:
      - condition: trigger
        id: DECREMENT_TV_VOLUME
      sequence:
              service: media_player.volume_set
              entity_id:
              - media_player.master_room_sonos
              data_template:
                volume_level: '{{ (state_attr(''media_player.master_room_sonos'', ''volume_level'')) + -0.03 }}'

这样自动化也好查错,虽然流程图有点宽。
屏幕截图 2024-05-11 105503.png

2. 多个房间可能有多个不同种类的无线开关控制多个房内相同功能的设备(比如都有吸顶灯),都会控制同一个动作,何不把动作的代码共用起来?用模板的思路来解决https://bbs.hassbian.com/thread-20292-1-1.html
我的python模板的trigger部分
游客,如果您要查看本帖隐藏内容请回复
我的python模板的action部分
游客,如果您要查看本帖隐藏内容请回复


房间模板源代码 https://github.com/relliky/Tais_ ... onfig_yaml.py#L1833
生成的自动化 https://github.com/relliky/Tais_ ... ter_room.yaml#L1908






评分

参与人数 6金钱 +71 HASS币 +20 收起 理由
gzroc + 10 厉害了word楼主!
565656556 + 1 感谢楼主分享!
+ 20 + 20 膜拜大神!
jjcs + 12 高手,这是高手!
隔壁的王叔叔 + 12 感谢楼主分享!
sorrypqa + 16 高手,这是高手!

查看全部评分

我家全屋智能的HA设置 https://github.com/relliky/Tais_Home_Assistant_Config
回复

使用道具 举报

31

主题

989

帖子

4464

积分

论坛元老

Rank: 8Rank: 8

积分
4464
金钱
3460
HASS币
90
 楼主| 发表于 2024-5-11 07:33:22 | 显示全部楼层
我的妈,我发的那么长的帖子怎么没了。。。是因为我发了个emoji么。。。。 好烦。。回头再重新写吧。。。
我家全屋智能的HA设置 https://github.com/relliky/Tais_Home_Assistant_Config
回复

使用道具 举报

31

主题

989

帖子

4464

积分

论坛元老

Rank: 8Rank: 8

积分
4464
金钱
3460
HASS币
90
 楼主| 发表于 2024-5-11 07:40:19 | 显示全部楼层
东西没了,不该发emoji的。。没想到都没了。。。等有空我再重新写一遍吧。。。这次一定备份到别的地方。。。
我家全屋智能的HA设置 https://github.com/relliky/Tais_Home_Assistant_Config
回复

使用道具 举报

3

主题

79

帖子

329

积分

中级会员

Rank: 3Rank: 3

积分
329
金钱
250
HASS币
0
发表于 2024-5-11 10:02:44 | 显示全部楼层
辛苦,支持一下
回复

使用道具 举报

23

主题

338

帖子

4336

积分

元老级技术达人

积分
4336
金钱
3973
HASS币
120
发表于 2024-5-11 10:42:13 | 显示全部楼层
好几个月前就提push给gw3插件,支持了
回复

使用道具 举报

10

主题

157

帖子

851

积分

高级会员

Rank: 4

积分
851
金钱
694
HASS币
0
发表于 2024-5-11 11:11:47 | 显示全部楼层
看了个寂寞,哈哈哈
回复

使用道具 举报

2

主题

367

帖子

3014

积分

论坛元老

Rank: 8Rank: 8

积分
3014
金钱
2647
HASS币
0
发表于 2024-5-11 11:57:42 | 显示全部楼层
emoji了?
回复

使用道具 举报

113

主题

1662

帖子

5225

积分

元老级技术达人

积分
5225
金钱
3558
HASS币
30
发表于 2024-5-11 16:00:23 | 显示全部楼层
这个多少钱,是用什么插件接入的
回复

使用道具 举报

31

主题

989

帖子

4464

积分

论坛元老

Rank: 8Rank: 8

积分
4464
金钱
3460
HASS币
90
 楼主| 发表于 2024-5-11 18:05:52 | 显示全部楼层
121665460 发表于 2024-5-11 10:42
好几个月前就提push给gw3插件,支持了

被作者在大版本更新的时候改坏了,我又提了一个PR。https://github.com/AlexxIT/XiaomiGateway3/pull/1352

你是github那个叫nesror的大神吗?之前那个PR是你提交的?
我家全屋智能的HA设置 https://github.com/relliky/Tais_Home_Assistant_Config
回复

使用道具 举报

31

主题

989

帖子

4464

积分

论坛元老

Rank: 8Rank: 8

积分
4464
金钱
3460
HASS币
90
 楼主| 发表于 2024-5-11 18:09:42 | 显示全部楼层
bugensui 发表于 2024-5-11 16:00
这个多少钱,是用什么插件接入的

我文章重新打了一遍。gateway3,拼多多上买的,这个玻璃的不到一百
我家全屋智能的HA设置 https://github.com/relliky/Tais_Home_Assistant_Config
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-26 09:54 , Processed in 0.937730 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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