cnk700i 发表于 2018-7-4 17:14:20

踩个使用Aqara无线开关(贴墙式)的坑

本帖最后由 cnk700i 于 2018-7-5 22:24 编辑



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

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

这样子的


4. python模块目录:/srv/homeassistant/homeassistant_venv/lib/python3.6/site-packages/,后面用{python模块目录}代替。


## 解决过程记录 ##
### Step1 ###
> 首先查看看HA日志,发现有错误信息:

> ERROR (SyncWorker_8) 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模块。找到{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 ###
> 看了下(http://docs.opencloud.aqara.cn/d ... N-communication/#86)发现,无线开关的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来完成的。

**** Hidden Message *****




wgqtx 发表于 2018-7-4 17:20:15

写的很专业

yingzaiha 发表于 2018-7-4 18:21:59

学习一下

karlliang 发表于 2018-7-4 21:21:10

很好,学习了

wshc1216 发表于 2018-7-4 22:17:05

一脸懵逼

cnk700i 发表于 2018-7-4 23:01:11

wshc1216 发表于 2018-7-4 22:17
一脸懵逼

其实就是官方的组件缺了设备型号,稍微改下代码补上型号判断去就能用了。。

robotxc 发表于 2018-7-5 11:35:59

我的小米网关用不了,是小米软件升级的原因吗?

cnk700i 发表于 2018-7-5 12:27:59

robotxc 发表于 2018-7-5 11:35
我的小米网关用不了,是小米软件升级的原因吗?

用不了是指?网关无法接入ha吗?

robotxc 发表于 2018-7-5 12:58:16

cnk700i 发表于 2018-7-5 12:27
用不了是指?网关无法接入ha吗?

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

yjb89 发表于 2018-7-5 13:36:43

看不大懂,实在没办法。智商低。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 踩个使用Aqara无线开关(贴墙式)的坑