WB rules, модули и defineVirtualDevice - странное поведение

модуль лежит в /etc/wb-rules-modules/:

var Test = function (opts){
    opts = opts || {};
    this.status = opts.status || false;
    this.title = opts.title || 'Title';
    this.deviceName = opts.deviceName || 'Device';
};

Test.prototype.start = function () {
    var _self = this;
    var cells = {
        enabled: {
            title: "Статус",
            type: "switch",
            value: this.status,
        },
    };

    defineVirtualDevice(_self.deviceName, {
        title: _self.title,
        cells: cells,
    });
}

exports.Test = Test;

Правило (TestModule.js):

var t = require("Test");

var config = [
    {
        status: false,
        title: "Тест модуля 1",
        deviceName: "testM1",
    },
    {
        status: true,
        title: "Тест модуля 2",
        deviceName: "testM2",
    },
];

for (var i in config) {
    var tDevice = new t.Test(config[i]);
    tDevice.start();
}

При сохранении правила появляюся два виртуальных устройства:

Но после обновления страницы браузера они пропадают:

Точнее остается пустое одно устройство вместо двух.

Если зайти в правило и пересохранить то появляются оба устройства, но только до обновления страницы.

С правилами без модулей такого поведения не замечаю.
То есть если в самом правиле написать

defineVirtualDevice('devTest_1', {
    title: "Device Тест 1",
    cells: {
        State: {
            type: "switch",
            title: "Работа",
            value: false,
            order: 1,
        }
    }
});

и не подключать из модуля то проблем нет.

Подскажите куда копать?

Все остальные правила закомментированы, то есть не влияют на текущий тест.
diag_output_AWJY4GZR_2024-02-09-16.39.34.zip (173,4 КБ)

Добрый день.
Попробовал воспроизвести, не получилось.
То есть при вызове .start - устойчиво выполняется создание топиков, что видно:

mosquitto_sub -v -t /devices/testM1/# -t /devices/testM2/#                               
/devices/testM1/meta/name Тест модуля 1
/devices/testM1/meta/driver wb-rules
/devices/testM1/controls/enabled 0
/devices/testM1/controls/enabled/meta {"order":1,"readonly":false,"title":{"en":"statusTitle"},"type":"switch"}
/devices/testM1/controls/enabled/meta/type switch
/devices/testM1/controls/enabled/meta/order 1
/devices/testM1/controls/enabled/meta/readonly 0
/devices/testM2/meta/driver wb-rules
/devices/testM2/meta/name Тест модуля 2
/devices/testM2/controls/enabled 0
/devices/testM2/controls/enabled/meta {"order":1,"readonly":false,"title":{"en":"statusTitle"},"type":"switch"}
/devices/testM2/controls/enabled/meta/order 1
/devices/testM2/controls/enabled/meta/readonly 0
/devices/testM2/controls/enabled/meta/type switch
/devices/testM1/controls/enabled/on 1
/devices/testM1/controls/enabled 1
/devices/testM2/controls/enabled/on 1
/devices/testM2/controls/enabled 1

Ну и перезагрузка на них никак не влияет.

Перепроверил еще раз. Добился стабильного повторения.

  1. Удалил все правила.

  2. Добавил модуль Test.js

  3. Добавил 1 правило TestRule.js (создание 40 устройств).

  4. Перехожу на вкладку устройства - все 40 штук на месте:

  5. Обновляю страницу в браузере (только 19 устройств отображаются):

  6. При сохранении правила смотрю 20-е устройство
    mosquitto_sub -v -t /devices/devTest_20/#

/devices/devTest_20/controls/enabled (null)
/devices/devTest_20/controls/enabled/meta/type (null)
/devices/devTest_20/controls/enabled/meta/order (null)
/devices/devTest_20/controls/enabled/meta/readonly (null)
/devices/devTest_20/controls/enabled/meta (null)
/devices/devTest_20/meta/name (null)
/devices/devTest_20/meta/driver (null)
/devices/devTest_20/meta/name Устройство из модуля Тест 20
/devices/devTest_20/meta/driver wb-rules
/devices/devTest_20/controls/enabled/meta/type switch
/devices/devTest_20/controls/enabled/meta/order 1
/devices/devTest_20/controls/enabled/meta/readonly 0
/devices/devTest_20/controls/enabled/meta {"order":1,"readonly":false,"title":{"en":"Статус"},"type":"switch"}
/devices/devTest_20/controls/enabled 0
  1. пробую послать в 20-е устройство
    mosquitto_pub -t "/devices/devTest_20/controls/enabled/on" -m "1"

  2. Вижу что топик существует и работает

  3. На странице Каналы MQTT только 19 устройств из 40 отображаются:

Могу предположить что проблема где то между mqtt и web мордой.

