Если внести любое изменение в правило, не перезагружая службу правил, получаем странное поведение, при котором dev[“vehicle”][“ModBUS_OK”] переключается из true в false и обратно. А лог выглядит вот так:
По умолчанию forceDefault == false, т.е. если флаг не задан явно, при запуске параметр примет предыдущее сохранённое значение (если оно существует и lazyInit != true; для новых виртуальных устройств будет записано значение по умолчанию при условии lazyInit != true). Для того, чтобы вернуть старое поведение wb-rules (не использовать сохранённое значение при запуске), задайте явно forceDefault = true.
По умолчанию lazyInit == false, т.е. в этом случае при запуске контрол примет предыдущее сохранённое значение (при условии, что оно существует и forceDefault != true). Если же задать lazyInit = true, то в этом случае хранилище значений не будет использоваться для этого контрола ни для чтения, ни для записи, а сам контрол отобразится в mqtt только после присвоения ему значения в первый раз.
То есть он, контрол, не становится 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)?
А какой скрипт на это неправильно реагирует? Или это просто в интерфейсе?
Почему спрашиваю - ваш реагирующий скрипт может проверять контрол на “НеИстина” - и реагировать.
Можно при запуске скрипта попробовать проверить наличие контрола, и если он, контрол, есть - то не пересоздавать. Займусь - сделаю.
Мы используем старые, но планируем когда-нибудь перейти на новые.
Поэтому тестируется и на старых и на новых.
А описание виртуального устройства можно в отдельный скрипт вынести? А порядок загрузки скриптов какой? У меня год назад не получилось.