Синхронное управление каналами 1,2 и 4 с двух кнопок 1 и 4 на шаблоне WB-LED

Здравствуйте, у меня есть диммер WB-LED (прошивка 3.9.0) в режиме 2*W+W+W. К нему подключены 3 ленты:

  • каналы 1 и 2 объединены из-за большой мощности одноцветной ленты
  • канал 3 для второго контура ленты
  • канал 4 для третьего контура ленты

Также, к этому диммеру подключены 3 кнопки:

  • вход 1 - должен управлять каналами 1,2 и 4 одновременно вкл/выкл (короткое нажатие) и диммирование (длинное нажатие)
  • вход 3 - управляет только лентой на канале 3
  • вход 4 - должен дублировать функции кнопки на входе 1, то есть также управлять каналами 1,2 и 4 в том же режиме.

Стандартных настроек, чтобы один вход мог управлять сразу тремя каналами я не нашел, поэтому вопрос - как корректно сделать правило, которое будет выполнять такую функцию?

Вот какие каналы MQTT у меня есть:

  • Вход 1 (короткое нажатие для вкл/выкл каналов 1,2 и 4) - wb-led_101/Input 1 Single Press Counter
  • Вход 4 (короткое нажатие для вкл/выкл каналов 1,2 и 4) - wb-led_101/Input 4 Single Press Counter
  • Вход 1 (длинное нажатие для регулировки яркости каналов 1,2 и 4) - wb-led_101/Input 1 Long Press Counter
  • Вход 4 (длинное нажатие для регулировки яркости каналов 1,2 и 4) - wb-led_101/Input 4 Long Press Counter
  • Каналы 1 и 2 (вкл/выкл) - wb-led_101/Channels 1_2
  • Канал 4 (вкл/выкл) - wb-led_101/Channel 4
  • Каналы 1 и 2 (диммирование) - wb-led_101/Channels 1_2 Brightness
  • Канал 4 (диммирование) - wb-led_101/Channel 4 Brightness

С одновременным включением и выключением вроде разобрался с помощью правила:

defineRule({
whenChanged:[
“wb-led_101/Input 4 Single Press Counter”,
“wb-led_101/Input 1 Single Press Counter”,
],
then: function (newValue, devName, cellName) {
dev[“wb-led_101/Channels 1_2”] = !dev[“wb-led_101/Channels 1_2”];
dev[“wb-led_101/Channel 4”] = !dev[“wb-led_101/Channel 4”];
}
});

А вот с диммированием пока проблема. Возможно получится доработать такое правило, добавив в него вторую кнопку на входе 4 и второй контур на канале 4?

var direction = false;
defineRule({
whenChanged: "wb-led_101/Input 1 Long Press Counter",
then: function (newValue, devName, cellName) {
// Запуск таймера для изменения значения уровня яркости
startTicker("wb-led_101/Input 1 Long Press Counter", 40);
}
});

// Правило для регулировки яркости по таймеру удерживания кнопки
defineRule({
when: function () { return timers["wb-led_101/input1_long_press"].firing; },
then: function () {
var i = dev["wb-led_101/Channels 1_2 Brightness"];

if (dev["wb-led_101/Input 1"]) {
  if ( i < 100 && direction) {
    i++
  }
  else if (i > 0 && !direction) {
    i--
  }
  dev["wb-led_101/Channels 1_2 Brightness"] = i
} else {
  timers["wb-led_101/input1_long_press"].stop();
  direction = !direction;
}

}
});

P.S. пробовал базовыми настройками LED модуля привязать короткое и длинное нажатие входа 1 к каналам 1 и 2, а сценарием привязать эту же кнопку к каналу 4. Но была проблема в том, что каналы 1 и 2 могли уменьшать яркость, а канал 4 в это же время увеличивать яркость. Синхронной работы этих каналом добиться не получилось

Добрый день.

Вы правы, штатной настройки, которая привязала бы один вход сразу к каналам 1, 2 и 4, нет: объединять можно только соседние каналы (режимы 2*W, 2*W+2*W, 4*W), поэтому в вашем режиме 2*W+W+W без правила не обойтись.

Но диммировать из правила пошагово по таймеру не нужно. Начиная с прошивки 3.8.0 в WB-LED есть Авто-изменение (Auto-Change): контроллер один раз записывает «начни плавно увеличивать/уменьшать», и дальше диммер меняет яркость сам, с заданным периодом. На нажатие приходится два коротких запроса вместо потока записей по Modbus, и каналы гарантированно идут в одну сторону. Описание – в разделе Удалённое плавное изменение параметров света.

Благодарю за ответ. Если я правильно понял это оптимизирует само правило, убираю всё лишнее. Но я пока не совсем понимаю как скорректировать правило таким образом, чтобы диммирование было только тогда, когда мы держим кнопку, а при отпускании фиксировалась текущая яркость.
В Авто-изменении регулировка происходит с 1 до 100 и наоборот. Единственное, что приходит в голову, это слежение за контролом wb-led_101/Input 1 и пока его статус true, то регистр авто-изменения должен равнятся 3, а когда контрол меняет статус на false то регистр авто-изменения также меняется на 0.
Если так, то возникает другой вопрос - при одиночном нажатии, для включения или выключения освещения, контрол wb-led_101/Input 1 будет изменен на true, то не повлечет ли это начало диммирования согласно правила?

Да, все верно.

