Странное поведение после правки файла правил. wb-rules 1.7.1

Этот код проверяет работоспособность MODBUS путем проверки того, что обновляются данные напряжения на mr6c. Опрос modbus стоит 500мс.

   defineVirtualDevice("vehicle", {
   title: "vehicle",
   cells: {
   	ModBUS_OK: {
           type: "switch",
           value: false,
           forceDefault: true
       }
   }
   });
   var ModBus_count = -1;
   defineRule("ModBus_Count_Rul", {
   whenChanged: ["wb-mr6c_1/Supply voltage"],
   then: function(newValue) {
       log("ModBus_Count_Rul ModBus_Count=",ModBus_count );
   	ModBus_count++;
   }
   });
   function Check_ModBus() {
       log("ModBus_Check ModBus_count = ", ModBus_count);
   	if (ModBus_count > 0 && dev["vehicle"]["ModBUS_OK"] == false) 
   		{ 
   			dev["vehicle"]["ModBUS_OK"] = true;
   		}
   	else 
       	if (ModBus_count == 0 && dev["vehicle"]["ModBUS_OK"] == true)
   			{ 
   				dev["vehicle"]["ModBUS_OK"] = false; 
   			}
   	ModBus_count = 0;                
   };
   setInterval(Check_ModBus, 3000);

При перезапуске wb-rules (или при рестарте контроллера) Правило работает как и было задумано. Вот лог:

2020-07-08 23:00:20ModBus_Count_Rul ModBus_Count= 0
2020-07-08 23:00:21ModBus_Count_Rul ModBus_Count= 1
2020-07-08 23:00:21ModBus_Count_Rul ModBus_Count= 2
2020-07-08 23:00:22ModBus_Count_Rul ModBus_Count= 3
2020-07-08 23:00:22ModBus_Count_Rul ModBus_Count= 4
2020-07-08 23:00:22ModBus_Check ModBus_count = 5
2020-07-08 23:00:23ModBus_Count_Rul ModBus_Count= 0
2020-07-08 23:00:24ModBus_Count_Rul ModBus_Count= 1
2020-07-08 23:00:24ModBus_Count_Rul ModBus_Count= 2
2020-07-08 23:00:25ModBus_Count_Rul ModBus_Count= 3
2020-07-08 23:00:25ModBus_Count_Rul ModBus_Count= 4
2020-07-08 23:00:25ModBus_Check ModBus_count = 5
2020-07-08 23:00:26ModBus_Count_Rul ModBus_Count= 0
2020-07-08 23:00:26ModBus_Count_Rul ModBus_Count= 1
2020-07-08 23:00:27ModBus_Count_Rul ModBus_Count= 2
2020-07-08 23:00:27ModBus_Count_Rul ModBus_Count= 3
2020-07-08 23:00:28ModBus_Count_Rul ModBus_Count= 4

Если внести любое изменение в правило, не перезагружая службу правил, получаем странное поведение, при котором dev[“vehicle”][“ModBUS_OK”] переключается из true в false и обратно. А лог выглядит вот так:

2020-07-08 22:56:58ModBus_Count_Rul ModBus_Count= 0
2020-07-08 22:56:59ModBus_Count_Rul ModBus_Count= 1
2020-07-08 22:56:59ModBus_Count_Rul ModBus_Count= 2
2020-07-08 22:57:00ModBus_Count_Rul ModBus_Count= 3
2020-07-08 22:57:00ModBus_Count_Rul ModBus_Count= 4
2020-07-08 22:57:00ModBus_Check ModBus_count = 0
2020-07-08 22:57:01ModBus_Count_Rul ModBus_Count= 5
2020-07-08 22:57:01ModBus_Check ModBus_count = 6
2020-07-08 22:57:01ModBus_Count_Rul ModBus_Count= 0
2020-07-08 22:57:02ModBus_Count_Rul ModBus_Count= 1
2020-07-08 22:57:02ModBus_Count_Rul ModBus_Count= 2
2020-07-08 22:57:03ModBus_Count_Rul ModBus_Count= 3
2020-07-08 22:57:03ModBus_Count_Rul ModBus_Count= 4
2020-07-08 22:57:04ModBus_Check ModBus_count = 0
2020-07-08 22:57:04ModBus_Check ModBus_count = 5
2020-07-08 22:57:04ModBus_Count_Rul ModBus_Count= 0
2020-07-08 22:57:05ModBus_Count_Rul ModBus_Count= 1

в версии 2 по моему тоже проблема наблюдается.

Так все правильно. До того как оно чем изменится (при создании) - оно false.
Поправил в вашем сообщении лог, заключил в теги кода.

UPD: Проверю (воспроизведу) в текущей и новой версии.

