Правило диммирования WB-LED

В примере правил, Long Press увеличивает яркость, а Shortlong Press уменьшает яркость.
Подскажите, как можно адаптировать этот пример, чтобы Long Press сначала увеличивал яркость, а при повторном нажатии уменьшал, затем снова увеличивал. То есть по сути управление яркостью осуществлялось с одного и того же типа нажатия, но менялось направление регулировки.

/* --------------------------------------- */
/* 3. Long Press Counter: Increase brightness */
/* --------------------------------------- */

defineRule({
  whenChanged: "wb-mcm8_20/Input 1 Long Press Counter",
  then: function (newValue, devName, cellName) {
    // Start a timer that will increase the value of the control
    startTicker("input1_long_press", 75);
  }
});

// A rule that will increase the brightness on a timer
defineRule({
  when: function () { return timers["input1_long_press"].firing; },
  then: function () {
    var i = dev["wb-mdm3_58/Channel 1"];

    if (i < 100 && dev["wb-mcm8_20/Input 1"]) {
      i++
      dev["wb-mdm3_58/Channel 1"] = i
    } else {
      timers["input1_long_press"].stop();
    }
  }
});


/* -------------------------------------------- */
/* 4. Shortlong Press Counter: Decrease brightness */
/* -------------------------------------------- */

defineRule({
  whenChanged: "wb-mcm8_20/Input 1 Shortlong Press Counter",
  then: function (newValue, devName, cellName) {
    // Start a timer that will decrease the value of the control
    startTicker("input1_shortlong_press", 75);
  }
});

// A rule that will decrease the brightness on a timer
defineRule({
  when: function () { return timers["input1_shortlong_press"].firing; },
  then: function () {
    var i = dev["wb-mdm3_58/Channel 1"];

    if (i > 0 && dev["wb-mcm8_20/Input 1"]) {
      i--
      dev["wb-mdm3_58/Channel 1"] = i
    } else {
      timers["input1_shortlong_press"].stop();
    }
  }
});

Добрый день.
Подскажите, с каким сложностями столкнулись при адаптации кода под свою задачу?
Первая мысль добавить в ваш код переменную и инвертировать ее каждый раз при изменении счетчика длинных нажатий и по ее состоянию или увеличивать яркость или уменьшать.

Не понимаю как можно объединить 2 этих кода, чтобы они попеременно отрабатывали - сначала первый на увеличение яркости, затем второй на уменьшение

Первый код:

