Добрый день.
Обновился вчера на Trixie и заметил следующее:
Несколько лет использую такую конструкцию в правилах для старта инициализации своего модуля на wb rules (немного его упростил выбросив всю логику и оставив только вывод в лог)
// Функция подписки на готовность драйвера последовательного порта
function pTrackLoadDriver(){
try {
return trackMqtt("/rpc/v1/wb-mqtt-serial/ports/Load", function (message) { // подписка на топик готовности драйвера serial port в MQTT
log.info("name: {}, value: {}".format(message.topic, message.value));
if (message.value == 1 ) { // Если флаг инициализации Serial поднят и не поднят флат инициализации модуля
log.warning("Serial Port is Runining"); // Устанавливаем флаг начала инициализации
};
});
} catch (error) {
log.error ("TrackLoadDriver: ERR = {}", error);
};
};
pTrackLoadDriver();
После обновления правила завязанные на эту конструкцию не срабатывают. Как возможно исправить?
И еще один вопрос, ранее (года 2-3 назад) вроде читал что это правило при создании читает из указанного топика значение хотя бы один раз. Сейчас такого нет.
И последнее эту конструкцию и раньше “ломали” особенно в ветке “тестинг”, но она хотя бы срабатывала при перегрузке (включении) контролера сейчас и этого нет. Вот перезагрузил контроллер
13-07-2026 16:35:07.688
wb-rules.service: Referenced but unset environment variable evaluates to an empty string: WB_RULES_OPTIONS
13-07-2026 16:35:08.711
2026/07/13 11:35:08 ERROR: metrics: disable exposing PSI metrics because of failed init: open /sys/fs/cgroup/system.slice/wb-rules.service/cpu.pressure: no such file or directory
13-07-2026 16:35:09.414
INFO: broker URL is default and mosquitto socket detected, trying to connect via it
13-07-2026 16:35:09.468
INFO: driver is created
13-07-2026 16:35:09.546
INFO: [wbgo_mqtt] rules-wirenboard-xxxxxxxxxx: MQTT connection established
13-07-2026 16:35:09.568
INFO: driver loop is started
13-07-2026 16:35:09.568
INFO: wait for driver to become ready
13-07-2026 16:35:09.680
INFO: driver is ready
13-07-2026 16:35:09.726
INFO: [rule info] using file /var/lib/wirenboard/wbrules-persistent.db for persistent DB
13-07-2026 16:35:09.738
INFO: [wbgo_mqtt] wb-rules-engine-wirenboard-xxxxxxxxx: MQTT connection established
13-07-2026 16:35:09.978
INFO: [engine] Starting main loop
13-07-2026 16:35:09.980
INFO: the engine is ready
13-07-2026 16:35:09.981
INFO: [engine] Starting sync loop
13-07-2026 16:35:13.316
WARNING: [rule warning] Load 1 Module
13-07-2026 16:35:13.924
WARNING: [rule warning] Load 2 Module
13-07-2026 16:35:13.960
WARNING: [rule warning] Load 3 Module
13-07-2026 16:35:14.436
WARNING: [rule warning] Load 4 Module
13-07-2026 16:35:14.486
WARNING: [rule warning] Load 5 Module
13-07-2026 16:35:14.629
WARNING: [rule warning] Load 6 Module
13-07-2026 16:35:15.055
WARNING: [rule warning] DAC: no config file
13-07-2026 16:35:15.068
INFO: all rule files are loaded
13-07-2026 16:35:19.907
WARNING: [rule warning] Run 1 Module
Видно что сообщения в системном журнале нет. При этом флаг в MQTT есть
и нормально работало (и работает на контроллерах которые не обновлял). Ранее где то в году 2023 этот способ был предложен здесь на форуме как решение для правил на wb-rules которые зависят от готовности (загрузки) драйвере serial. вопрос на форуме
Но Вы его иногда “ломали” - оно бывало не срабатывало при обновлениях в ветке “тестинг”. Спрошу тогда по другому - мне нужно знать что контроллер полностью загрузился и я могу обращаться (в своих правилах) к устройствам подключенным к COM портам.
Спросите у коллег по поводу этого флага
"/rpc/v1/wb-mqtt-serial/ports/Load"
.
Ну и самое главное, почему не сработала функция
pTrackLoadDriver();
Ведь она явно вызывается. Должен ли
trackMqtt("/rpc/v1/wb-mqtt-serial/ports/Load", function (message)
при создании хотя бы один раз сработать? Ранее это вроде обговаривалось в описании (сейчас не не нашёл)
Ну, способ - возможно и работающий но тем не менее все ж “костыль”.
Что я вижу после изысканий: когда-то топик применялся для связи с веб-интерфейсом, но сейчас он legacy.
Я бы не стал рекомендовать использовать недокументированные возможности в проде.
Когда устройства начинают опрашиваться драйвером - он публикует их топики. Вот наличие топиков без ошибок (пустой meta/error) - и есть признак того что устройство опрашивается. Сам по себе запуск драйвера - он не особо применим на практике.
Если значение топика не меняется - нет.
Как описано в документации - возвращется новое значение. То есть никаких особых условий нет. Сама по себе подписка - не вызывает срабатывание.
Хотя, проверяю:
В общем посмотрю в исходники.
У меня нет срабатываний trackMqtt.
Но если посмотреть в журнал самого сервиса wb -rules. то можно увидеть эту картину
13-07-2026 16:35:13.316
WARNING: [rule warning] Load1 Module
13-07-2026 16:35:13.924
WARNING: [rule warning] Load 2 Module
13-07-2026 16:35:13.960
WARNING: [rule warning] Load 3 Module
13-07-2026 16:35:14.436
WARNING: [rule warning] Load 4 Module
13-07-2026 16:35:14.486
WARNING: [rule warning] Load 5 Module
13-07-2026 16:35:14.629
WARNING: [rule warning] Load 6 Module
13-07-2026 16:35:15.055
WARNING: [rule warning] DAC: no config file
13-07-2026 16:35:15.068
INFO: all rule files are loaded
13-07-2026 16:35:19.907
WARNING: [rule warning] Run Alert Journal Module
В ЭТОМ МЕСТЕ БЫЛ ЗАПУСК ОБНОВЛЕНИЯ ЧЕРЕЗ КОНСОЛЬ
14-07-2026 09:35:14.756
WARNING: [wbgo_mqtt] MQTT connection lost: EOF
14-07-2026 09:35:14.757
WARNING: [wbgo_mqtt] Cleaning up token queue
14-07-2026 09:35:14.758
WARNING: [wbgo_mqtt] MQTT connection lost: EOF
14-07-2026 09:35:14.758
WARNING: [wbgo_mqtt] Cleaning up token queue
14-07-2026 09:35:16.028
INFO: [wbgo_mqtt] wb-rules-engine-wirenboard-xxxxxxx-2810: MQTT connection established
14-07-2026 09:35:16.030
INFO: [wbgo_mqtt] rules-wirenboard-xxxxxxx-2810: MQTT connection established
14-07-2026 09:35:16.080
INFO: [rule info] name: /rpc/v1/wb-mqtt-serial/ports/Load, value: 1
14-07-2026 09:35:17.292
WARNING: [rule warning] Run 1 Module <-МОДУЛЬ ЗАПУСТИЛСЯ TrackMqtt сработал
14-07-2026 09:35:18.259
WARNING: [rule warning] Run 2 Module <-МОДУЛЬ ЗАПУСТИЛСЯ TrackMqtt сработал
14-07-2026 09:35:19.245
WARNING: [rule warning] Run 3 Module <-МОДУЛЬ ЗАПУСТИЛСЯ TrackMqtt сработал
14-07-2026 09:35:20.118
WARNING: [rule warning] Run 4 Module <-МОДУЛЬ ЗАПУСТИЛСЯ TrackMqtt сработал
14-07-2026 09:35:21.221
WARNING: [rule warning] Run 5 Module <-МОДУЛЬ ЗАПУСТИЛСЯ TrackMqtt сработал
14-07-2026 09:35:22.110
WARNING: [rule warning] Run 6 Module <-МОДУЛЬ ЗАПУСТИЛСЯ TrackMqtt сработал
14-07-2026 09:36:19.182
INFO: reloading file: /etc/wb-rules/Test.js < Перезагрузка модуля Test.js по кнопке "Сохранить" в WEB интерфейсе
14-07-2026 09:36:46.571
WARNING: [rule warning] Load <-МОДУЛЬ Test.js ЗАПУСТИЛСЯ но TrackMqtt НЕ СРАБОТАЛ!!!
14-07-2026 09:36:47.560
INFO: reloading file: /etc/wb-rules/Test.js
14-07-2026 09:37:34.949
НАЖАТА КНОПКА "ПЕРЕЗАГРУЗКИ" в WEB ИНТЕРФЕЙСЕ
INFO: [engine] Stop main loop
14-07-2026 09:37:34.957
INFO: [engine] Stopping sync loop
14-07-2026 09:38:12.981
wb-rules.service: Referenced but unset environment variable evaluates to an empty string: WB_RULES_OPTIONS
14-07-2026 09:38:14.140
2026/07/14 04:38:14 ERROR: metrics: disable exposing PSI metrics because of failed init: open /sys/fs/cgroup/system.slice/wb-rules.service/cpu.pressure: no such file or directory
14-07-2026 09:38:14.859
INFO: broker URL is default and mosquitto socket detected, trying to connect via it
14-07-2026 09:38:14.988
INFO: driver is created
14-07-2026 09:38:15.107
INFO: [wbgo_mqtt] rules-wirenboard-xxxxxxxx-2809: MQTT connection established
14-07-2026 09:38:15.126
INFO: driver loop is started
14-07-2026 09:38:15.151
INFO: wait for driver to become ready
14-07-2026 09:38:15.163
INFO: driver is ready
14-07-2026 09:38:15.204
INFO: [rule info] using file /var/lib/wirenboard/wbrules-persistent.db for persistent DB
14-07-2026 09:38:15.214
INFO: [wbgo_mqtt] wb-rules-engine-wirenboard-xxxxxxx-2809: MQTT connection established
14-07-2026 09:38:15.547
INFO: [engine] Starting main loop
14-07-2026 09:38:15.548
INFO: the engine is ready
14-07-2026 09:38:15.548
INFO: [engine] Starting sync loop
14-07-2026 09:38:18.622
WARNING: [rule warning] Load 1 Module
14-07-2026 09:38:19.352
WARNING: [rule warning] Load 2 Module
14-07-2026 09:38:19.386
WARNING: [rule warning] Load 3 Module
14-07-2026 09:38:19.872
WARNING: [rule warning] Load 4l Module
14-07-2026 09:38:19.922
WARNING: [rule warning] Load 5 Module
14-07-2026 09:38:20.055
WARNING: [rule warning] Load 6 Module
14-07-2026 09:38:20.528
WARNING: [rule warning] Load
14-07-2026 09:38:20.550
INFO: all rule files are loaded
14-07-2026 09:38:20.570
WARNING: [rule warning] DAC: no config file
14-07-2026 09:38:24.778
WARNING: [rule warning] Run Alert Journal Module
Здесь видно что после обновления в консоли и до нажатия кнопки “Перезагрузка” в WEB интерфейсе модули загрузились (значит функция подписки TrackMqtt на системный топик
"/rpc/v1/wb-mqtt-serial/ports/Load"
сработала. Но после перезагрузки этого не случилось. Событие не возникло.
Для справки
ii wb-bootlet-wb8x 6.8.0-wb160-fs1.5.5-deb11-202604271428 arm64 FIT bootlet images, Wiren Board 8 (bootlet)
ii wb-cloud-agent 1.8.1-wb100 all Wiren Board Cloud agent
ii wb-configs 3.52.4 all Default common config files for Wiren Board
ii wb-device-manager 1.25.5 all Wiren Board modbus devices manager
ii wb-diag-collect 1.10.1 all Wirenboard collector of data and logs
ii wb-dt-overlays 1.7.0 all Device tree overlays for Wiren Board devices
ii wb-ec-firmware 2.3.0 all Wiren Board Embedded Controller firmware and installer
ii wb-essential 1.21.0 all Wirenboard essential packages
ii wb-firmware-realtek 1.0.4 all Additional firmwares for Realtek chips
ii wb-homeui-backend 2.238.0 all Wiren Board Web UI web interface
ii wb-hwconf-manager 1.72.1 all Provides infrastructure for hardware re-configuration via Device Tree overlays
ii wb-knxd-config 1.1.6 all knxd configurator for Wiren Board
ii wb-mcu-fw-flasher 1.7.0 arm64 Firmware update tool for Wiren Board Modbus devices (WB-M*)
ii wb-mcu-fw-updater 1.16.0 all Wiren Board modbus devices firmware update tool (python 3)
ii wb-modbus-ext-scanner 1.5.0 arm64 Scanner utility for extended Wiren Board Modbus protocol
ii wb-mqtt-adc 2.8.0 arm64 Wiren Board Smart Home MQTT ADC driver compatible with HomA conventions
ii wb-mqtt-alice 0.13.2 all Yandex smart home with Alice to MQTT for Wiren Board controllers
ii wb-mqtt-confed 1.17.5 arm64 Wiren Board Configuration Editor Backend
ii wb-mqtt-dac 1.2.7 all IIO DAC driver
ii wb-mqtt-db 2.10.2 arm64 Wiren Board database logger
ii wb-mqtt-db-cli 1.4.9 all CLI for wb-mqtt-db
ii wb-mqtt-gpio 2.18.1 arm64 Wiren Board Smart Home MQTT generic GPIO driver compatible with HomA conventions
ii wb-mqtt-homeui 2.238.0 all Wiren Board Web UI web interface
ii wb-mqtt-iec104 1.3.0 arm64 Wiren Board MQTT to IEC 60870-5-104 gateway
ii wb-mqtt-knx 1.14.0 arm64 Wiren Board MQTT to KNX gateway
ii wb-mqtt-logs 1.6.0 arm64 Wiren Board journald to MQTT gateway
ii wb-mqtt-mbgate 1.9.0 arm64 Wiren Board MQTT to Modbus gateway
ii wb-mqtt-metrics 0.5.0 all Wirenboard tool for sending metrics to mqtt-channels
ii wb-mqtt-opcua 1.4.0 arm64 Wiren Board MQTT to OPC UA gateway
ii wb-mqtt-serial 2.259.0 arm64 Wiren Board Smart Home MQTT serial protocol driver
ii wb-mqtt-w1 2.4.0 arm64 Wiren Board MQTT 1-Wire driver
ii wb-nm-helper 1.38.1 all Wirenboard network configuration backend for wb-mqtt-confed.
ii wb-release-info 1.0-testing~wb8+trixie~20260713130743 all release information package for Wirenboard
ii wb-rules 2.44.4 arm64 Wiren Board Rule Engine
ii wb-rules-system 1.13.6 all Default system rules for Wiren Board
ii wb-scenarios 1.9.8 all Scenarios for Wiren Board
ii wb-suite 1.21.0 all Wirenboard vendor software set
ii wb-update-manager 1.5.1 all Wirenboard software updates and release management tool
ii wb-update-notifier 0.1.1 all Wiren Board update notifier
ii wb-utils 4.28.4 all Wiren Board command-line utils
ii wget 1.25.0-2 arm64 retrieves files from the web
ii wireless-regdb 2026.05.30-1~deb13u1 all wireless regulatory database for Linux
ii wireless-tools 30~pre9-18+b1 arm64 Tools for manipulating Linux Wireless Extensions
ii wpasupplicant 2:2.10-24 arm64 client support for WPA and WPA2 (IEEE 802.11i)
ii xauth 1:1.1.2-1.1 arm64 X authentication utility
ii xdg-user-dirs 0.18-2 arm64 tool to manage well known user directories
ii xml-core 0.19 all XML infrastructure and XML catalog file support
ii xxd 2:9.1.1230-2 arm64 tool to make (or reverse) a hex dump
ii xz-utils 5.8.1-1+deb13u1 arm64 XZ-format compression utilities
ii zlib1g:arm64 1:1.3.dfsg+really1.3.1-1+b1 arm64 compression library - runtime
ii zlib1g:armhf 1:1.3.dfsg+really1.3.1-1+b1 armhf compression library - runtime
Testing, trixie. wb-rules=2.44.4
Предварительно - проверил что топик есть, со значением.
Просто создал
// Функция подписки на готовность драйвера последовательного порта
function pTrackLoadDriver(){
try {
return trackMqtt("/rpc/v1/wb-mqtt-serial/ports/Load", function (message) { // подписка на топик готовности драйвера serial port в MQTT
log.info("name: {}, value: {}".format(message.topic, message.value));
if (message.value == 1 ) { // Если флаг инициализации Serial поднят и не поднят флат инициализации модуля
log.warning("Serial Port is Runining"); // Устанавливаем флаг начала инициализации
};
});
} catch (error) {
log.error ("TrackLoadDriver: ERR = {}", error);
};
};
pTrackLoadDriver();
В общем разобрался почему так происходит.
Чуть изменил правило вызывая два раза подписку на один и тот же топик.
Если правило создать в Web интерфейсе и сохранить то оно отрабатывает как и ожидалось 2 раза. А Вот если перезагрузить контроллер срабатывает только верхняя функция
Test.js
// Функция подписки на готовность драйвера последовательного порта
function pTrackLoadDriver(){
log.warning("Load1");
try {
return trackMqtt("/rpc/v1/wb-mqtt-serial/ports/Load", function (message) { // подписка на топик готовности драйвера serial port в MQTT
log.info("name: {}, value: {}".format(message.topic, message.value));
if (message.value == 1 ) { // Если флаг инициализации Serial поднят и не поднят флат инициализации модуля
log.warning("Serial Port is Runining1"); // Устанавливаем флаг начала инициализации
};
});
} catch (error) {
log.error ("TrackLoadDriver1: ERR = {}", error);
};
};
pTrackLoadDriver();
function pTrackLoadDrivers(){
log.warning("Load2");
try {
return trackMqtt("/rpc/v1/wb-mqtt-serial/ports/Load", function (message) { // подписка на топик готовности драйвера serial port в MQTT
log.info("name: {}, value: {}".format(message.topic, message.value));
if (message.value == 1 ) { // Если флаг инициализации Serial поднят и не поднят флат инициализации модуля
log.warning("Serial Port is Runining2"); // Устанавливаем флаг начала инициализации
};
});
} catch (error) {
log.error ("TrackLoadDriver2: ERR = {}", error);
};
};
pTrackLoadDrivers();
Пробуйте через перезагрузку контроллера. В этом случае сработает только верхняя функция, а строку Serial Port is Runining2 мы не увидим.
// 07_14_test_01.js
// (support.wirenboard.com/t/com-trixie/39573).
var TOPIC = "/test/testtopick";
function pTrackA() {
log.warning("test01: registering handler A on {}", TOPIC);
return trackMqtt(TOPIC, function (message) {
log.warning("test01 HANDLER A fired: topic={} value={}", message.topic, message.value);
});
}
pTrackA();
function pTrackB() {
log.warning("test01: registering handler B on {}", TOPIC);
return trackMqtt(TOPIC, function (message) {
log.warning("test01 HANDLER B fired: topic={} value={}", message.topic, message.value);
});
}
pTrackB();
// 07_14_test_02.js
var TOPIC = "/test/testtopick";
log.warning("test02: registering handler C on {}", TOPIC);
trackMqtt(TOPIC, function (message) {
log.warning("test02 HANDLER C fired: topic={} value={}", message.topic, message.value);
});
и третий
// 07_14_test_03.js
var TOPIC = "/test/testtopick";
log.warning("test03: registering handler D on {}", TOPIC);
trackMqtt(TOPIC, function (message) {
log.warning("test03 HANDLER D fired: topic={} value={}", message.topic, message.value);
});
Собственно исследовал три случая:
Тест
В логе
Файлы сохранены при работающем сервисе), publish в топик
Все 4 (A, B, C, D)
publish после холодного старта (любое изменение значения)
Все 4 (A, B, C, D)
Начальное (retained) значение в момент подписки на старте
Только первого скрипта, успевшие отработать: стабильно A и B; C и D ни разу
Вывод: Подписки работают как и документировано.
Причина срабатывания при запуске: wb-rules при загрузке дедуплицирует подписку на брокере: то есть независимо от инициаторов подписка одна. От первого скрипта, который к нему обратился. Retained-сообщение брокер отдаёт один раз в ответ на этот SUBSCRIBE , и его получают только обработчики первого скрипта (в test_01 оба, A и B). Скрипты, которые подписываются на уже подписанный топик (test02/test03), нового соьытия не порождают так как начальное значение до них не доходит.
Проверил поменяв имя файла, первым при загрузке начал выполняться скрипт с более верхним и результат возвращается ему.
Не уверен, стоит ли считать переходные процессы запуска багом.
Я просто к тому что ранее (на релизах до Trixie) поведение было другим. Да, я наверное сяду и перепишу код инициализации модулей. Просто я не всегда отслеживаю изменения в релизах, да и правило “работает не трогай” пока некто не отменял.
Добрый день еще раз.
Прошу все таки уточнить работу trackMqtt (и описать это в документации)
Если все таки мне нужно подписаться на изменение одного и того же топика в MQTT из 2 -х разных файлов (правил) я смогу это сделать и не потерять событие изменения топика во втором правиле? Правила при этом не создают виртуальные устройства, но им нужна подписка на один и тот же топик для внутренней логики.
Должен ли трасk MQTT сработать при создании правила ( то есть мы создали подписку на изменение топика (произвольного), но значение в нем изменилось 1 секунду назад, а следующее придёт через 5 или 30 мин. И получается мы всё это время не сможем узнать значение? (кроме явной подписки и использования RunShellComand).
Или есть другое решение?
Вот и все что ищется пр trackMqtt на Гите
Подписка на MQTT-топики trackMqtt()
Если вам нужно следить за изменением произвольных MQTT-топиков, используйте trackMqtt();
trackMqtt(topic, callback()) подписывается на MQTT с указанным topic'ом, допустимы символы # и + значения передаются в функцию объектом message состоящим из: .topic — путь к топику, значение которого изменилось, .value — новое значение топика, .retained и .qos:
trackMqtt("/devices/wb-adc/controls/Vin", function(message) {
log.info("name: {}, value: {}".format(message.topic, message.value));
});
Проверил на актуальном testing.
Да, поведение отличается - это нехорошо. Создал багу, при перезапуске если топик был создан до старта скрипта - срабатывать не должно.
Нет, тут проще и лучше поменять само поведение. Чтобы оно было одинаковым и соответствовало документации.
А то довольно неожиданно что при запуске/перезапуске сервиса срабатывает а при сохранении скрипта - нет.
От разработчиков:
*Функция должна срабатывать для retain топиков и при сохранении каждого правила, и при рестарте.
Сейчас есть баг, так как подписка шерится между скриптами.
*
То есть - да, поправят.
Добрый день. Так я Вам и приводил скриншот с Гита. Но у меня возникли вопросы, может тогда дополнить описание, раз это не задокументировано в хелпе? Конкретно три моих вопроса:
Получит ли пользователь значение топика (хотя бы один раз) при создании подписки trackMqtt, если он уже содержит значение (был опубликован ранее)
Получит ли пользователь срабатывание подписки trackMqtt если подписка на срабатывание одного и того же топика происходит в двух разных файлах JS, которые не связанны между собой.
Получит ли он срабатывание как в пункте 2. при старте/перезагрузке контролера.
P.S. Для себя я вопрос решил, но в документации на Гите не раскрыты этот вопросы
Спасибо за ответы, но просьба добавить это в описание trackMqtt на Гите и надеюсь это поведение не будет менятся, в том числе и в тестовых релизах, что ранее периодически наблюдалось.