Mqtt-топики входов модулей WB-MR6C v.2, WB-LED, WB-MDM3

Добрый день, после покупки модуля 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. Как реализовать мультитапы в вашей системе

Обычно это делается так:

  1. Модуль (MR6C / MR3LV / др.) отдает изменение входа в MQTT.
  2. На контроллере Wiren Board:
    • через wb-rules или Node-RED
    • по таймерам и фронтам входа
    • распознаются:
      • одиночный клик
      • двойной клик
      • тройной клик
      • длинное удержание и т.д.
  3. Внутри правила уже:
    • включаются/выключаются реле (MR6C, MR3LV и т.п.)
    • меняется яркость WB-LED / WB-MDM3
    • вызываются другие сценарии.

Примерно в wb-rules логика выглядит как «собирать клики в окно, скажем, 300–500 мс» и по истечении таймера решать, был это одиночный или двойной клик.

Если нужно, могу в следующем ответе накидать готовый пример правила wb-rules для мультитапов по MQTT-входу (его можно будет использовать одинаково и с WB-MR3LV, и с WB-MR6C v2, и с другими модулями).


3. Что важно учесть при проектировании

  • Задержка: мультиклик всегда требует ожидания, пока закончится «окно» для второго/третьего нажатия. Если реакция должна быть мгновенной — стоит продумать, какие функции вешать на одиночный клик, а какие на мультиклик.
  • Надёжность: при использовании правил всё работает на контроллере, а не в самих модулях, поэтому:
    • при перезагрузке контроллера мультитапы временно не будут обрабатываться;
    • сами модули продолжат просто переключать вход/выход как обычно.

Если для вашей задачи критично, чтобы «мультиклики» были реализованы именно в железе модуля с готовыми MQTT-событиями — это важно явно уточнить у инженеров (они в рабочий день могут подтвердить актуальное состояние прошивок или планы по их обновлению).


Примечание: Я — искусственный интеллект, а не человек. В моих ответах могут быть неточности.


  1. Общие принципы работы модулей и их MQTT-интерфейс: MQTT в контроллерах Wiren Board — Wiren Board ↩︎ ↩︎

  2. Примеры работы с входами и правилами: Движок правил 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. Что вам нужно изменить под свой проект

  1. Топик входа:
var BUTTON_TOPIC = "wb-mr3lv_15/Input 1";

Точное имя смотрите в веб-интерфейсе контроллера (раздел Devices, ваш модуль, нужный вход — там будет виден MQTT-топик)[1: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-события и уже на них вешать другие сценарии.
  1. При необходимости подстройте:
var MULTICLICK_TIMEOUT = 400;
var LONG_PRESS_MS = 800;

чтобы «чувствительность» к двойным/длинным нажатиям была комфортной.


Если напишете, какие именно модули хотите связать (например, «одинарный клик — реле на MR6C, двойной — сцена на WB-LED, длинный — плавное выключение MDM3»), могу адаптировать этот пример под ваши конкретные устройства и каналы.

Примечание: Я — искусственный интеллект, а не человек. В моих ответах могут быть неточности.


  1. Общие принципы MQTT в Wiren Board: MQTT в контроллерах Wiren Board — Wiren Board ↩︎ ↩︎

  2. Работа с дискретными входами: https://wirenboard.com/wiki/Discrete_I/O ↩︎

  3. WB-MDM3: https://wirenboard.com/wiki/WB-MDM3 ↩︎

  4. WB-LED: Диммер светодиодных лент WB-LED — Wiren Board ↩︎

Добрый день.

Это ошибка.
Аппаратная обработка есть, описание например тут.
Достаточно сконфигурировать входы в режим работы по маппинг матрице и включить опрос соответствующих каналов.

Подскажите, удалось ли решить вопрос? Нужна ли помощь живого инженера техподдержки - человека?

Чуть позже ещё раз проверю и напишу.

1 Like