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

 找回密码
 立即注册
查看: 6289|回复: 29

[基础教程] zigbee2mqtt 添加 新设备/不支持的设备/自定义设备

  [复制链接]

4

主题

34

帖子

244

积分

中级会员

Rank: 3Rank: 3

积分
244
金钱
210
HASS币
0
发表于 2022-8-29 14:38:57 | 显示全部楼层 |阅读模式
本帖最后由 ww2435240 于 2022-8-29 14:43 编辑

之前看了论坛和网上的一些教程,要么是不太细致,要么是因为版本迭代不适应了,导致我琢磨了好几天。现在把我琢磨的结果分享给有需要的朋友,方便大家更容易上手和避免采坑。
一、安装环境
我的是虚拟机安装的homeassistant OS,版本号:[color=var(--primary-text-color)]Home Assistant 2022.8.5 Supervisor 2022.08.5 Operating System 8.5 前端版本 20220802.0 - latest
add-on安装的zigbee2mqtt。版本号:Current version: 1.27.0-1
我参考别人教程感觉用docker安装的和add-on安装的可能配置新设备的方法不一样,我没用docker测试,所以仅供参考。
二、参考网站
1.Support new devices | Zigbee2MQTT支持新设备的官网
2.Koenkk (Koen Kanters) · GitHub作者的GitHub
3.https://www.zigbee2mqtt.io/supported-devices/#s=H1%20&v=Xiaomi   官方已经支持的设备列表
4.https://bbs.hassbian.com/thread-13030-1-9.html论坛的教程
三、具体步骤
1、下载[color=var(--color-accent-fg)]zigbee-herdsman-converters。然后解压到\\ha的IP\config\zigbee2mqtt文件夹下(我是 用add-on插件,安装的Samba share,然后windows可以直接访问),
解压完记得文件夹改名成[color=var(--color-accent-fg)]zigbee-herdsman-converters
按照官网的说明和别写的设备配置文件,我理解这个[color=var(--color-accent-fg)]zigbee-herdsman-converters是一个中间件或这是一个库文件,自己写的设备配置文件要引用这里的东西,一开始我忽略这个了,一直报错,按上才好
1.jpg
2、添加你自己的zigbee设备,打开zigbee2mqtt,右上角,点一下“允许添加新设备”,按照你自己设备的说明配网,就能自动识别发现了。发现的设备Manufacturer/制造商那一栏,如果写的Unsupported/不支持,就是要自己写设备配置了,如果Model/型号那一栏,能识别出来东西就代表可以通过自己写配置文件来支持设备,如果空白的,按论坛的说法就暂时无解。
3、在\config\zigbee2mqtt\文件下,新建记事本,然后名字改成 ****.js(最好英文名,怕中文报错,我没试过中文),这就是你这个设备的配置文件,一会往里填代码用
4、修改zigbee2mqtt的配置文件,路径 :config\zigbee2mqtt\configuration.yaml。然后添加外部转换器(官方应该管你刚才建立的js文件叫做外部转换器)

记事本打开上面yaml文件,最后一行添加如下代码:
external_converters:
  - 外部转换器1.js
  - 外部转换器2.js
