Движок правил: примеры кода

Добрый день!

Использовал ваш кусок кода для обработки 1-, 2-, Долгого- нажатий, все работает, но есть одна проблема, после запуска контроллера, автоматически включаются все выходы, где был использован этот код. Получается после подачи питания на щиток и загрузки контроллера, включается свет на тех реле где используется этот кусок кода (Version: 0.3.1), модули WB-MRPS6/S и WB-MDM3.

В лог выводится сообщение: LOG::Define WB Rule: on_button_press_wb-gpio_EXT5_IN10

Если закомментировать этот кусок кода: singlePress: { func: Switcher, prop: [“rele3”, “K5”] }, то после запуска контроллера свет автоматически не включается.

Значение регистра 6: 0: не восстанавливать состояние реле.

Код функции Switcher:
function Switcher(pDevace, pChanel){
dev[pDevace][pChanel] = !dev[pDevace][pChanel];
}

В чем проблема? Правила, свойствах, версии, настройки модуля?

Тут, думаю, дело в том что при апуске первым в mqtt топик приходит “null”, вызывая срабатывание. Можно либо сделать костыль, принудительно выключая все каналы реле либо исключить в скрипте обработку “null”.

Здравствуйте! Набросал код управления рулонными шторами.

defineRule(“roller cabinet down”, {
when: function(newValue, devName, cellName) {
return dev[“wb-gpio”][“EXT5_IN4”] = true;
},
then: function (newValue, devName, cellName) {
dev[“wb-gpio”][“EXT3_ON2”] = true;
dev[“wb-gpio”][“EXT3_DIR2”] = false;
}
});

Необходимо снимать напряжение с привода через Nнное время, добавил таймаут, но не работает. Снимает напряжение сразу, то есть привод не опускается.

defineRule(“roller cabinet down”, {
when: function(newValue, devName, cellName) {
return dev[“wb-gpio”][“EXT5_IN4”] = true;
},
then: function (newValue, devName, cellName) {
dev[“wb-gpio”][“EXT3_ON2”] = true;
dev[“wb-gpio”][“EXT3_DIR2”] = false;
setTimeout(function () {}, 30000);
dev[“wb-gpio”][“EXT3_ON2”] = false;
}
});

Подскажете, в чем может быть проблема?

И еще хотелось бы сделать так, чтобы при одном нажатии на кнопку штора опускалась до конца, а при повторном она останавливалась.

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

Заранее спасибо за помощь!

Здравствуйте!

Для создания кнопок в веб-интерфейсе нужно создать виртуальное устройство с помощью правил:

defineVirtualDevice("drapery_control", {
    title: "Drapery Control",
    cells: {
        open: {
            type: "switch",
            value: false,
            order: 1,
        },
        close: {
            type: "switch",
            value: false,
            order: 2,
        },
    },
});

Результатом будет такое окно на странице Devices:
image

Сделал несколько исправлений, должно заработать:

defineRule("roller cabinet down", {
    whenChanged: ["drapery_control/close", "wb-gpio/EXT5_IN4"],  //правило срабатывает при активировании входа или включении кнопки в веб-интерфейсе
    then: function (newValue, devName, cellName) {
        if (newValue) {
            dev["wb-gpio"]["EXT3_ON2"] = true;
            dev["wb-gpio"]["EXT3_DIR2"] = false;

            setTimeout(function () {
                dev["wb-gpio"]["EXT3_ON2"] = false;   //прописываем действия по истечению времени
                dev["drapery_control"]["close"] = false;
            }, 3000);
        }
    },
});
2 лайка

Спасибо за ответ! Буду пробовать!

Подскажите, как еще сделать так, чтобы при повторном нажатии на кнопку (хотя бы реальную) штора останавливалась в текущем положении? То есть нужно переключить “wb-gpio”][“EXT3_ON2”] в false

Доработал правило отображения ресурсов контроллера: отображается загрузка процессора, сведения об оперативной памяти, сведения о разделе rootfs и сведения об /mnt/data. В правиле используются фрагменты кода из тем на портале техподдержки, которыми поделились пользователи. Возможно, кому-нибудь будет полезным.

image.

Правило во вложении.
controller_utilization.zip (1.0 KB)

Здравствуйте! Виртуальные кнопки создаются, но скрипт на них не реагирует…

