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

 找回密码
 立即注册
查看: 65641|回复: 151

[经验分享] 踩个使用Aqara无线开关(贴墙式)的坑

  [复制链接]

23

主题

302

帖子

2165

积分

论坛技术达人

积分
2165
金钱
1838
HASS币
110

活跃会员教程狂人

发表于 2018-7-4 17:14:20 | 显示全部楼层 |阅读模式
本帖最后由 cnk700i 于 2018-7-5 22:24 编辑

想起上次做光感+人体感应自动控灯的时候,用aqara无线开关(贴墙式)控灯遇到个小坑。像zigbee墙壁开关,接入空调伴侣后,HA会实例化switch.wall_switch_xxxxxxxx,但没找到无线开关。于是又苦逼去读代码了,还算顺利解决,惯例做个总结分享下。考虑单帖代码内容有点少,干脆把解决过程理一理也说了。

环境及准备

  1. Ubuntu18.04 + HA 0.71.0
  2. aqara空调伴侣升级版(网关)3. aqara无线开关(贴墙式)

这样子的
未命名图片.png
  1. python模块目录:/srv/homeassistant/homeassistant_venv/lib/python3.6/site-packages/,后面用{python模块目录}代替。

解决过程记录

Step1

首先查看看HA日志,发现有错误信息:

ERROR (SyncWorker_8) [xiaomi_gateway] Unsupported device found! Please create an issue at https://github.com/Danielhiversen/PyXiaomiGateway/issues and provide the following data: {'cmd': 'read_rsp', 'model': 'sensor_86sw1',……

明显是说不支持sensor_86sw1的类型,还注意信息中的[xiaomi_gateway]说明是xiaomi_gateway模块。找到{python模块目录}/xiaomi_gateway/init.py,可以看到支持的设备类型是在device_types = {}中定义的,我们把sensor_86sw1、sensor_86sw2(双键开关)加进去。

    ……省略……        
    class XiaomiGateway(object):
    ……省略……
            def _discover_devices(self):
    ……省略……
                    device_types = {
        'sensor': ['sensor_ht', 'gateway', 'gateway.v3', 'weather',
                   'weather.v1', 'sensor_motion.aq2', 'acpartner.v3'],
        'binary_sensor': ['magnet', 'sensor_magnet', 'sensor_magnet.aq2',
                          'motion', 'sensor_motion', 'sensor_motion.aq2',
                          'switch', 'sensor_switch', 'sensor_switch.aq2', 'sensor_switch.aq3',
                          '86sw1', 'sensor_86sw1.aq1', 'sensor_86sw1',
                          '86sw2', 'sensor_86sw2.aq1', 'sensor_86sw2',
                          'cube', 'sensor_cube', 'sensor_cube.aqgl01',
                          'smoke', 'sensor_smoke',
                          'natgas', 'sensor_natgas',
                          'sensor_wleak.aq1'],
        'switch': ['plug',
                   'ctrl_neutral1', 'ctrl_neutral1.aq1',
                   'ctrl_neutral2', 'ctrl_neutral2.aq1',
                   'ctrl_ln1', 'ctrl_ln1.aq1',
                   'ctrl_ln2', 'ctrl_ln2.aq1',
                   '86plug', 'ctrl_86plug', 'ctrl_86plug.aq1'],
        'light': ['gateway', 'gateway.v3'],
        'cover': ['curtain'],
        'lock': ['lock.aq1']}
    ……省略……

Step2

xiaomi_gateway模块只是完成把设备信息和网关关联起来,正式的创建设备是在{python模块目录}/homeassistant/components/binary_sensor/xiaomi_aqara.py中实现的。所以打开看里面代码可以看到无线开关是在elif model in ['86sw1', 'sensor_86sw1.aq1']、elif model in ['86sw2', 'sensor_86sw2.aq1']里面的,确是没有“sensor_86sw1”,那继续添加。

Tips:单键开关是实例化一个XiaomiButton的,双开关是实例化成三个XiaomiButton的(一个同时按双键触发)。

    ……省略……                
    def setup_platform(hass, config, add_devices, discovery_info=None):
    ……省略……        
            if model in ['motion', 'sensor_motion', 'sensor_motion.aq2']:
        ……省略……        
            elif model in ['86sw1', 'sensor_86sw1.aq1', 'sensor_86sw1']:
            devices.append(XiaomiButton(device, 'Wall Switch', 'channel_0',
                                        hass, gateway))
    elif model in ['86sw2', 'sensor_86sw2.aq1', 'sensor_86sw1']:    
            devices.append(XiaomiButton(device, 'Wall Switch (Left)',    
                                        'channel_0', hass, gateway))
            devices.append(XiaomiButton(device, 'Wall Switch (Right)',
                                        'channel_1', hass, gateway))
             devices.append(XiaomiButton(device, 'Wall Switch (Both)',
                                        'dual_channel', hass, gateway))
            ……省略……

Step3

重启,HA可以成功识别出无线开关了。不过有个问题,点击按钮好像什么反应都没有,看回调方法中所执行的parse_data(),正常是会有click事件生成的。

    ……省略……
    class XiaomiButton(XiaomiBinarySensor):
    ……省略……
            def parse_data(self, data, raw_data):
    ……省略……
            self._hass.bus.fire('click', {
                'entity_id': self.entity_id,
                'click_type': click_type
            })
    ……省略……

