Здравствуйте! Уже не первый раз сталкиваюсь с такой неочевидностью, наконец дошли руки ее описать.
Версии: WirenBoard 8.4.4, wb-rules 2.36.0
Представим такую ситуацию: есть виртуальное устройство с одной ячейкой типа switch, есть 2 asSoonAs правила, которые отслеживают значение этой ячейки и выполняют функцию, если условие выстреливает.
Код для примера:
defineVirtualDevice("dev", {
title: "Test Device",
cells: {
foo: {
type: "switch",
value: false,
},
},
});
function handleFooUp() {
log.debug("Function: Foo is up");
}
function handleFooDown() {
log.debug("Function: Foo is down");
}
defineRule("fooUp", {
asSoonAs: function () {
return dev["dev/foo"];
},
then: function () {
log.debug("Rule: Foo is up");
handleFooUp();
},
});
defineRule("fooDown", {
asSoonAs: function () {
return !dev["dev/foo"];
},
then: function () {
log.debug("Rule: Foo is down");
handleFooDown();
},
});
Вопрос следующий: почему при сохранении правила, т.е при нажатии кнопки “Save” внутри редактора правил, у меня исполняется правило asSoonAs, хотя значение не менялось?
Объясняю вопрос,
Есть правило:
defineRule("fooDown", {
asSoonAs: function () {
return !dev["dev/foo"];
},
then: function () {
log.debug("Rule: Foo is down");
handleFooDown();
},
});
Топик dev/foo равен 0, я сохраняю правило и получаю в консоли вывод:
2025-12-15 14:01:22 defineRule: fooUp
2025-12-15 14:01:22 defineRule: fooDown
2025-12-15 14:01:22 Rule: Foo is down
2025-12-15 14:01:22 Function: Foo is down
То есть правило сработало (then сработало → функция выполнилась), хотя переменная dev/foo не пришла из 1 в 0, а сохраняла свое значение.
Хотелось бы понять несколько вещей в такой ситуации:
- Правильно ли я понимаю, что
asSoonAsтак работать не должно, а так работать должно только when? (Поэтому я и используюasSoonAs, т.к такого вообще не ожидаю) - Как можно обойти/поправить такие срабатывания? А то всю логику более сложных скриптов я строю на свойствах правил
asSoonAs, а по итогу выходят ложные срабатывания (т.е срабатывания, когда переменная, на самом деле, не менялась) - Может стоит обрабатывать смену значения у переменных по другому вообще, а не через 2
asSoonAs, как в моем приведенном примере кода?
Примечания:
- Если я сохраню правило еще раз, то все повторится
- Если я поменяю значение переменной на 1, то все так же повторится при нажатии на кнопку “Сохранить”
- Если я уберу
defineVirtualDeviceиз этого файла в другой, все так же повторится