Но одно уточнение: Авто-изменение — это не переход от 1 до 100, а «удалённое удержание кнопки». Диммер меняет яркость шаг за шагом с периодом, заданным в «Период авто-изменения…» (мс/ед), и останавливается ровно в тот момент, когда в регистр записали 0. До 100 % (или до 1 %) он дойдёт только если держать кнопку достаточно долго — тогда сработает второй механизм: на границе диапазона изменение останавливается само, а регистр действия обнуляется.

Нет, не повлечёт. Диммирование стартует не по состоянию входа, а по каналу Input 1 Long Press Counter.

Диммер сам определяет тип нажатия по длительности: если кнопку отпустили раньше, чем истекло «Время длинного нажатия», увеличивается только счётчик короткого нажатия, а счётчик долгого остаётся прежним. Правило старта просто не срабатывает.

Правило остановки при коротком нажатии отработает, но с флагом dimming оно сразу выйдет по return, ничего не записав.

Так что короткое нажатие попадёт только в правило включения/выключения, длинное — только в диммирование.

Благодарю за подсказку, попробовал с помощью ИИ создать и доработать правило и теперь получилось так, как мне нужно было

// Конфигурация оборудования
var LED_DIMMER = "wb-led_125";

// --- Названия каналов согласно вашей проверке ---
var GROUP_CHANNELS_STATE = "Channels 1_2";                 // Вкл/Выкл
var CHANNEL_4_STATE = "Channel 4";                         // Вкл/Выкл

var GROUP_CHANNELS_AC = "Channels 1, 2 Auto-Change";       // Регулировка 1+2
var CHANNEL_4_AC = "Channel 4 Auto-Change";                // Регулировка 4

// Флаг общего направления для синхронной работы группы {1,2} + 4
var groupDirectionUp = undefined;

// --- Короткое нажатие: Включение / Выключение ---
defineRule("toggle_group_12_4", {
whenChanged: LED_DIMMER + "/Input 1 Single Press Counter",
then: function(newValue) {
if (newValue > 0) {
var gOn = dev[LED_DIMMER][GROUP_CHANNELS_STATE] === true;
var ch4On = dev[LED_DIMMER][CHANNEL_4_STATE] === true;

        // Если выключаем свет — принудительно стопаем диммирование
        if (!gOn || !ch4On) {
            dev[LED_DIMMER][GROUP_CHANNELS_AC] = 0;
            dev[LED_DIMMER][CHANNEL_4_AC] = 0;
        }

        dev[LED_DIMMER][GROUP_CHANNELS_STATE] = !gOn;
        dev[LED_DIMMER][CHANNEL_4_STATE] = !ch4On;
    }
}

});

// Дублируем правило включения для Input 4
defineRule("toggle_group_12_4_input4", {
whenChanged: LED_DIMMER + "/Input 4 Single Press Counter",
then: function(newValue) {
if (newValue > 0) {
var gOn = dev[LED_DIMMER][GROUP_CHANNELS_STATE] === true;
var ch4On = dev[LED_DIMMER][CHANNEL_4_STATE] === true;

        if (!gOn || !ch4On) {
            dev[LED_DIMMER][GROUP_CHANNELS_AC] = 0;
            dev[LED_DIMMER][CHANNEL_4_AC] = 0;
        }

        dev[LED_DIMMER][GROUP_CHANNELS_STATE] = !gOn;
        dev[LED_DIMMER][CHANNEL_4_STATE] = !ch4On;
    }
}

});

// --- Длительное нажатие: Диммирование ---

// Начало удержания кнопки (вход 1)
defineRule("ac_hold_start_input1", {
whenChanged: LED_DIMMER + "/Input 1",
then: function(newValue, oldValue) {
if (newValue !== oldValue && newValue === true) {
// Инвертируем направление для всей группы сразу
groupDirectionUp = !(groupDirectionUp === true);
var dirVal = groupDirectionUp ? 1 : 2;

        // Отправляем одинаковое значение в оба канала
        dev[LED_DIMMER][GROUP_CHANNELS_AC] = dirVal;
        dev[LED_DIMMER][CHANNEL_4_AC] = dirVal;
    }
}

});

// Начало удержания кнопки (вход 4 - дубль)
defineRule("ac_hold_start_input4", {
whenChanged: LED_DIMMER + "/Input 4",
then: function(newValue, oldValue) {
if (newValue !== oldValue && newValue === true) {
groupDirectionUp = !(groupDirectionUp === true);
var dirVal = groupDirectionUp ? 1 : 2;

        dev[LED_DIMMER][GROUP_CHANNELS_AC] = dirVal;
        dev[LED_DIMMER][CHANNEL_4_AC] = dirVal;
    }
}

});

// Окончание удержания (любая из кнопок отпущена)
defineRule("ac_hold_stop_inputs", {
whenChanged: LED_DIMMER + "/Input 1",
then: function(newValue, oldValue) {
if (newValue !== oldValue && newValue === false) {
dev[LED_DIMMER][GROUP_CHANNELS_AC] = 0;
dev[LED_DIMMER][CHANNEL_4_AC] = 0;
}
}
});

defineRule("ac_hold_stop_input4", {
whenChanged: LED_DIMMER + "/Input 4",
then: function(newValue, oldValue) {
if (newValue !== oldValue && newValue === false) {
dev[LED_DIMMER][GROUP_CHANNELS_AC] = 0;
dev[LED_DIMMER][CHANNEL_4_AC] = 0;
}
}
});