Step4

看了下aqara的文档发现,无线开关的click_type是button_0、button_1,而不是channel_0、channel_1。那要把Step2的修改的代码恢复,新增sensor_86sw1、sensor_86sw2设备类型的处理代码。重启测试,日志有EVENT消息,可以正常使用了。

        ……省略……
                    elif model in ['86sw1', 'sensor_86sw1.aq1']:
            devices.append(XiaomiButton(device, 'Wall Switch', 'channel_0',
                                        hass, gateway))
        elif model in ['sensor_86sw1']:     #增加sensor_86sw1
            devices.append(XiaomiButton(device, 'Wall Switch', 'button_0',
                                        hass, gateway))
        elif model in ['86sw2', 'sensor_86sw2.aq1']:    
            devices.append(XiaomiButton(device, 'Wall Switch (Left)',
                                        'channel_0', hass, gateway))
            devices.append(XiaomiButton(device, 'Wall Switch (Right)',
                                        'channel_1', hass, gateway))
            devices.append(XiaomiButton(device, 'Wall Switch (Both)',
                                        'dual_channel', hass, gateway))
        elif model in ['sensor_86sw2']:     #增加sensor_86sw2
            devices.append(XiaomiButton(device, 'Wall Switch (Left)',
                                        'button_0', hass, gateway))
            devices.append(XiaomiButton(device, 'Wall Switch (Right)',
                                        'button_1', hass, gateway))
            devices.append(XiaomiButton(device, 'Wall Switch (Both)',
                                        'dual_channel', hass, gateway))
                    ……省略……

小结

最后简单介绍下我所理解的网关工作流程吧,相关的工作是由{python模块目录}/homeassistant/components/xiaomi_aqara.py来完成的。


游客,如果您要查看本帖隐藏内容请回复





评分

参与人数 2金钱 +7 收起 理由
dizherui + 5 建议提交,以后大家升级版本就都支持啦啦啦.
hundajdx + 2 膜拜大神!

查看全部评分

博客 https://ljr.im
回复

使用道具 举报

5

主题

319

帖子

2069

积分

金牌会员

Rank: 6Rank: 6

积分
2069
金钱
1750
HASS币
0
发表于 2018-7-4 17:20:15 | 显示全部楼层
写的很专业
回复

使用道具 举报

2

主题

199

帖子

3373

积分

论坛元老

Rank: 8Rank: 8

积分
3373
金钱
3174
HASS币
0
发表于 2018-7-4 18:21:59 | 显示全部楼层
学习一下
回复

使用道具 举报

0

主题

96

帖子

518

积分

论坛积极会员

积分
518
金钱
422
HASS币
0
发表于 2018-7-4 21:21:10 | 显示全部楼层
很好,学习了
回复

使用道具 举报

23

主题

660

帖子

3108

积分

论坛元老

Rank: 8Rank: 8

积分
3108
金钱
2448
HASS币
10
发表于 2018-7-4 22:17:05 | 显示全部楼层
一脸懵逼
回复

使用道具 举报

23

主题

302

帖子

2165

积分

论坛技术达人

积分
2165
金钱
1838
HASS币
110

活跃会员教程狂人

 楼主| 发表于 2018-7-4 23:01:11 | 显示全部楼层

其实就是官方的组件缺了设备型号,稍微改下代码补上型号判断去就能用了。。
博客 https://ljr.im
回复

使用道具 举报

6

主题

484

帖子

3980

积分

论坛元老

Rank: 8Rank: 8

积分
3980
金钱
3496
HASS币
0
发表于 2018-7-5 11:35:59 | 显示全部楼层
我的小米网关用不了,是小米软件升级的原因吗?
回复

使用道具 举报

23

主题

302

帖子

2165

积分

论坛技术达人

积分
2165
金钱
1838
HASS币
110

活跃会员教程狂人

 楼主| 发表于 2018-7-5 12:27:59 | 显示全部楼层
robotxc 发表于 2018-7-5 11:35
我的小米网关用不了,是小米软件升级的原因吗?

用不了是指?网关无法接入ha吗?
博客 https://ljr.im
回复

使用道具 举报

6

主题

484

帖子

3980

积分

论坛元老

Rank: 8Rank: 8

积分
3980
金钱
3496
HASS币
0
发表于 2018-7-5 12:58:16 | 显示全部楼层
cnk700i 发表于 2018-7-5 12:27
用不了是指?网关无法接入ha吗?

谢谢,搞定。DOCKER 装的HOMEASSISTANT,报错找不到小米网关,各种搞,都不行。把小米网关拨电后意外好了,莫名其妙。
回复

使用道具 举报

19

主题

341

帖子

1133

积分

金牌会员

Rank: 6Rank: 6

积分
1133
金钱
792
HASS币
0
发表于 2018-7-5 13:36:43 | 显示全部楼层
看不大懂,实在没办法。智商低。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-27 17:44 , Processed in 0.061448 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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