Home AssistantНалаштування

Створюємо власний external converter на прикладі Orvibo Smart sticker switch

Може трапитись ситуація, коли ви придбали нібито сумісний zigbee девайс, та він чомусь не працює, а zibbee2mqtt повідомляє, що пристрій не підтримується.

zigbee unsupported

При натисканні кнопок чи отриманні показів “не сумісного” девайсу в логах можемо бачити подібні повідомлення:

Debug Received Zigbee message from '0x00124b000cc8dbf4', type 'raw', cluster '23', data '{"data":[25,0,8,3,0,0],"type":"Buffer"}' from endpoint 1 with groupID 0
Warning Received message from unsupported device with Zigbee model '51725b7bcba945c8a595b325127461e9' and manufacturer name '欧瑞博'
Debug Received Zigbee message from '0x00124b000cc8dbf4', type 'raw', cluster '23', data '{"data":[25,0,8,11,0,0],"type":"Buffer"}' from endpoint 1 with groupID 0
Warning Received message from unsupported device with Zigbee model '51725b7bcba945c8a595b325127461e9' and manufacturer name '欧瑞博'

Існує два способи, щоб зробити ваш пристрій сумісним з zibbee2mqtt. Перший спосіб – написання зовнішнього конвертера, другий – додавання вашої zigbee моделі в репозиторій zigbee-herdsman-converters. Розглянемо обидва способи.


Пишемо власний zigbee2mqtt external converter

Конвертер – це невеликий файл з розширенням js, в якому мають бути вказані атрибути пов’язані з роботою вашого девайса. Точніше – перетворення повідомлень від пристрою до координатора в “зрозумілий” формат.

Знаючи точну назву вашого пристрою, знайдемо її у вже готовому конвертері за адресою. Знаходимо тут у файлі наступний код:

// ORVIBO
    {
        zigbeeModel: ['3c4e4fc81ed442efaf69353effcdfc5f'],
        model: 'CR11S8UZ',
        vendor: 'ORVIBO',
        description: 'Smart sticker switch',
        fromZigbee: [fz.orvibo_raw_1],
        exposes: [e.action(['button_1_click', 'button_1_hold', 'button_1_release', 'button_2_click', 'button_2_hold', 'button_2_release',
            'button_3_click', 'button_3_hold', 'button_3_release', 'button_4_click', 'button_4_hold', 'button_4_release'])],
        toZigbee: [],
    },

Давайте трохи модифікуємо його і збережемо в окремому файлі, замінивши zigbeeModel на вашу з логів (‘51725b7bcba945c8a595b325127461e9’) :

const device = {
    zigbeeModel: ['51725b7bcba945c8a595b325127461e9'],
    model: 'CR11S8UZ',
    vendor: 'ORVIBO',
    description: 'Smart sticker switch',
    fromZigbee: [fz.orvibo_raw_1],
    exposes: [e.action(['button_1_click', 'button_1_hold', 'button_1_release', 'button_2_click', 'button_2_hold', 'button_2_release',
            'button_3_click', 'button_3_hold', 'button_3_release', 'button_4_click', 'button_4_hold', 'button_4_release'])],
    toZigbee: [],
};

Додайте наступний код в кінці цього файлу:

module.exports = device;

Далі нам необхідно знайти у файлі код, що починається з orvibo_raw_1, це “слово” ми вже зустрічали в стрічці

fromZigbee: [fz.orvibo_raw_1] 

Скопіюємо цю секцію в наш файл і передамо її константі fz, вставимо цей код над

const device = {... ...};

У вас має вийти подібний код

const fz = {
	orvibo_raw_1: {
        cluster: 23,
        type: 'raw',
        convert: (model, msg, publish, options, meta) => {
            // 25,0,8,3,0,0 - click btn 1
            // 25,0,8,3,0,2 - hold btn 1
            // 25,0,8,3,0,3 - release btn 1
            // 25,0,8,11,0,0 - click btn 2
            // 25,0,8,11,0,2 - hold btn 2
            // 25,0,8,11,0,3 - release btn 2
            // 25,0,8,7,0,0 - click btn 3
            // 25,0,8,7,0,2 - hold btn 3
            // 25,0,8,7,0,3 - release btn 3
            // 25,0,8,15,0,0 - click btn 4
            // 25,0,8,15,0,2 - hold btn 4
            // 25,0,8,15,0,3 - release btn 4
            // TODO: do not know how to get to use 5,6,7,8 buttons
            const buttonLookup = {
                3: 'button_1',
                11: 'button_2',
                7: 'button_3',
                15: 'button_4',
            };
            const actionLookup = {
                0: 'click',
                2: 'hold',
                3: 'release',
            };
            const button = buttonLookup[msg.data[3]];
            const action = actionLookup[msg.data[5]];
            if (button) {
                return {action: `${button}_${action}`};
            }
        },
    },
};

