В примере правил, 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, поэтому сильно плаваю в подстановке нужных функций.
Размножил код диммирования на разные модули 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;
}
}
});