Здравствуйте. Есть модуль 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 секунд, то скрипт отрабатывает как надо. Кажется что этот параметр зашит в саму релюшку, жаль, что никуда не выкидывается. Жду ответа от поддержки, можно ли что сделать в данном случае, может скрипт по другой логике или что-то еще.
В шаблоне устройства есть раздел Диагностика, в котором можно активировать Прямое управление ШИМ канала 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);
}
});
Оттестил. Выставил минимальное значение dimm - 20, чтобы останавливалось на значении шим 20. Яркость убавляется хорошо, плавно, но происходит это не за 10 секунд, а больше 30, грубо говоря, он это делает вплоть до достижения минимального значения. Можно ли это как-то исправить? Топик времени уменьшения яркости не влияет.
Вот этот параметр попробуйте поднять. При чем кратно, там 50, 100, 250 и т.п… Может не успевает так часто выполняться.
Можете внутри таймера setInterval(function() лог вывести и посмотреть за какое время выполняется сам скрипт.
Я бы всё равно использовал log и посмотрел откуда тормоза, это явно не спроста. Явных ошибок в скрипте на первый взгляд не вижу, скорее всего что-то не учитывается, и не факт, что время получится уменьшить, если без скачков хотите. Сам контроллер и правила не предназначены для столь частого вызова скрипта (1000/25 = 40). Не исключаю, что сам скрипт так тормозит, значения передаются реже, поэтому кажется, что плавнее.
В любом случае этот параметр бессмысленнен меньше 50, поскольку цикл обмена по интерфейсу в видео на Ютубе ребята говорили составляет 50 мс.
Если я правильно понимаю, то у них вызовы накладываются друг на друга там, где вызовы частые. С большим интервалом вроде нет такого, но всё равно по грани.
Тогда получается, что если это критично, то управлять именно параметром изменения яркости в самом модуле. По сценарию его задавать одним значением, и по окончании процесса - приводить в исходное.
Я про это. Если этим параметром можно управлять из правил.
Вообще забавно, обычно под концертные залы специальное оборудование применяется, с подвязкой на пульты)