Файлы модуля и теста:

Модуль Test.js:

var Test = function (opts){
    opts = opts || {};
    this.status = opts.status || false;
    this.title = opts.title || 'Title';
    this.deviceName = opts.deviceName || 'Device';
};

Test.prototype.start = function () {
    var _self = this;
    var cells = {
        enabled: {
            title: "Статус",
            type: "switch",
            value: this.status,
        },
    };

    defineVirtualDevice(_self.deviceName, {
        title: _self.title,
        cells: cells,
    });
}

exports.Test = Test;

Правило TestRule.js:

var t = require("Test");
var config = [];

for (var i=0; i<40; i++) {
  config.push({
    status: false,
    title: "Устройство из модуля Тест {}".format(i),
    deviceName: "devTest_{}".format(i),
  });
}

for (var i in config) {
    var tDevice = new t.Test(config[i]);
    tDevice.start();
}

проверил без модулей. Просто правило:

 for (var i=0; i<40; i++) {
    defineVirtualDevice("devTest_{}".format(i), {
        title: "Устройство из модуля Тест {}".format(i),
        cells: {
        enabled: {
            title: "Статус",
            type: "switch",
            value: false,
        },
    },
    });
  }

поведение аналогичное выше описанной проблеме (остается 19 устроойств).

Но если сделать так:

 for (var i=0; i<40; i++) {
    defineVirtualDevice("devTest_{}".format(i), {
        title: "Устройство из модуля Тест {}".format(i),
        cells: {
        enabled: {
            title: "Статус",
            type: "switch",
            value: false,
        },
          enabled2: {
            title: "Статус",
            type: "switch",
            value: false,
        },
          enabled3: {
            title: "Статус",
            type: "switch",
            value: true,
        },
    },
    });
  }

То после обновления страницы остается 8 с половиной устройств.:

А что пишет null в топики, причем во все?
Интерфейс не будет выводить те, для которых не определен type, например.

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

Нет.
Я остановил wb-rules, почистил топики и запускаю снова.
Вижу:

/devices/testM1/meta/name Тест модуля 1
/devices/testM1/meta/driver wb-rules
/devices/testM1/controls/enabled/meta/order 1
/devices/testM1/controls/enabled/meta/readonly 0
/devices/testM1/controls/enabled/meta/type switch
/devices/testM1/controls/enabled/meta {"order":1,"readonly":false,"title":{"en":"statusTitle"},"type":"switch"}
/devices/testM1/controls/enabled 1
/devices/testM2/meta/name Тест модуля 2
/devices/testM2/meta/driver wb-rules
/devices/testM2/controls/enabled/meta/type switch
/devices/testM2/controls/enabled/meta/order 1
/devices/testM2/controls/enabled/meta/readonly 0
/devices/testM2/controls/enabled/meta {"order":1,"readonly":false,"title":{"en":"statusTitle"},"type":"switch"}
/devices/testM2/controls/enabled 1

И да, при удалении - пишутся null
В общем - не воспроизводится пока. Использую Chrome 121.0.6167.160

проверил в Chrome Версия 121.0.6167.85 - проблема воспроизводиться.
в яндекс браузер 24.1.1.858 (64-bit) - тоже.

Похоже я нашел корень проблемы.

У меня настроен мост:

connection bridge1
#address of server
address 192.168.11.210
notifications true
notification_topic /clientnotification/bridge1_status
remote_username XXX
remote_password YYY
clientid WB7
start_type automatic
max_queued_messages 1000
topic /# out 0 /devices /controllers

и он влиял на отображение устройств:

max_queued_messages 1000 - этот параметр.

Если задать его в 10000 - то проблема решается (точнее кол-во отображаемых устройств увеличивается).

P.S. вот только не пойму как оно влияет. Стоит ‘out’ а не ‘both’.

Если бы ‘both’ то можно было бы предположить что второй брокер влияет. Но с out мы же только отправляем сообщения в одну сторону.

Так, попробую воспроизвести.

Ну да, это же просто размер локальной очереди для отправки, судя по документации.

Да, неожиданно.

Получилось воспроизвести?

Пока нет. Я сделал мост с брокером на виртуалке, пока работает.

Практически такая-же картинка. Тоже создан мост.
при max_queued_messages 20 в интерфейсе даже системные устройства перестают отображаться. И на тестинге и на последнем стабильном релизе. Но, если после этого редактировать настройку драйвера serial-устройств, то устройства, которые прописаны в конфигурации сериал устройств появляются, а вот системные и созданные через правила - нет.
max_queued_messages 1000 решает проблему, но у меня не там много устройств.

1 лайк

Суммарное количество топиков для одного контрола - 7 штук. Да, неудивительно и ожидаемо.