// A rule that will increase the brightness on a timer
defineRule({
  when: function () { return timers["input1_long_press"].firing; },
  then: function () {
    var i = dev["wb-led_123/Channel 2 Brightness"];

    if (i < 100 && dev["wb-mcm8_11/Input 1"]) {
      i++
      dev["wb-led_123/Channel 2 Brightness"] = i
    } else {
      timers["input1_long_press"].stop();
    }

Второй код:

// A rule that will decrease the brightness on a timer
defineRule({
  when: function () { return timers["input1_shortlong_press"].firing; },
  then: function () {
    var i = dev["wb-led_123/Channel 2 Brightness"];

    if (i > 0 && dev["wb-mcm8_11/Input 1"]) {
      i--
      dev["wb-led_123/Channel 2 Brightness"] = i
    } else {
      timers["input1_shortlong_press"].stop();
    }
  }

Про переменную не совсем понял как её сформировать и инвертировать

Например, вместо приведенного вами первого куска кода адаптировать следующим образом:

var direction = false;
defineRule({
  whenChanged: "wb-mcm8_20/Input 1 Long Press Counter",
  then: function (newValue, devName, cellName) {
    // Start a timer that will increase the value of the control
    startTicker("input1_long_press", 75);
  }
});

// A rule that will increase the brightness on a timer
defineRule({
  when: function () { return timers["input1_long_press"].firing; },
  then: function () {
    var i = dev["wb-mdm3_58/Channel 1"];

    if (dev["simple_test/enabled"]) {
      if ( i < 100 && direction) {
        i++
      }
      else if (i > 0 && !direction) {
        i--
      }
      dev["wb-mdm3_58/Channel 1"] = i
    } else {
      timers["input1_long_press"].stop();
      direction = !direction;
    }
  }
});

На регулировку не реагирует.

Попробовал вот в таком виде сделать

/* -------------------------------------------- */
/* 4. Shortlong Press Counter: Decrease brightness */
/* -------------------------------------------- */

defineRule({
  whenChanged: "wb-mcm8_11/Input 1 Shortlong Press Counter",
  then: function (newValue, devName, cellName) {
    // Start a timer that will decrease the value of the control
    startTicker("input1_shortlong_press", 75);
  }
});

// A rule that will decrease the brightness on a timer
defineRule({
  when: function () { return timers["input1_shortlong_press"].firing; },
  then: function () {
    var i = dev["wb-led_123/Channel 2 Brightness"];

    if (i > 0 && dev["wb-mcm8_11/Input 1"]) {
      i--
      dev["wb-led_123/Channel 2 Brightness"] = i
     } else if (i < 100 && dev["wb-mcm8_11/Input 1"]) {
      i++
      dev["wb-led_123/Channel 2 Brightness"] = i
    } else {
      timers["input1_shortlong_press"].stop();
    }
  }
});

Но тоже не получилось, этот код только уменьшает яркость, а когда доходит до 0, то начинает беспрерывно вкл/выкл канал, пока не отпустить кнопку

А… Там опечатка…
Вам надо так:

var direction = false;
defineRule({
  whenChanged: "wb-mcm8_11/Input 1 Long Press Counter",
  then: function (newValue, devName, cellName) {
    // Start a timer that will increase the value of the control
    startTicker("input1_long_press", 75);
  }
});

// A rule that will increase the brightness on a timer
defineRule({
  when: function () { return timers["input1_long_press"].firing; },
  then: function () {
    var i = dev["wb-led_123/Channel 2 Brightness"];

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

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

Вот, спасибо большое, именно то что нужно было. Пока ещё пытаюсь изучить значение всех параметров и одновременно с изучением javascript, поэтому сильно плаваю в подстановке нужных функций.

1 лайк

Размножил код диммирования на разные модули MCM8 и LED, но почему-то яркость стала уменьшаться только на 1 пункт при каждом длинном нажатии. Получается чтобы уменьшить яркость со 100 до 0, нужно 100 раз длительно нажать на кнопку. Причем работает только в сторону уменьшения яркости, на увеличение вообще не работает
В коде менял только скорость startTicker и номер входа input3_long_press, возможно нужна привязка к конкретному входу конкретного модуля MCM8?

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

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

    if (dev["wb-mcm8_11/Input 3"]) {
      if ( i < 100 && direction) {
        i++
      }
      else if (i > 0 && !direction) {
        i--
      }
      dev["wb-led_145/Channel 1 Brightness"] = i
    } else {
      timers["input3_long_press"].stop();
      direction = !direction;
    }
  }
});

Кажется понял в чем проблема - если дважды применить данный код для 2-х разных модулей с одним и тем же номером входа - input3_long_press, то даже несмотря на присутствие wb-mcm8_11/Input 3, который указывает привязку к конкретному модулю, регулировка ломается и перестает корректно отрабатывать.
Но если переназначить у одного из модулей номер входа на другой, например 2, изменив эти номера и в коде диммирования, то всё начинает корректно работать.
Теперь вопрос, как поправить так, чтобы даже с повторящимися номерами входов всё работало корректно?

Сам же и отвечу)
Просто добавил к параметру startTicker номер модуля, по сути просто обозвав его уникально, чтобы каждый подобный код обрабатывал уникальное имя.
Было так:

startTicker("input3_long_press", 20);

Стало так:

startTicker("wb-mcm8_11/input3_long_press", 40);

Также нужно поменять ещё тут:

timers["wb-mcm8_11/input3_long_press"].stop();

В результате имеем код вот такого вида

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

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

    if (dev["wb-mcm8_11/Input 3"]) {
      if ( i < 100 && direction) {
        i++
      }
      else if (i > 0 && !direction) {
        i--
      }
      dev["wb-led_145/Channel 1 Brightness"] = i
    } else {
      timers["wb-mcm8_11/input3_long_press"].stop();
      direction = !direction;
    }
  }
});