defineVirtualDevice(“Roller blinds”, {
title: “Шторы”,
cells: {
Спальня_О: {
type: “switch”,
value: false,
order: 1,
},
Спальня_З: {
type: “switch”,
value: false,
order: 2,
},
},
})
;

defineRule(“roller sleeping room down”, {
whenChanged: [“Шторы/Спальня_З”, “wb-gpio/EXT5_IN8”],
then: function (newValue, devName, cellName) {
if (newValue) {
dev[“wb-gpio”][“EXT4_ON3”] = true;
dev[“wb-gpio”][“EXT4_DIR3”] = false;

        setTimeout(function () {
            dev["wb-gpio"]["EXT4_ON3"] = false;  
            dev["Шторы"]["Спальня_З"] = false;
        }, 30000);
    }
},

});

defineRule(“roller sleeping room up”, {
whenChanged: [“Шторы/Спальня_О”, “wb-gpio/EXT5_IN9”],
then: function (newValue, devName, cellName) {
if (newValue) {
dev[“wb-gpio”][“EXT4_ON3”] = true;
dev[“wb-gpio”][“EXT4_DIR3”] = true;

        setTimeout(function () {
            dev["wb-gpio"]["EXT4_ON3"] = false;  
            dev["Шторы"]["Спальня_О"] = false;
        }, 30000);
    }
},

});

Кнопки сейчас в отдельном правиле, помещал и в одно со скриптами - все равно ничего. Пробовал писать отдельное правило на виртуальные кнопки, тоже нет изменений

В условии нужно использовать имя виртуального устройcтва, а не его заголовок окна. Попробуйте так:

whenChanged: ["Roller blinds/Спальня_З", "wb-gpio/EXT5_IN8"],
1 лайк

Скрипт у меня такой:

defineRule(“roller sleeping room down”, {
whenChanged: [“Roller blinds/Спальня_З”, “wb-gpio/EXT5_IN8”],
then: function (newValue, devName, cellName) {
if (newValue) {
dev[“wb-gpio”][“EXT4_ON3”] = true;
dev[“wb-gpio”][“EXT4_DIR3”] = false;

setTimeout(function () {
dev[“wb-gpio”][“EXT4_ON3”] = false;
dev[“Roller blinds”][“Спальня_З”] = false;
}, 30000);
}
},
});

Получается нужно сделать так?

defineRule(“roller sleeping room down”, {
whenChanged: [“Roller blinds/Спальня_З”, “wb-gpio/EXT5_IN8”],
then: function (newValue, devName, cellName) {
if (newValue) {
dev[“wb-gpio”][“EXT4_ON3”] = false;
dev[“wb-gpio”][“EXT4_DIR3”] = false;
dev[“wb-gpio”][“EXT4_ON3”] = true;

setTimeout(function () {
dev[“wb-gpio”][“EXT4_ON3”] = false;
dev[“Roller blinds”][“Спальня_З”] = false;
}, 30000);
}
},
});

пт, 14 янв. 2022 г. в 08:40, Explorerol через Wiren Board Support <info@wirenboard.ru>:

Не совсем так. Если вы отключаете реле и сразу его снова включаете, то контакты реле ON3 не успеют до конца разомкнуться, как придет команда снова на включение. Для отключения реле обычно 10-50 миллисекунд. Поэтому лучше отключить реле ON3, затем сделать паузу для ожидания отключения реле, например 100 мс, затем уже переключить реле DIR3, опять сделать паузу, а затем снова включить ON3.
То есть было так:

dev[“wb-gpio”][“EXT4_ON3”] = false;
dev[“wb-gpio”][“EXT4_DIR3”] = false;
dev[“wb-gpio”][“EXT4_ON3”] = true;

А станет, например, так:

var delay_ms = 100        

dev["wb-gpio"]["EXT4_ON3"] = false;

setTimeout(function () {
dev["wb-gpio"]["EXT4_DIR3"] = false;	
}, delay_ms);

setTimeout(function () {
dev["wb-gpio"]["EXT4_ON3"] = true;	
}, delay_ms * 2);

1 лайк

Подскажите еще: хочу сделать, чтобы при нажатии на кнопку один раз, штора доезжала до конца, при нажатии, второй раз - останавливалась. Идея такая: ввести переменную n, которая будет считать количество нажатий, то есть нажал один раз n=1, нажал второй раз n=2 и обнулилась после этого. При n=1 будет одна функция, при n=2 будет другая. Но как задать n? Если я задаю n после define rule, то выдает ошибку, если после whenchanged - тоже, если после then function, то норм, но тогда n всегда будет обнуляться при наступлении события нажатия на кнопку. У меня сейчас вот такой код:

