[РЕШЕНО] wb-rules не стартует

вообще странно.
при этом, скрипты в папке есть. Чета прям совсем грустно :frowning:

блть! все скрипты встали.
что зв херня!!!
я вообще ничего не менял, по крайней мере ничего в консоли, скрипты правил только в встроенном редакторе.

wb-rules просто не стартует, без каких либо записей об ошибках.

Это полный …ец! По сути контроллер перестал работать, а в журнале просто тишина.
Да как так то?!

в /var/log/messages смотрели?

естественно, там только ватчдог жалуется

user.notice wb-daemon-watchdogs: wb-rules check failed, reload wb-rules

команда
systemctl start wb-rules

отрабатывает молча, ни одного мессаджа.

включил -debug, с виду ничего криминального:

wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: loadDir: /usr/share/wb-rules-system/rules/
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: loadDir: entry: /usr/share/wb-rules-system/rules/buzzer.js
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: [rule debug] defineRule: _system_buzzer_params
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: PUB: /wbrules/log/debug -> defineRule: _system_buzzer_params
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: adding cell frequency for rule _system_buzzer_params
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: adding cell volume for rule _system_buzzer_params
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: [rule debug] defineRule: _system_buzzer_onof
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: PUB: /wbrules/log/debug -> defineRule: _system_buzzer_onof
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: adding cell enabled for rule _system_buzzer_onof
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: loadDir: entry: /usr/share/wb-rules-system/rules/hwmon.js
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: INFO: MQTT connection established
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: loadDir: entry: /usr/share/wb-rules-system/rules/network.js
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: loadDir: entry: /usr/share/wb-rules-system/rules/power_status.js
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: [rule debug] defineRule: _system_track_vin
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: PUB: /wbrules/log/debug -> defineRule: _system_track_vin
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: driver: new remote device: wb-adc
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: adding cell Vin
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: adding cell Vin for rule _system_track_vin
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: [rule debug] defineRule: _system_dc_on
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: PUB: /wbrules/log/debug -> defineRule: _system_dc_on
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: [rule debug] defineRule: _system_dc_off
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: PUB: /wbrules/log/debug -> defineRule: _system_dc_off
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: loadDir: entry: /usr/share/wb-rules-system/rules/system.js
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: loadDir: entry: /usr/share/wb-rules-system/rules/wb-mqtt-dac.js
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: loadDir: /etc/wb-rules
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: loadDir: entry: /etc/wb-rules/alarm_send.js
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: [rule debug] defineRule: Alarm room temps
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: PUB: /wbrules/log/debug -> defineRule: Alarm room temps
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: driver: new remote device: wb-w1
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: adding cell 10-0008035de3a7
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: adding cell 10-0008035de3a7 for rule alarm_send.js/Alarm room temps
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: loadDir: entry: /etc/wb-rules/alarms.conf
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: loadDir: entry: /etc/wb-rules/mz-boiler-outcontrol.js
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: [rule debug] defineRule: heater_control
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: PUB: /wbrules/log/debug -> defineRule: heater_control
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: adding cell 28-00000a1c32c4
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: adding cell 28-00000a1c32c4 for rule mz-boiler-outcontrol.js/heater_co
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: [rule debug] defineRule: Z033SetDisplayTempRule
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: PUB: /wbrules/log/debug -> defineRule: Z033SetDisplayTempRule
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: esWbDevObject(): top=1 isString=true
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: driver: new remote device: z033_33
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: adding cell z033_config1
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: cell z033_config1 internal value =
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: esWbDevObject(): top=1 isString=true
wirenboard-AI3KHX6P daemon.info wb-rules[7197]: DEBUG: cell 10-0008035de3a7 internal value =

кажется начинаю понимать, демон падает из-за скрипта, самого важного как назло.
но во-первых, какого хрена он так делает, вместо просто ругнуться в журнал, а во-вторых как мне теперь понять что в скрипте не так.

методом проб и ошибок выявлено, что валится на таком коде.
при том, если это сделать из правила или вызванной функции, все ок. А вот если самовызываемая функция, то wb-rules падает, при том молча.

(function () {
dev[“z033_33/z033_config1”] = 2113;
}());

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

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

в файле конечно много чего, но если вставляю это код, то движок не запускается. При том, если я этот код вставлю при запущенном движке и просто сохраню скрипт с ним, то все работает.
Это код пишет в регистр панели конфиг отображаемой информации. В принципе его надо записать только на старте, по этому я вставил его в самовызываемую функцию.

Вынес эту конструкцию в отдельный скрипт, при запущеном движке и сохранении скрипта все работает, а если сделать рестарт движка, не стартует.

К сожалению не могу много экспериментировать на рабочем контроллере, и так вырубилось отопление на всю ночь, мама уже панику подняла.

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

Кажется поведение вполне соответствует документации :slight_smile:

