Отваливается wb-rules

Здравствуйте.

Написал свою реализацию добавления устройств esphome в wb, но столкнулся с проблемой - через какое-то время wb-rules отваливается, в логи сыпалось что-то вроде:

MQTT token wait timeout: *mqtt.PublishToken (&{{{{0 0} 0 0 {{} 0} {{} 0}} 0xXXXXXXX <nil>} 2000})

Помогает только перезагрузка из консоли.

В топике увидел схожее поведение, обновился до testing, проблема ненадолго ушла, но снова вернулась, теперь в логи сыпет:

[wbgo_mqtt] MQTT error: not currently connected and ResumeSubs not set

На всякий прикладываю файл модуля:
ha2wb.js (44,6 КБ)
И правило:

var m = require("ha2wb");
m.ignoredEntities = [
  "restart",
  "safe_mode",
  "display_on_module",
  "force_config",
  
  "hallac/hall_ac_fan_mode",
  "hallac/hall_ac_preset_mode",
  "hallac/hall_ac_swing_mode",
  
  "boilerroomac/boilerroom_ac_fan_mode",
  "boilerroomac/boilerroom_ac_preset_mode",
  "boilerroomac/boilerroom_ac_swing_mode",
  
  "serverroomac/serverroom_ac_fan_mode",
  "serverroomac/serverroom_ac_preset_mode",
  "serverroomac/serverroom_ac_swing_mode",
];
m.init();

Диагностический архив после перезагрузки:

приложен диагностический архив, доступен только сотрудникам поддержки
(321,3 КБ)

Добрый день!
Хотел попросить вас заархивировать файл модуля – .js портал не дает открывать из вложений.
При выполнении какого конкретно фрагмента кода возникает ошибка?

Логи были забиты однотипными ошибками, не смог найти в какой момент времени и с чего начинается такое поведение. Внёс некоторые изменения в модуль, буду наблюдать дальше.
ha2wb.zip (6,2 КБ)

Спасибо! Посмотрел код модуля – серьезный объем кода! Но очень сложно выделить фрагмент, который может приводить к проблемам.

Сейчас пока всё нормально. Возможно проблема возникала из-за рестарта esphome устройств каждые 15 минут и переподключений к брокеру (из-за reboot_timeout в api секции).
То есть каждые 15 минут у каждого устройства удалялись все контролы и добавлялись заново, создавались новые коллбеки с помощью trackMqtt() и defineRule().

Кстати, можно ли удалять/переопределять правила, созданные с помощью defineRule()? Пока что реализовал так:

// Local rule map
var ruleMap = {};

// ...

var ruleId = "{}/{}".format(device.getId(), control.getId());
if (ruleMap.hasOwnProperty(ruleId)) {
  disableRule(ruleMap[ruleId]);
}

ruleMap[ruleId] = defineRule({
  // ...
});

Но эта конструкция только отключает предыдущее правило.


Если скрыть exports.abbreviations и exports.converters, то объем резко сократится)

Отлично!
Удалять правила в рантайме возможности нет, но есть возможность включать/отключать через disableRule(id), enableRule(id) где id = defineRule(). Переопределение правил по имени не работает: надо создать новое, отключив старое. Движок не связывает имя с уже созданным правилом и не заменяет старое правило новым по совпадающему имени.
Смотрите подробнее " Управление правилами" в описании на GitHub.

Это читал. Так и реализовал, но опасаюсь повторения ситуации при увеличении количества устройств.

Если отключенные правила не удаляются, то они висят в памяти и расходуют ресурсы, верно? Возможно ли добавить функционал удаления/переопределения правил?

А сложно примерно оценить, при каком количестве созданных правил начинаются проблемы? Так-то да – правила создаются и остаются, память не освобождается, насколько я понимаю.

Добры день,
Удалось ли решить вопрос?

На testing пока работает нормально.

Нужно моделировать ситуацию. На работающей системе не готов.