Зависает движек правил при перезапуске


#1

Уменьшил код по максимуму. В целом правило можно заставить работать, если править его в вебинтерфейсе, и там сохранить, при работающем движке правил. Но если Движек перезапустить, то он виснет (ну и при рестарте контроллера тоже самое).
WB6/

defineVirtualDevice("vehicle", {
    title: "vehicle",
    cells: {

    bunker_level: {
      type: "value",
      value: 0,
        forceDefault: true 
  }
 
  }
});


defineRule("bunker level", {
	whenChanged: ["wb-mr6c_1/Input 1", "wb-mr6c_1/Input 2", "wb-mr6c_1/Input 3", "wb-mr6c_1/Input 4", "wb-mr6c_1/Input 5"],
  	then: get_bunker_level()
});


function get_bunker_level() {
        if(dev["wb-mr6c_1"]["Input 5"] == true) { dev["vehicle/bunker_level"] = 100; return }
    	dev["vehicle"]["bunker_level"] = 0; 
	   };

#2

Такое ощущение, что не все MQTT-топики успевают подгрузится при старте движка правил.
Попробуйте остановить его сервис и запустить в командной строке, будут ли ошибки?
(В этом сообщении описано как: WB-rules срабатывают несколько раз)


#3

wbrules.txt (7.1 КБ)
Добавлю. Проблема появилась когда я вынес функцию наружу.
then: function () { … } вполне работало.


#4

Я думаю, вы столкнулись как раз с неопределенными последствиями, которые описаны в документации :
Не следует использовать объектdevвне кода правил. Не следует присваивать значения параметрам черезdevвнеthen-функций правил и функций обработки таймеров (коллбэкиsetInterval/setTimeout). В обоих случаях последствия не определены.

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


#5

Не красиво получается. Дублирование кода происходит. Но спасибо, буду думать.


#6

Мне кажется надо
then: get_bunker_level()
заменить на
then: get_bunker_level

А сейчас у вас функция get_bunker_level вызывается при вызове defineRule


#7

Похоже Вы очень даже правы! Жаль я уже все переделал. Но это очень хорошая новость.
А как обрабатываются несколько файлов правил?
Можно в отдельном файле прописать функции, в отдельном параметры и алиасы, в отдельном описание виртуального устройства, в отдельном сами правила?


#8

Сейчас дела обстоят так:
Начиная с версии wb-rules 1.7, локальные переменные и функции, объявленные в файле сценария не видны в других сценариях. Таким образом, каждый сценарий может определять свои функции и переменные без риска изменить поведение других сценариев.

В версии движка 2.0 появилась возможность использовать модули (как в node.js), можно поэкспериментировать с ними. Но это пока далеко не продакшн-версия.