Не срабатывает whenChanged: [func, value]

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

Может кто-нибудь знает, как заставить работать whenChanged: [функция, параметр]?

В документации wb-rules:

wb-rules/README.md at master · wirenboard/wb-rules · GitHub
whenChanged. При задании whenChanged правило срабатывает при любых изменениях значений параметров, указанных в массиве.

Также в документации приведён пример с использованием функции в качестве одного из элементов этого массива:

defineRule("funcValueChange2", {
 whenChanged: [
   ...
   "somedev/cellforfunc1",
   function () {
     return dev["somedev/cellforfunc2"] > 3;
   }
 ],
 then: function (newValue, devName, cellName) {
	...

Но на тестовом стенде никак не получается реализовать такое срабатывание правила whenChanged ;(

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

/* 
 * Bugreport script for whenChanged: [FUNC, "DEV/CHANNEL"]
 *
 */

defineVirtualDevice(
  "virt-dev_248", {
    title: "Test Second input for whenChanged",
    cells: {

      sw: {

        readonly: false,
        type: "switch",
        value: false

      }

    }

  })


/*
 * Проверка передачи двойных встроенных функций
 *
 */

function time () {
  var actualDate = new Date()
  if (actualDate.getSeconds() % 3 == 0) {

    return actualDate.getSeconds();

  }
}

log.info(time());

log.info("=== Activate a Rule for 15 seconds");

// Test different options in whenChanged
var testRule = defineRule("test func and parameter", {
  // OK: switch toggle triggers whenChanged
  // whenChanged: ["virt-dev_248/sw"],

  // OK: time() triggers whenChanged)
  // whenChanged: function () { return time(); },

  // FAILED: time() doesn't trigger whenChanged
  // whenChanged: ["virt-dev_248/sw", function () { return time(); }],
  whenChanged: [function () { return time(); }, "virt-dev_248/sw"],
  then: function (newValue, devName, cellName) {

    log.info("Rule execution...");
    log.info(time());

  }
});

setTimeout(function () {

  log.info("=== Disable the Rule");
  disableRule(testRule);

}, 15 * 1000);

test-functions-bugreport.js.txt (1.2 KB)

Wiren Board 6.7.2
wb-rules:2.11.4

Совершенно неправильно. Значение функции может использоваться только для типа asSoonAs

1 лайк

А тогда вот такой код же работает:

...
whenChanged: function () {

  return time()

},
then:
...

Или это недокументированная возможность и отсутствует гарантия работы в будущих версиях?

+ не только asSoonAs:, но ещё и when:. Опять же, судя по документации.

В светлом будущем wb-rules будет переезжать на NodeJS, обратную совместимость с задокументированными функциями мы точно оставим, но всё, что не задумывалось специально и сейчас вдруг работает, может запросто отвалиться.

1 лайк

@BrainRoot @AlexandrD
Спасибо за комментарии!

Тогда, думаю, стоит обновить описание в README.md, чтобы исключить разночтения.

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.