5、重启zigbee2mqtt。
如果在第3步你已经填好代码了,这时候就应该能识别设备了,下面说代码具体咋添加。
四、写配置文件(重头戏)
1、先说原理
记得我们刚才的[color=var(--color-accent-fg)]zigbee-herdsman-converters文件夹吧?点进去里面还有一个devices文件夹,这里面全是*****.js文件,这些就是重要的参考配置代码。这些文件是应该按照厂商名字命名的,可以配合
https://www.zigbee2mqtt.io/supported-devices/#s=H1%20&v=Xiaomi  官方已经支持的设备列表页面使用:在网页Vendor那个选项找到你设备的品牌,然后搜索就会显示该品牌所有以支持的设备,找一个跟你的设备功能最接近的,点开,记录一下Model。然后再去[color=var(--color-accent-fg)]zigbee-herdsman-converters\devices文件夹下找到该品牌的JS文件,打开它,在里面搜索刚才记录的Model,就能找到该设备的具体配置代码了,然后你复制出来,照猫画虎改成你的设备就行了。
2、具体例子1:绿米-零火单键墙壁智能开关 H1 Pro。
打开[color=var(--color-accent-fg)]zigbee-herdsman-converters\devices\xiaomi.js文件,把整个文件头复制到你的JS文件里(我是从第1行到第40行全都复制的)
##注意:引用的文件路径要改,因为我们自己的JS文件放在了\\192.XX.XX.XX\config\zigbee2mqtt文件夹下,而我们参考的JS文件是放在\\192.XX.XX.XX\config\zigbee2mqtt\的
具体改法把。。换成zigbee-herdsman-converters就行了
2.png
然后开始找相近设备代码,我在已支持页面找到了一个绿米双键H1pro,就是下面这个图
3.png
再在xiaomi.js里搜这个Model号找到配置代码
4.png
由于我从来没写过这玩意,没敢轻易动手改,我又在代码里继续找,我找到一个'Aqara smart wall switch H1 EU (with neutral, single rocker)' 欧版H1 Pro单键零火、一个'Aqara smart wall switch T1 (with neutral, single rocker)'绿米T1单键零火。于是我决定先直接copy欧版H1的代码试试,不行再改(米家/绿米开关分零火和单火,代码里with neutral代表零火,no neutral代表单火,尽量这个别混用。)。在刚才文件头后面加一个module.exports = {  };   结构,复制代码粘贴到{}里,之后把设备识别号换成你自己的就行了,下面代码有注释
整个配置文件代码如下:
const exposes = require('zigbee-herdsman-converters/lib/exposes');
const fz = {...require('zigbee-herdsman-converters/converters/fromZigbee'), legacy: require('zigbee-herdsman-converters/lib/legacy').fromZigbee};
const tz = require('zigbee-herdsman-converters/converters/toZigbee');
const ota = require('zigbee-herdsman-converters/lib/ota');
const constants = require('zigbee-herdsman-converters/lib/constants');
const reporting = require('zigbee-herdsman-converters/lib/reporting');
const extend = require('zigbee-herdsman-converters/lib/extend');
const e = exposes.presets;
const ea = exposes.access;
const globalStore = require('zigbee-herdsman-converters/lib/store');

const xiaomiExtend = {
    light_onoff_brightness_colortemp: (options={disableColorTempStartup: true}) => ({
        ...extend.light_onoff_brightness_colortemp(options),
        fromZigbee: extend.light_onoff_brightness_colortemp(options).fromZigbee.concat([
            fz.xiaomi_bulb_interval, fz.ignore_occupancy_report, fz.ignore_humidity_report,
            fz.ignore_pressure_report, fz.ignore_temperature_report,
        ]),
    }),
};

const preventReset = async (type, data, device) => {
    if (
        // options.allow_reset ||
        type !== 'message' ||
        data.type !== 'attributeReport' ||
        data.cluster !== 'genBasic' ||
        !data.data[0xfff0] ||
        // eg: [0xaa, 0x10, 0x05, 0x41, 0x87, 0x01, 0x01, 0x10, 0x00]
        !data.data[0xFFF0].slice(0, 5).equals(Buffer.from([0xaa, 0x10, 0x05, 0x41, 0x87]))
    ) {
        return;
    }
    const options = {manufacturerCode: 0x115f};
    const payload = {[0xfff0]: {
        value: [0xaa, 0x10, 0x05, 0x41, 0x47, 0x01, 0x01, 0x10, 0x01],
        type: 0x41,
    }};
    await device.getEndpoint(1).write('genBasic', payload, options);
};

module.exports = {

        zigbeeModel: ['lumi.switch.n1acn1'],  //设备型号,就是你Zigbee2mqtt识别出来的Model那一栏,一定要改自己的
        model: 'H1Pro',    //这个model是你把这个设备搞成支持设备之后在Zigbee2mqtt-Model那一栏要显示的东西,可以随便写,但是别用人家原有的,一定改一下
        vendor: 'Xiaomi',  //品牌名,也是显示用的,你随便搞,尽量别用中文
        description: 'Aqara smart wall switch H1 EU (with neutral, single rocker)',  //设备描述,你也可以随便搞
       //以下是核心的功能代码,我基本上就看不懂了
        fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.aqara_opple],
        toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
            tz.xiaomi_flip_indicator_light, tz.xiaomi_led_disabled_night],
        exposes: [e.switch(), e.action(['single', 'double']), e.power().withAccess(ea.STATE_GET), e.energy(), e.flip_indicator_light(),
            e.power_outage_memory(), e.device_temperature().withAccess(ea.STATE), e.led_disabled_night(), e.power_outage_count(),
            exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withDescription('Decoupled mode')],
        onEvent: preventReset,
        configure: async (device, coordinatorEndpoint, logger) => {
            const endpoint1 = device.getEndpoint(1);
            // set "event" mode
            await endpoint1.write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
        },
};