defineRule(“roller cabinet room down”, {
whenChanged: [“Roller blinds/Кабинет_З”, “wb-gpio/EXT5_IN4”],
then: function (newValue, devName, cellName) {
if (newValue) {
dev[“Roller blinds”][“Кабинет_О”] = false;
dev[“wb-gpio”][“EXT3_ON2”] = false;
setTimeout(function () {
dev[“wb-gpio”][“EXT3_DIR2”] = false;
}, 100);
setTimeout(function () {
dev[“wb-gpio”][“EXT3_ON2”] = true;
}, 100);
setTimeout(function () {
if (“wb-gpio/EXT3_DIR2”==true) {
dev[“wb-gpio”][“EXT3_ON2”] = false;
dev[“Roller blinds”][“Кабинет_З”] = false; }
}, 30000);
}
},
});

пт, 14 янв. 2022 г. в 15:56, Explorerol через Wiren Board Support <info@wirenboard.ru>:

И еще понял, что не работает последний if. В коде не правильно написал, нужно написать if (“wb-gpio/EXT3_DIR2”==false). Это для того, чтобы, если я когда штора едет вниз, нажав на кнопку вверх, она бы не отключались по таймеру в 30 секунд с правила движения вниз. Как это правильнее реализовать?

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

вс, 16 янв. 2022 г. в 22:10, Андрей К <andrey.kopylov.mail@gmail.com>:

Конструкция

if (dev[“wb-gpio/EXT3_DIR2]”==true)

записывается как

if (dev[“wb-gpio/EXT3_DIR2”])

А такая:

if (dev[“wb-gpio/EXT3_DIR2”]==false)

как

if (!dev[“wb-gpio/EXT3_DIR2”])

Примененная запись вида if (“wb-gpio/EXT3_DIR2”==false) не выполнится корректно, потому что “wb-gpio/EXT3_DIR2” - это не значение топика а просто контатнта строковая. Верно: dev[“wb-gpio/EXT3_DIR2”]

И, кстати, для вставки кода советую пользоваться ``` (три символа на русской букве Ё)

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

пн, 17 янв. 2022 г. в 10:07, Андрей Радионов через Wiren Board Support <info@wirenboard.ru>:

Да, исправил.
“!” - отрицание.
Подробнее - тут:
https://wirenboard.com/wiki/Wb-jscript#Условия

Здесь будет лежать последняя версия модуля для программной обработки разных нажатий (короткое, двойное, тройное, долгое нажатие, удержание):
/wb-rules-modules/module_ActionButtons.js

А здесь пример использования вместе со вспомогательными функциями:
/wb-rules/rules_Buttons.js

Предполагается, что вы обновили движок правил до версии 2.0

4 лайка

Добрый день
Необходимо по изменению СО2 датчика выдавать записанную команду ИК от WB-MIR v2
Не могу нигде найти информацию, каким образом выдавать данную команду из ячейки WB-MIR v2 и чтобы она длилась необходимое время.

defineRule(“msw3_co2”, {
whenChanged: “wb-msw-v3_62/CO2”,
then: function(newValue, devName, cellName) {
var co2_good = newValue < 600;
var co2_bad = newValue > 601;

    if (co2_good) {
        dev["wb-mir_v2_244"]["Play from ROM1"] = true;
    }
    if (co2_bad) {
       dev["wb-mir_v2_244"]["Play from ROM2"] = true;
    }
}

});

Про время - это как?

Я искренне не знаю при команде dev[“wb-mir_v2_244”][“Play from ROM1”] = true;
будет воспроизведен записанный код один раз или будет выдаваться с цикличностью, пока не будет вызвана команда отмены, например как dev[“wb-mir_v2_244”][“Play from ROM1”] = false;
поэтому и предположил, что нужно ограничивать команду по времени.

пн, 11 апр. 2022 г. в 12:26, Андрей Радионов через Wiren Board Support <info@wirenboard.ru>:

Сейчас при описанном правиле выше в истории происходит вот такая картина, при условии, что СО не меняется

пн, 11 апр. 2022 г. в 12:26, Андрей Радионов через Wiren Board Support <info@wirenboard.ru>: