Добрый день, после покупки модуля WB-MR3LV оказалось, что у него нет топиков mqtt на разные типы нажатий, при этом в документации нет информации об этом. Подскажите, модули WB-MR6C v.2, WB-LED, WB-MDM3 имеют mqtt-топики на разные нажатия? Планирую мульти-клики использовать для управления разными модулями, данная функция имеет критичное значение для планируемой системы.
Здравствуйте! Сегодня выходной день, поэтому сотрудники техподдержки ответят вам в рабочий день.
Пока что я, автоматический помощник, проанализировал ваш вопрос и постарался найти решение:
Вы рассматриваете модули:
- WB-MR3LV (уже куплен, входы не выдают разные типы нажатий в MQTT)
- WB-MR6C v2
- WB-LED
- WB-MDM3
И хотите использовать разные типы нажатий (клики, удержание, мультиклики) по MQTT для сценариев.
1. Как обстоит дело с MQTT-топиками «типов нажатий»
У перечисленных модулей (WB-MR6C v2, WB-LED, WB-MDM3) обычно есть дискретные входы / каналы управления, но они, как правило, отдают в MQTT:
- состояние входа (0/1)
- либо просто состояние канала (ON/OFF, уровень диммера и т.п.)
А логика распознавания «одинарный/двойной/длинный клик» в самих модулях не реализована — это типичная архитектура Wiren Board: модуль отдает «сырое» событие (изменение входа), а мультиклики собираются уже на контроллере (WB6/7/8) с помощью правил, Node-RED и т.п.[1][2]
Поэтому MQTT-топиков вида /click_type, /event = single/double/long у этих модулей нет.
Они публикуют /subscribe-ят такие топики, как (примерно, для входов):
/<device_id>/<input_x>—0/1
и для каналов реле/диммера/LED уже свои топики управления/состояния.
Точные списки топиков можно посмотреть в документации и веб-интерфейсе контроллера (Devices → соответствующий модуль).[1:1]
2. Как реализовать мультитапы в вашей системе
Обычно это делается так:
- Модуль (MR6C / MR3LV / др.) отдает изменение входа в MQTT.
- На контроллере Wiren Board:
- через
wb-rulesили Node-RED - по таймерам и фронтам входа
- распознаются:
- одиночный клик
- двойной клик
- тройной клик
- длинное удержание и т.д.
- через
- Внутри правила уже:
- включаются/выключаются реле (MR6C, MR3LV и т.п.)
- меняется яркость WB-LED / WB-MDM3
- вызываются другие сценарии.
Примерно в wb-rules логика выглядит как «собирать клики в окно, скажем, 300–500 мс» и по истечении таймера решать, был это одиночный или двойной клик.
Если нужно, могу в следующем ответе накидать готовый пример правила wb-rules для мультитапов по MQTT-входу (его можно будет использовать одинаково и с WB-MR3LV, и с WB-MR6C v2, и с другими модулями).
3. Что важно учесть при проектировании
- Задержка: мультиклик всегда требует ожидания, пока закончится «окно» для второго/третьего нажатия. Если реакция должна быть мгновенной — стоит продумать, какие функции вешать на одиночный клик, а какие на мультиклик.
- Надёжность: при использовании правил всё работает на контроллере, а не в самих модулях, поэтому:
- при перезагрузке контроллера мультитапы временно не будут обрабатываться;
- сами модули продолжат просто переключать вход/выход как обычно.
Если для вашей задачи критично, чтобы «мультиклики» были реализованы именно в железе модуля с готовыми MQTT-событиями — это важно явно уточнить у инженеров (они в рабочий день могут подтвердить актуальное состояние прошивок или планы по их обновлению).
Примечание: Я — искусственный интеллект, а не человек. В моих ответах могут быть неточности.
Общие принципы работы модулей и их MQTT-интерфейс: MQTT в контроллерах Wiren Board — Wiren Board ↩︎ ↩︎
Примеры работы с входами и правилами: Движок правил wb-rules — Wiren Board ↩︎
Прошу направить пример правила
Здравствуйте! Сегодня выходной день, поэтому сотрудники техподдержки ответят вам в рабочий день.
Пока что я, автоматический помощник, проанализировал ваш вопрос и постарался найти решение:
Ниже пример универсального правила wb-rules для распознавания одинарного / двойного клика и длинного нажатия по одному входу. Его можно адаптировать к любому входу модулей (WB-MR3LV, WB-MR6C v2 и т.д.), так как все они в MQTT дают просто 0/1 по изменению входа[1][2].
1. Идея
- Отслеживаем фронт нажатия (переход 0→1).
- Ведём счётчик кликов в «окне» времени (
MULTICLICK_TIMEOUT), например 400 мс. - Если в это время пришёл ещё один клик — считаем двойным, три — тройным.
- Если кнопка держится дольше
LONG_PRESS_MS(например, 800 мс) — считаем длинным нажатием.
Вы вместо log() можете повесить любые действия: управление WB-MR6C, WB-LED, WB-MDM3 и т.п.
2. Пример правила
Создайте файл, например:
/etc/wb-rules/multiclick.js
// ===== НАСТРОЙКИ =====
var BUTTON_TOPIC = "wb-mr3lv_15/Input 1"; // ИЗМЕНИТЕ на свой топик входа!
var MULTICLICK_TIMEOUT = 400; // окно для двойного/тройного клика, мс
var LONG_PRESS_MS = 800; // порог длинного нажатия, мс
// ===== ВНУТРЕННИЕ ПЕРЕМЕННЫЕ =====
var clickCount = 0;
var clickTimer = null;
var pressStartTime = 0;
var longPressFired = false;
var longPressTimer = null;
// обработчик по изменению входа
defineRule("button_multiclick_" + BUTTON_TOPIC.replace(/[^a-zA-Z0-9_]/g, "_"), {
whenChanged: BUTTON_TOPIC,
then: function (newValue, devName, cellName) {
var now = Date.now();
if (newValue) {
// Кнопка нажата (фронт 0 -> 1)
pressStartTime = now;
longPressFired = false;
// Запускаем таймер длинного нажатия
if (longPressTimer) {
timers.clearTimer(longPressTimer);
}
longPressTimer = timers.setTimeout(function () {
// Кнопка все еще зажата?
if (dev[devName][cellName]) {
longPressFired = true;
log("LONG PRESS on " + BUTTON_TOPIC);
// ---- ВАША ЛОГИКА ДЛИННОГО НАЖАТИЯ ----
// например: включить свет на максимум
// dev["wb-mdm3_12"]["Channel 1"] = 100;
}
}, LONG_PRESS_MS);
} else {
// Кнопка отпущена (спад 1 -> 0)
var pressDuration = now - pressStartTime;
// Если уже сработало длинное нажатие - не считаем как клик
if (longPressFired) {
return;
}
// Короткое нажатие: учитываем в счётчик кликов
clickCount += 1;
// Сбрасываем таймер длинного нажатия
if (longPressTimer) {
timers.clearTimer(longPressTimer);
longPressTimer = null;
}
// Перезапускаем "окно" для мультикликов
if (clickTimer) {
timers.clearTimer(clickTimer);
}
clickTimer = timers.setTimeout(function () {
// По истечении окна решаем, сколько было кликов
if (clickCount === 1) {
log("SINGLE CLICK on " + BUTTON_TOPIC);
// ---- ЛОГИКА ОДИНОЧНОГО КЛИКА ----
// dev["wb-mr6c_10"]["K1"] = !dev["wb-mr6c_10"]["K1"];
} else if (clickCount === 2) {
log("DOUBLE CLICK on " + BUTTON_TOPIC);
// ---- ЛОГИКА ДВОЙНОГО КЛИКА ----
// например: переключить сцену освещения
} else if (clickCount === 3) {
log("TRIPLE CLICK on " + BUTTON_TOPIC);
// ---- ЛОГИКА ТРОЙНОГО КЛИКА ----
// например: выключить все реле в группе
} else {
log("MULTI (" + clickCount + " clicks) on " + BUTTON_TOPIC);
// при желании можно обрабатывать и 4+ кликов
}
clickCount = 0;
clickTimer = null;
}, MULTICLICK_TIMEOUT);
}
}
});
3. Что вам нужно изменить под свой проект
- Топик входа:
var BUTTON_TOPIC = "wb-mr3lv_15/Input 1";
Точное имя смотрите в веб-интерфейсе контроллера (раздел Devices, ваш модуль, нужный вход — там будет виден MQTT-топик)[1:1].
- Действия вместо
log():
в местах, помеченных комментариями// ---- ЛОГИКА ... ----, можно:
- управлять каналами реле:
dev["wb-mr6c_10"]["K1"] = !dev["wb-mr6c_10"]["K1"]; - диммировать WB-MDM3 или WB-LED:
dev["wb-mdm3_12"]["Channel 1"] = 50;(проценты яркости)[3][4] - публиковать свои MQTT-события и уже на них вешать другие сценарии.
- При необходимости подстройте:
var MULTICLICK_TIMEOUT = 400;
var LONG_PRESS_MS = 800;
чтобы «чувствительность» к двойным/длинным нажатиям была комфортной.
Если напишете, какие именно модули хотите связать (например, «одинарный клик — реле на MR6C, двойной — сцена на WB-LED, длинный — плавное выключение MDM3»), могу адаптировать этот пример под ваши конкретные устройства и каналы.
Примечание: Я — искусственный интеллект, а не человек. В моих ответах могут быть неточности.
Общие принципы MQTT в Wiren Board: MQTT в контроллерах Wiren Board — Wiren Board ↩︎ ↩︎
Работа с дискретными входами: https://wirenboard.com/wiki/Discrete_I/O ↩︎
WB-MDM3: https://wirenboard.com/wiki/WB-MDM3 ↩︎
Добрый день.
Это ошибка.
Аппаратная обработка есть, описание например тут.
Достаточно сконфигурировать входы в режим работы по маппинг матрице и включить опрос соответствующих каналов.
Подскажите, удалось ли решить вопрос? Нужна ли помощь живого инженера техподдержки - человека?
Чуть позже ещё раз проверю и напишу.