Додайте на самому початку коду наступне:

const exposes = require('zigbee-herdsman-converters/lib/exposes');
const e = exposes.presets;

Після цього, коли все зроблено правильно, файл має виглядати так:

const exposes = require('zigbee-herdsman-converters/lib/exposes');
const e = exposes.presets;
const fz = {
	orvibo_raw_1: {
        cluster: 23,
        type: 'raw',
        convert: (model, msg, publish, options, meta) => {
            // 25,0,8,3,0,0 - click btn 1
            // 25,0,8,3,0,2 - hold btn 1
            // 25,0,8,3,0,3 - release btn 1
            // 25,0,8,11,0,0 - click btn 2
            // 25,0,8,11,0,2 - hold btn 2
            // 25,0,8,11,0,3 - release btn 2
            // 25,0,8,7,0,0 - click btn 3
            // 25,0,8,7,0,2 - hold btn 3
            // 25,0,8,7,0,3 - release btn 3
            // 25,0,8,15,0,0 - click btn 4
            // 25,0,8,15,0,2 - hold btn 4
            // 25,0,8,15,0,3 - release btn 4
            // TODO: do not know how to get to use 5,6,7,8 buttons
            const buttonLookup = {
                3: 'button_1',
                11: 'button_2',
                7: 'button_3',
                15: 'button_4',
            };

            const actionLookup = {
                0: 'click',
                2: 'hold',
                3: 'release',
            };
            const button = buttonLookup[msg.data[3]];
            const action = actionLookup[msg.data[5]];
            if (button) {
                return {action: `${button}_${action}`};
            }
        },
    },
};
const device = {
    zigbeeModel: ['51725b7bcba945c8a595b325127461e9'],
    model: 'CR11S8UZ',
    vendor: 'ORVIBO',
    description: 'Smart sticker switch',
    fromZigbee: [fz.orvibo_raw_1],
    exposes: [e.action(['button_1_click', 'button_1_hold', 'button_1_release', 'button_2_click', 'button_2_hold', 'button_2_release',
            'button_3_click', 'button_3_hold', 'button_3_release', 'button_4_click', 'button_4_hold', 'button_4_release'])],
    toZigbee: [],
};
module.exports = device;

Збережіть цей файл з розширенням js і розмістіть його в папці zigbee2mqtt. Зазвичай вона знаходиться за адресою \config\zigbee2mqtt.

add external converter

Відкрийте інтерфейс zigbee2mqtt і перейдіть в розділ “налаштування”. У вкладці “External converters” натисніть “+” та введіть назву створеного вами файла. Після цього, збережіть зміни та перезавантажте zigbee2mqtt, (в правому верхньому куті з’явиться кнопка “перезавантажити”).

Тепер ви можете користуватися даним пристроєм завдяки зовнішньому конвертеру.

Додаємо zigbeeModel зробивши форк в репозиторії

Це другий спосіб зробити ваш пристрій сумісним. Він найлегший, але зазначу, що девайс стане сумісним не зразу, а лише після того, як ваші правки в репозиторії затвердять. Після затвердження, зміни будуть доступні спочатку в dev-версії zigbee2mqtt, і лише через кілька тижнів в основній.

Щоб внести зміни до файлу, перейдіть за посиланням і натисніть кнопку “редагувати” (звичайно, у вас має бути аккаунт на github).

github edit file

Знайдіть секцію з назвою вашого пристрою і додайте вашу zigbeeModel через кому, поруч з вже існуючою. Внизу сторінки вкажіть причину вашої зміни і опишіть її. Текст, що ви будете заповнювати, необхідно писати лише англійською мовою.

github edit file

Відправте пропозицію на редагування натиснувши кнопку під формою.

Якщо у файлі не зроблено помилок – ви побачите підтвердження про проходження автоматичної перевірки. Максимум через добу, вашу пропозицію розглянуть вручну. Вже після затвердження змін ви можете оновити dev-версію модуля zigbee2mqtt в своєму Home Assistant, і тепер матимете робочий zigbee девайс.

2 thoughts on “Створюємо власний external converter на прикладі Orvibo Smart sticker switch

Залишити відповідь