Не получается управлять розеткой zigbee

Добрый день.

Не могу понять почему не срабатывает publish для управления zigbee розеткой.
Причём если отправлять команду через MQTT Explorer, то всё нормально работает.

Использую вот такой вот универсальный скрипт, который создаёт массив розеток из конфига:

log.info("Executing {}", module.filename);
var moduleName = module.filename;

defineVirtualDevice('Sockets', {
    title: 'Розетки' ,
    cells: createCells(ioMap.sockets)
});

function createCells(sockets){
  var cells = {}
  for(var propertyName in sockets) {    
    var definition = sockets[propertyName];
    log.info("Creating socket {}[{}]".format(definition.title, definition.id));
    cells[propertyName] = createSwitch(propertyName, definition);
  }
  return cells;
}

function createSwitch(propertyName, socketDefenition){
  defineRule("socket_{}_rule".format(propertyName), {
    whenChanged: "Sockets/" + propertyName,
    then: function (newValue, devName, cellName) {
      var topic = "zigbee2mqtt/" + socketDefenition.id + "/set";
      var value = JSON.stringify({ state: newValue ? "ON" : "OFF"});

      log.info("[{}] publish {} into {} [devName={}, cellName={}]", moduleName, value, topic, devName, cellName);
      publish(topic, value);      
    }
  });
  
  return {
        title: socketDefenition.title,
        type: "switch",
        value: false
      };
}

Сам конфиг розеток выглядит вот так:

global.__proto__.ioMap = {
  sockets: {
    socket1: {
      id : '0x70b3d52b6005e79d',
      title: 'I-Гостинная-Гирлянда'
    },
    socket2: {
      id: '0xa4c13887c0f4713e',
      title: 'I-Кухня-Фартук'
    },
    socket3: {
      id: '0x70b3d52b600b0bc1',
      title: '0x70b3d52b600b0bc1'
    },
    socket4: {
      id: '0xa4c1386bfd05e7b4',
      title: '0xa4c1386bfd05e7b4'
    },
    socket5: {
      id: '0xa4c138eed2e9ca2c',
      title: '0xa4c138eed2e9ca2c'
    },
    socket6: {
      id: '	0xa4c13895eaf428cd',
      title: '	0xa4c13895eaf428cd'
    },
    socket7: {
      id: '0xa4c138e0d65d9c53',
      title: '0xa4c138e0d65d9c53'
    },
    socket8: {
      id: '0xa4c1386387648c4f',
      title: 'II-Спальня-Юг-Левая'
    },
    socket9: {
      id: '	0xa4c1383acf2eaa24',
      title: 'II-Спальня-Юг-Правая'
    }
  }
....

В логе при нажатии на переключатель виртуального контрола всё нормально

12-09-2025 13:21:58.215 [wb-rules]	INFO: [rule info] [/etc/wb-rules/sockets.js] publish {"state":"ON"} into zigbee2mqtt/0x70b3d52b6005e79d/set [devName=Sockets, cellName=socket1]

Но вот дальше до устройства команда не доходит. Если строчки из логов сунуть в MQTT Explorer, то оно нормально включается/выключается.

Из странного в логах контроллера много ошибок вида:
12-09-2025 13:21:54.894 [wb-rules] ERROR: [wbgo_mqtt] MQTT token wait timeout: *mqtt.PublishToken (&{{{{0 0} 0 0 {{} 0} {{} 0}} 0xf2a140 <nil>} 11488})

Повторяются примерно раз в 10 минут.

Поменял название топика

12-09-2025 13:53:52.488	INFO: [rule info] [/etc/wb-rules/sockets.js] publish {"state":"ON"} into debug/zigbee2mqtt/0x70b3d52b6005e79d/set [devName=Sockets, cellName=socket1]

в брокере и MQTT Explorer не появляется новых топиков, т.е. явно проблема с самой публикации топика в брокер.

Добрый день!
Давайте разбираться. Какой версии контроллер у вас? Какой релиз ПО?

Вот сразу броились в глаза лишние пробелы/табуляции в конфиге у id розеток 6 и 9.
Давайте пока пойдем путем сравнения случаев, когда все работает и когда – нет.
В отдельном терминале подпишитесь на топик mosquitto_sub -v -t 'zigbee2mqtt/#'
И отправьте “работающую” и “неработающую” команды. Чем будет отличаться результат?

В общем я ещё поэкспериментировал.
Проблема действительно в том, что у меня в id затесались лишние символы, но только это не пробел, а символ табуляции.

При отправке сообщения в такой топик происходит разрыв соединения с mqtt-брокером
image

И у меня сообщения в эти топики отправялись периодически в другом скрипте.

После какого-то количества таких отправок движку правил плохеет и он начинает выдавать ошибки
image

После этого ни одна публикация (даже в правильные топики) сообщений уже не проходит

Да, смотрю, это известная разработчикам ошибка, она исправлена в баг-фиксе, есть решение, описанное тут:
выполните

echo "deb http://deb.wirenboard.com/all experimental.rules-token-wait-timeout main" > /etc/apt/sources.list.d/rules.list
apt update; apt upgrade

Ну на testing не хочется переходить – после исправления топиков проблема само по себе не возникала пока.

Тем более, что по ссылке проблема вообще а другом – там судя по всему проблема в слишком плотном потоке событий и медленных (больших) скриптах.

Тут интересно, что Коннект падает из-за табуляции, хотя по стандарту mqtt табуляция вроде как разрешенный символ для топика.

Отлично, работает, таким образом, без табуляций.

В спеке – посмотрел – прямо капсом пишут, что “The data SHOULD NOT include encodings of the Unicode code points listed below. If a receiver (Server or Client) receives a Control Packet containing any of them it MAY close the Network Connection: U+0001..U+001F control characters...”, табуляция (0x09) в этот диапазон попадает как раз. “Data” – имена топиков кодируются в UTF.

Да, согласен табуляция не входит в разрешённые.

Может закинуть разработчикам идею на валидацию параметров для publish? Если бы код кинул внятную ошибку, то проще было бы диагностировать.

Согласен, да – внятное сообщение об ошибке сэкономило бы время в этом случае, а так ошибка до верха доходит в очень непонятном виде.
Спасибо! Передам идею нашим разработчикам.