Wb-rules - простейший скрипт, который не работает после wb-rules restart


#1

Добрый день
Попытался реализовать опрос /devices/system/controls/Current uptime для дальнейшего его использования вместо таймера.
Сделал простейший скрипт:

log (“Start”);
defineRule(“sys_date”, {
whenChanged: [ “system/Current uptime” ],
then: function() {
log (Date());
}
});

После сохранения скрипта все работает - в логи каждую минуты приходят сообщении о текущем uptime.
Но стоит перезагрузить wb-rules или контролер целиком - в лог файл попадает только сообщение о старте.

Кто нибудь мне объяснит - почему это не работает? И как заставить это работать?


Wb-rules не работает после перезагрузки
#2

vugluskr, здравствуйте!
Попробуйте обернуть создание правил вот так, чтоб оно вызывалось с задержкой:

function initSysDateRule() {
 log("Start");
 defineRule("sys_date", {
  whenChanged: ["system/Current uptime"],
  then: function() {
   log(Date());
  }
 });
};

setTimeout(initSysDateRule, 5000);

Похоже, что на момент создания правила движок не успевает получить из MQTT данные от system/Current uptime.


#3

Попробуйте обернуть создание правил вот так, чтоб оно вызывалось с задержкой

Да - так работает.
Но это все же костыль.

Похоже, что на момент создания правила движок не успевает получить из MQTT данные

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

Разработчики что нибудь собираются с этим делать?
Кстати, как с этим обстоят дела с wb-rules 2.0?


#4

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