Сценарная кнопка для плавного диммирования

Здравствуйте. Есть модуль WB-led в режиме W+W+W+W с каналами:
wb-led_154/Channel 1 Brightness
wb-led_154/Channel 2 Brightness
wb-led_154/Channel 3 Brightness
wb-led_154/Channel 4 Brightness

Есть кнопка - wb-gpio/W1_IN

Задача:
По одному короткому нажатию кнопки начинает плавно уменьшать яркость с максимальной до минимальной за 10 секунд, как бы имитируя обычное длинное нажатие клавиши. Пробовал написать сам, уперся в порог частоты обновления, он в любом случае уменьшал рывками, задача сделать такое же плавное как с клавиши. Будет применяться в концертном зале.

а просто поставить длительность отключения 10с нельзя?

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

тогда как вариант-сделать цикл от максимум до минимум, внутри которого вписать присвоить яркость (значение цикла), пауза (максимум-минимум)/время исполнения. конец цикла

так и было сделано, но проблема в том что, убавление происходит грубыми шагами. Сейчас экспереминтировал с параметром время уменьшения яркости, если выставить 10 секунд, то скрипт отрабатывает как надо. Кажется что этот параметр зашит в саму релюшку, жаль, что никуда не выкидывается. Жду ответа от поддержки, можно ли что сделать в данном случае, может скрипт по другой логике или что-то еще.

а если увеличить число шагов с соответствующим уменьшением времени? по 1%
проще и быстрее попробовать, чем ожидать☺️

любопытно даже, какой минимальный шаг доступен

В шаблоне устройства есть раздел Диагностика, в котором можно активировать Прямое управление ШИМ канала N и добиться более плавного изменения яркости.

Как будет работать диммер с физической кнопки после изменения этого топика через правило не могу сказать, т.к состояние Яркости в % при этом не синхронизируется.

На пробу могу предложить скрипт, который уменьшает яркость по-канально:

// Настройки: мин значение pwm, время на шаг и время работы в мс
var settings = {dimm: 1, tick: 25, time: 10 * 1000};

// Переменные для хранения шага по-канально
var step = [], channel, tick;

defineRule('dimmer fade out', {
	whenChanged: 'wb-gpio/W1_IN',
	then: function(click) {
		// Игнорируем отпускание кнопки (работа по положительному фронту)
		if (!click) return;

		// Сбрасываем таймер при повторном нажатии
		if (tick) clearInterval(tick);

		// Рассчет по-канального шага, но не менее чем 1 пункт
		for (i = 1; i <= 4; i++) {
			channel = 'wb-led_154/Channel {} Raw PWM'.format(i);
			step[i] = Math.max(dev[channel] / (settings.time / settings.tick), 1);
			defineAlias('led' + i, channel);
		}

		// Циклическая установка яркости пока все не дойдут до минимума
		tick = setInterval(function() {
			if (Math.max(led1, led2, led3, led4) !== settings.dimm) {
				led1 = Math.round(Math.max(led1 - step[1], settings.dimm));
				led2 = Math.round(Math.max(led2 - step[2], settings.dimm));
				led3 = Math.round(Math.max(led3 - step[3], settings.dimm));
				led4 = Math.round(Math.max(led4 - step[4], settings.dimm));
			}
			else clearInterval(tick);
		}, settings.tick);
	}
});
1 лайк

Добрый день,
Прошу уточнить — актуален ли ещё ваш вопрос?

Здравствуйте. Прошу прощения за задержку. По возможности проверю скрипт, отпишусь

Оттестил. Выставил минимальное значение dimm - 20, чтобы останавливалось на значении шим 20. Яркость убавляется хорошо, плавно, но происходит это не за 10 секунд, а больше 30, грубо говоря, он это делает вплоть до достижения минимального значения. Можно ли это как-то исправить? Топик времени уменьшения яркости не влияет.

Вот этот параметр попробуйте поднять. При чем кратно, там 50, 100, 250 и т.п… Может не успевает так часто выполняться.
Можете внутри таймера setInterval(function() лог вывести и посмотреть за какое время выполняется сам скрипт.

Пробовал менять tick, при его увеличении появляются скачки большие

Я бы всё равно использовал log и посмотрел откуда тормоза, это явно не спроста. Явных ошибок в скрипте на первый взгляд не вижу, скорее всего что-то не учитывается, и не факт, что время получится уменьшить, если без скачков хотите. Сам контроллер и правила не предназначены для столь частого вызова скрипта (1000/25 = 40). Не исключаю, что сам скрипт так тормозит, значения передаются реже, поэтому кажется, что плавнее.

В любом случае этот параметр бессмысленнен меньше 50, поскольку цикл обмена по интерфейсу в видео на Ютубе ребята говорили составляет 50 мс.

tick 300:


tick 250:

tick 200:

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

Я про это. Если этим параметром можно управлять из правил.

Вообще забавно, обычно под концертные залы специальное оборудование применяется, с подвязкой на пульты)

defineVirtualDevice("range_button_device", {
  title: "Range Button Device",
  cells: {
    button: {
      type: "pushbutton",
      value: false
    },
    range: {
      type: "range",
      value: 100,
      min: 0,
      max: 100
    }
  }
});

var isAnimating = false;
var directionDown = true;

defineRule("button_pressed_animation", {
  whenChanged: "range_button_device/button",
  then: function (newValue, devName, cellName) {
    if (newValue && !isAnimating) {
      isAnimating = true;

      var start = dev["range_button_device"]["range"];
      var end = (start === 100) ? 0 : 100;
      directionDown = start === 100;

      var duration = 10000; // 10 секунд
      var steps = 100;
      var interval = duration / steps;
      var currentStep = 0;

      var timerId = setInterval(function () {
        currentStep++;
        var progress = currentStep / steps;
        var value = Math.round(start + (end - start) * progress);
        dev["range_button_device"]["range"] = value;

        if (currentStep >= steps) {
          clearInterval(timerId);
          isAnimating = false;
        }
      }, interval);
    }
  }
});

Добрый день, рекомендую обратить внимание по ошибки повторяющиеся, в этот момент устройства не доступны.