По умолчанию forceDefault == false, т.е. если флаг не задан явно, при запуске параметр примет предыдущее сохранённое значение (если оно существует и lazyInit != true; для новых виртуальных устройств будет записано значение по умолчанию при условии lazyInit != true). Для того, чтобы вернуть старое поведение wb-rules (не использовать сохранённое значение при запуске), задайте явно forceDefault = true.

По умолчанию lazyInit == false, т.е. в этом случае при запуске контрол примет предыдущее сохранённое значение (при условии, что оно существует и forceDefault != true). Если же задать lazyInit = true, то в этом случае хранилище значений не будет использоваться для этого контрола ни для чтения, ни для записи, а сам контрол отобразится в mqtt только после присвоения ему значения в первый раз.

Запускаем скрипт “как есть” и:

mosquitto_sub -v -t /devices/vehicle/#

При сохранении правила

/devices/vehicle/controls/ModBUS_OK (null)
/devices/vehicle/controls/ModBUS_OK/meta/readonly (null)
/devices/vehicle/controls/ModBUS_OK/meta/type (null)
/devices/vehicle/controls/ModBUS_OK/meta/order (null)
/devices/vehicle/meta/name (null)
/devices/vehicle/meta/driver (null)
/devices/vehicle/meta/name vehicle
/devices/vehicle/meta/driver wb-rules
/devices/vehicle/controls/ModBUS_OK/meta/type switch
/devices/vehicle/controls/ModBUS_OK/meta/order 1
/devices/vehicle/controls/ModBUS_OK/meta/readonly 0
/devices/vehicle/controls/ModBUS_OK 1

То есть он реально “сначала” null/
копаю.

Два тестовых скрипта, первый:

//Test2_unit.js
defineVirtualDevice("test2unit", {
   title: "test2",
   cells: {  
   	ModBUS_OK: { 
           type: "switch",
           //forceDefault: true,
           value: true
       }    
   }
   });

При его сохранении возникают события, на которые смотрим с помощью mosquitto_sub -v -t /devices/test2unit/# :

/devices/test2unit/controls/ModBUS_OK (null)
/devices/test2unit/controls/ModBUS_OK/meta/readonly (null)
/devices/test2unit/controls/ModBUS_OK/meta/type (null)
/devices/test2unit/controls/ModBUS_OK/meta/order (null)
/devices/test2unit/meta/name (null)
/devices/test2unit/meta/driver (null)
/devices/test2unit/meta/name test2
/devices/test2unit/meta/driver wb-rules
/devices/test2unit/controls/ModBUS_OK/meta/type switch
/devices/test2unit/controls/ModBUS_OK/meta/order 1
/devices/test2unit/controls/ModBUS_OK/meta/readonly 0
/devices/test2unit/controls/ModBUS_OK 1

То есть он, контрол, не становится false
Для проверки - делаем еще один скрипт:

// test2addon.js
defineRule("test2unit", { //название правила 
whenChanged: "test2unit/ModBUS_OK", //При изменении
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("test2unit/ModBUS_OK", newValue); //Это лог. Он попадает в /var/log/messages
  }
});

То есть отслеживаем изменения и реагируем. Это правило срабатывает на изменения состояния контрола, но не срабатывает при сохранении первого скрипта.
А что за кейс? Выложите скрипт, который неправильно реагирует?

Много читал, мало что понял. =)
Проблема в том, что вначале скрипт работает нормально.
Но если мы зайдем в редактор скриптов и добавим, допустим, пустую строку в скрипт, и сохраним скрипт, то поведение скрипта становится некорректным.

То есть - загружается контроллер, все ок. Все работает.

И это выражается в том что контрол “ModBUS_OK” становится (null) а потом снова (1)?
А какой скрипт на это неправильно реагирует? Или это просто в интерфейсе?
Почему спрашиваю - ваш реагирующий скрипт может проверять контрол на “НеИстина” - и реагировать.
Можно при запуске скрипта попробовать проверить наличие контрола, и если он, контрол, есть - то не пересоздавать. Займусь - сделаю.

Это видно в интерфейсе, и в логе.
Версия правил 1.7.1
см первое сообщение топика.

Версия 2.4.0 такой проблемы не имеет.

Вы используете и старые и новые? Может для старых вынести часть кода которая создает виртуальное устройство в отдельный скрипт?

Мы используем старые, но планируем когда-нибудь перейти на новые.
Поэтому тестируется и на старых и на новых.
А описание виртуального устройства можно в отдельный скрипт вынести? А порядок загрузки скриптов какой? У меня год назад не получилось.

Создается виртуальное устройство в одном файле - а работаем с ним из другого.

Вот как в моем примере:

Сортируется по алфавиту, если начать имя скрипта с “_” - загружается в числе первых.