поведение скрипта да, а вот поведение движка нет. А если у меня десяток другой скриптов, с какого это барабана движок падает? И какого это фига он падает абсолютно молча?
Ну и значит есть повод написать не “Не следует использовать объект dev вне кода правил.”, а “Использование dev вне кода правил приводит к падению системы”.
А еще лучше, на этапе проверки синтаксиса уже выявлять этот момент.
В данном случае опасность еще в том, что при вставки в код во время работы движка ошибки нет, она проявляется только при запуске. Люди могут пострадать от этого, подправят код скрипта и уедут, а контроллер перезагрузится и кирдык.
Как у меня и вышло, код это работал неделю нормально. А вчера добавлял импульсное реле и выключал контроллер. Все включил и пошел спать, я ведь код то не правил. А с утра понял, хорошо на улице не -20.

Я понимаю ваше раздражение. Да, можно делать более качественное ПО. И более качественную документацию. Или просто более качественно всё тестировать, как в каком-нибудь NASA. Я буду скромен и напомню вам недавнюю ситуацию с осенним обновлением Windows 10, где у части пользователей безвозвратно потеряны файлы, хранившиеся в “Моих документах”. Огромные корпорации, не первое десятилетие (43 года уже, Карл, 43!!1) занимающиеся разработкой ПО, совершают ошибки посерьёзнее чем падение движка.

В документации к wb-rules написано, что “последствия не определены”. Падение демона при перезапуске более чем подходит под эту фразу.

В качестве грубой аналогии — представьте себе ситуацию: пришёл человек в тир, инструктор ему несколько раз повторил, что заряженное оружие в людей не направлять, плюс повсюду висят таблички с этим же напоминанием, но в итоге человек всё-равно отстрелил палец своему другу в шутку направив на него пистолет.

Да, в документации всего-лишь указано, что “последствия не определены”, и вроде бы ничто не предвещает беды. Но мы же с вами не студенты первого курса, чтобы не осознавать что может скрываться за этой фразой.

И ещё небольшой комментарий по поводу “Люди могут пострадать от этого, подправят код скрипта и уедут, а контроллер перезагрузится и кирдык”: как бы не было это прискорбно, но тестирование кода — ответственность человека написавшего этот код. Правила автоматизации здесь не исключение. Вы же не станине обвинять компилятор Java/C++/Любого-другого-языка за то, что он взял и не нашёл у вас в коде всякие утечки памяти и прочие out of memory…

P.S. Ну и да, добро пожаловать в мир разработки ПО, который мы заслужили.

нет, это вы наверное не правильно поняли, в данном случае налицо двойственное поведение. При компиляции никаких ошибок не было и код работал. Ошибка была именно при старте движка.
Выбор лингвистического языка для управления контроллером обсуждали в другой теме. Я остаюсь при своем мнении, яваскрипт плохой выбор.

А про сравнение, в таких случаях родители в детстве мне всегда говорили “а у тебя своя голова на плечах есть?”.

На сколько я помню, вы администратор, верно? И ребут-тесты вам не близки? :slight_smile:

Да, косяк в wb-rules налицо, но ещё раз — “последствия не определены”. Это точно так же включает то, что при правильном положении звёзд всё будет работать.

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

Я нашёл решение этой проблемы - достаточно все такие инициализации значений обернуть в таймер с минимальным временем задержки. Все таймеры вызываются уже после старта движка и там всё работает нормаьно.

да, если я что-то менял, я всегда перезагружаю сервер и проверяю работу. В данном случае я контроллер вообще не трогал, а всю неделю он работал как часы.
Тут получается, что функциональность кнопки Save маловата. Сейчас даже в пользовательском оборудовании есть Safe mode, когда происходит рестарат с новыми параметрами и если нет подтверждения нормальной работы, через некоторое время рестарт с старыми.
Кстати, тему логики работы скриптов я и завел именно по этой причине, так-как не до конца понимаю схемы процессов в различной ситуации. В этот случай как раз из этой серии.
Думаю производителю стоит изменить сам модуль работы со скриптами, как внешне, так и логику. Внешне однозначно нужны кнопки отключения скриптов и удаления. А по кнопке Save лучше релоадить движок, чтобы все косяки сразу прилетали. А от ведь до консоли некоторые могут и не добраться. Или отдельный скрипт пытаться запустить отдельным процессом, для проверки. Ну что-то типа Safe mode.

Честно говоря, я по старинке привык к технологии autoexec.bat :slight_smile:
Ну почему бы не сделать механизм вызываемый при старте первым? К примеру это может быть жестко зашитое правило, которое гарантировано будет вызываться первым при запуске системы. Ведь это вполне нормальный подход. А можно даже сделать несколько таких правил, по каким-нибудь еще системным случаям, типа софтовая перезагрузка или еще что.

Ну можно написать красивую обёртку с таймером внутри и вызывать как-то так:

ExecAtStartup(function() {
    dev['aaa'] = 1;
})

В принципе wb-rules достаточно хорош, есть неприятные вещи, но с ними можно жить.

Берите WB6 ставьте nodejs LTS и все что вам нужно к нему и забудьте про wb-rules. Всё встает и работает. В принципе можно даже wb-rules и снести тогда, не пробовал еще - но попробую - а заодно и nginx.

1 лайк