找回密码
 立即注册

微信扫码登录

搜索
查看: 15715|回复: 30

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

  [复制链接]

4

主题

30

回帖

246

积分

中级会员

积分
246
金钱
212
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 感谢楼主分享!

查看全部评分

回复

使用道具 举报

5

主题

85

回帖

623

积分

高级会员

积分
623
金钱
533
HASS币
0
发表于 2024-6-15 00:54:01 | 显示全部楼层
目前在 zigbee-herdsman-converters 文件夹看不到 device了?  请问是去了哪里吗?  我已经将开关正常接入了,目前可以正常控制开关灯,但是问题是  面板的背光灯目前无法控制,请问有大神知道怎么做吗? 谢谢
回复

使用道具 举报

27

主题

95

回帖

693

积分

高级会员

积分
693
金钱
571
HASS币
0
发表于 2024-1-9 20:05:12 | 显示全部楼层
##注意:引用的文件路径要改,因为我们自己的JS文件放在了\\192.XX.XX.XX\config\zigbee2mqtt文件夹下,而我们参考的JS文件是放在\\192.XX.XX.XX\config\zigbee2mqtt\的
具体改法把。。换成zigbee-herdsman-converters就行了.
楼主的这句中文我死活看不懂啊
还有这玩意是啥,[color=var(--color-accent-fg)]
回复

使用道具 举报

4

主题

30

回帖

274

积分

中级会员

积分
274
金钱
240
HASS币
0
发表于 2023-12-1 00:16:53 | 显示全部楼层
docker安装的如何配置能否指个路?
回复

使用道具 举报

0

主题

10

回帖

54

积分

注册会员

积分
54
金钱
44
HASS币
0
发表于 2023-11-28 06:53:46 | 显示全部楼层

感谢楼主,需要
回复

使用道具 举报

2

主题

5

回帖

44

积分

新手上路

积分
44
金钱
37
HASS币
0
发表于 2023-11-27 14:31:59 | 显示全部楼层
我的设备状态显示不支持,电源是问号,这些都被我搞成支持了,电源最终显示一个插头标志,但是就是搞不出灯的公开控制面板。对于自定义的zigbee灯,比如说,我用开发板自已diy的zigbee灯,没有在市场上公开发售,怎么把zigbee2MQTT中的公开控制面板给搞出来,那我就服了。见我贴子:https://bbs.hassbian.com/thread-23389-1-1.html
回复

使用道具 举报

1

主题

2

回帖

26

积分

新手上路

积分
26
金钱
23
HASS币
0
发表于 2023-10-13 19:32:16 | 显示全部楼层
值得学习,有用
回复

使用道具 举报

1

主题

5

回帖

44

积分

新手上路

积分
44
金钱
38
HASS币
0
发表于 2023-10-2 22:46:23 | 显示全部楼层
感谢!好像可以解决我用的第三方设备的问题了
回复

使用道具 举报

7

主题

36

回帖

437

积分

中级会员

积分
437
金钱
394
HASS币
0
发表于 2023-9-28 10:45:11 | 显示全部楼层
已经用之前版本的成功了,谢谢解答!
回复

使用道具 举报

5

主题

60

回帖

1000

积分

金牌会员

积分
1000
金钱
935
HASS币
0
发表于 2023-9-19 17:14:36 | 显示全部楼层
hmasstt 发表于 2023-6-30 20:25
我就是树莓派的TF卡挂了才来重新配置的,之前的配置文件都没了,重新写碰到的问题是:以前要用到expose的 ...

这个可能需要把ts转为js才行,如果你会转的话可以试一下,或者使用之前版本的js文件试试
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )

GMT+8, 2025-8-18 02:30 , Processed in 0.058336 second(s), 16 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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