改好后的样子,品牌和型号已经识别成你自己的了,图标也有教程换,但我懒得改了
5.png
HA里设备实体识别出来的效果,无论功能还是自动化,基本都全了,这状态可以说很完美了
6.jpg 7.png
最后:我只有绿米和小米的设备,并且我也刚接触,代码到是懂一点,但这里面函数调用啥的,没有说明文档确实不好搞。
只能照猫画虎从相近设备改,我觉得像这种直接用欧版的代码完美实现设备功能算是偷鸡的办法,绝对个例,大家不要抱太高期望都能搞这么完美。
我现在正在琢磨绿米H1的三键开关,这个就没有现成的了。
然后我还有C2窗帘电机也要自己搞。欢迎大家参考和贴自己改完的JS代码,伸手党拜谢


评分

参与人数 2金钱 +15 收起 理由
flyice + 5 论坛有你更精彩!
firewater + 10 感谢楼主分享!

查看全部评分

回复

使用道具 举报

4

主题

34

帖子

244

积分

中级会员

Rank: 3Rank: 3

积分
244
金钱
210
HASS币
0
 楼主| 发表于 2022-8-29 14:46:55 | 显示全部楼层
对了,如果JS配置文件不对的话Zigbee2mqtt启动完会有错误,可以去该add-on的日志里看具体错误信息,再琢磨咋改。
回复

使用道具 举报

0

主题

210

帖子

2181

积分

金牌会员

Rank: 6Rank: 6

积分
2181
金钱
1971
HASS币
0
发表于 2022-8-29 15:46:56 | 显示全部楼层
我就想知道怎么换图片
回复

使用道具 举报

0

主题

562

帖子

2185

积分

金牌会员

Rank: 6Rank: 6

积分
2185
金钱
1623
HASS币
0
发表于 2022-8-29 18:39:54 | 显示全部楼层
感谢楼主,需要
回复

使用道具 举报

39

主题

477

帖子

2689

积分

金牌会员

Rank: 6Rank: 6

积分
2689
金钱
2212
HASS币
10
发表于 2022-8-29 19:20:39 | 显示全部楼层
兄弟你这教程来迟了,我买的aqara窗帘伴侣就是搞不定这个又被我出掉了。。。。
看了下我好像就差在了第一步改文件夹名了,真是差之毫厘谬以千里啊。
回复

使用道具 举报

4

主题

34

帖子

244

积分

中级会员

Rank: 3Rank: 3

积分
244
金钱
210
HASS币
0
 楼主| 发表于 2022-8-29 21:29:19 | 显示全部楼层
yinghu183 发表于 2022-8-29 19:20
兄弟你这教程来迟了,我买的aqara窗帘伴侣就是搞不定这个又被我出掉了。。。。
看了下我好像就差在了第一步 ...

窗帘伴侣好想官方自带支持,你看看是这个东西不 11.png
回复

使用道具 举报

0

主题

70

帖子

926

积分

高级会员

Rank: 4

积分
926
金钱
856
HASS币
0
发表于 2022-8-29 21:30:37 | 显示全部楼层
C2窗帘电机我搞好了,T1无线开关也正常,H系列也有集成好的设备,可以仿照,固件也很重要,最新固件也是决定成败的关键。
回复

使用道具 举报

2

主题

53

帖子

642

积分

高级会员

Rank: 4

积分
642
金钱
589
HASS币
0
发表于 2022-8-29 21:57:26 | 显示全部楼层
感觉很厉害的样子,虽然我看不懂
回复

使用道具 举报

39

主题

477

帖子

2689

积分

金牌会员

Rank: 6Rank: 6

积分
2689
金钱
2212
HASS币
10
发表于 2022-8-30 09:35:47 | 显示全部楼层
ww2435240 发表于 2022-8-29 21:29
窗帘伴侣好想官方自带支持,你看看是这个东西不

可能是新增的?我那个时候只能看到序列号,会提示不支持的设备。
回复

使用道具 举报

1

主题

57

帖子

448

积分

中级会员

Rank: 3Rank: 3

积分
448
金钱
391
HASS币
0
发表于 2022-8-31 20:05:08 | 显示全部楼层
感谢分享,之前就是我不想增加网关所以有些设备没买,没想到直接支持zigbee2mqtt
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-29 07:20 , Processed in 0.066633 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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