Найти в Дзене
Жиза

WirenBoard - подключение zigbee кнопки aqara mini switch T1

Сам процесс подключения zigbee устройств описан в документации к контроллеру wirenboard, так что с подключением самого устройства проблем не возникло. Интересное началось, когда я стал настраивать действия по кнопке, тут я столкнулся с тем, что не мог корректно обработать событие. Не правильные варианты подключения к очереди устройства whenChanged: 'zigbee2mqtt/0x00158d000a84119d/action',
whenChanged: '/devices/zigbee2mqtt-0x00158d000a84119d/controls/action',
whenChanged: 'zigbee2mqtt/0x00158d000a84119d',
whenChanged: '/devices/0x00158d000a84119d/controls/action', Пытался скормить документацию в gpt, но и он не смог выдать правильный вариант, пока не поделился с ним статьей с хабра, в итоге код для wb-rules, включения кнопки выглядит так: log("===== RULES FILE LOADED =====");
defineRule({
whenChanged: "0x00158d000a84119d/action",
then: function(newValue, devName, cellName) {
log("Button action: " + newValue);
if (newValue === 'single') {
log("Singl

Сам процесс подключения zigbee устройств описан в документации к контроллеру wirenboard, так что с подключением самого устройства проблем не возникло.

Интересное началось, когда я стал настраивать действия по кнопке, тут я столкнулся с тем, что не мог корректно обработать событие.

Не правильные варианты подключения к очереди устройства

whenChanged: 'zigbee2mqtt/0x00158d000a84119d/action',
whenChanged: '/devices/zigbee2mqtt-0x00158d000a84119d/controls/action',
whenChanged: 'zigbee2mqtt/0x00158d000a84119d',
whenChanged: '/devices/0x00158d000a84119d/controls/action',

Пытался скормить документацию в gpt, но и он не смог выдать правильный вариант, пока не поделился с ним статьей с хабра, в итоге код для wb-rules, включения кнопки выглядит так:

log("===== RULES FILE LOADED =====");
defineRule({
whenChanged: "0x00158d000a84119d/action",
then: function(newValue, devName, cellName) {
log("Button action: " + newValue);
if (newValue === 'single') {
log("Single click detected!");
// Получаем текущее значение K1
var current = dev["wb-mdm3_144/K1"];
log("Current K1: " + current);
// Переключаем
dev["wb-mdm3_144/K1"] = !current;
log("Toggled K1 to: " + dev["wb-mdm3_144/K1"]);
}
}
});
log("===== RULE DEFINED =====");

Единственное, что данный код не учитывает специфику работы с zigbee, когда обновление данных приходит по событию на самом устройстве, что вызывает вызывает проблему с повторной обработкой сигнала, то есть при нажатии кнопки возникает событие 0x00158d000a84119d/action=single и при повторном нажатии через какое то время, возникает оно же и тогда newValue не будет, т.к. состояние не поменялось, как было single так и осталось. - Данную проблему сейчас решаю.

P.S. Добавил в конце if:

dev["0x00158d000a84119d/action"] = "none";

И все заработало.

P.S. Оставлю тут, что бы не потерять переписанный gpt код под wb-rules 2.0:

Для wb-rules 2.0 достаточно обернуть логику в типизированную функцию и использовать типы движка, синтаксис остаётся тем же.​

TypeScript‑версия правила

Простейший вариант (один файл rules.ts в проекте wb-rules 2.0):

ts/// <reference path="/usr/share/wb-rules/typings/index.d.ts" />

defineRule("toggle-mdm3-by-button", {
whenChanged: "0x00158d000a84119d/action",
then: (newValue: string, devName: string, cellName: string):
void => {
log(`Button action: ${newValue}`);

if (newValue !== "single") {
return;
}

const key = "wb-mdm3_144/K1";
const current = dev[key] as boolean | 0 | 1 | undefined;
const next: boolean = !Boolean(current);

log(`Current K1: ${current}, next: ${next}`);
dev[key] = next;
}
});

  • whenChanged остаётся строковым путём "0x00158d000a84119d/action", как в рабочем JS‑варианте.​
  • dev["wb-mdm3_144/K1"] используется так же, но с приведением типа, чтобы TS не ругался.​
  • Сигнатура then соответствует описанию в примерах wb-rules 2.0: имя правила строкой + объект с when*/then.​

Если у тебя в шаблоне проекта другие пути к .d.ts или по‑другому объявлен dev, просто поправь /// <reference ...> и тип dev по своему boilerplate.