Здраствуйте, не формируется подтопик /meta/error/ в случае, если соответствующий контрол на связи. Если связь прервать, он появляется со значением ‘r’, далее при восстановлении связи ‘null’ - вроде как все нормально. Но в дальнейшем при перезапуске подписки этот null увидеть уже нельзя, такое впечатление что флажок ‘retained’ сняли с /meta/error/…
Текущая версия прошивки одна из последних - 202103170759, насколько могу вспомнить ранее такой проблемы не было.
если это топик какого-то Modbus устройства, то покажите версию wb-mqtt-serial: dpkg -s wb-mqtt-serial
очень желательно проиллюстрировать всё выводом команд mosquitto_sub/mosquitto_pub в консоли
Вообще null (пустое сообщение) с флагом retain просто удаляет retain для топика в брокере. Насколько я понимаю, это определяется самим стандартом MQTT. Т.е. получить пустое retained значение от MQTT брокера невозможно.
выходят только retain данные, meta/error среди них нет.
Сейчас объясню зачем все это надо, и почему я не могу принимать решение о наличии связи по отсутствию топика meta/error:
Для frontend я использую home assistant, через мост к его mosquitto брокеру передаются mqtt данные. Далее в HA описываются объекты на основе mqtt топиков, в том числе определяется доступность объекта, выглядит это так:
Эта конструкция работает только в том случае, если после запуска HA (т.е. после активации подписки) оборвать связь и восстановить.
Теоретически можно создать виртуальные устройства в WB с топиками, описывающими состояние связи как нужно HA, но имхо это избыточно и усложняет в дальнейшем добавление устройств.
А насколько оправдано использование null - оно по факту уничтожает топик, и к нему нет доступа… Хотя бы банально “ок” или “no”.
Сколько работал с различными шлюзовыми устройствами - теги здоровья обмена всегда имеют значение, в простейшем случае единица - есть обмен, ноль - нет обмена.
Подскажите - удалось ли вам решить проблему получения статуса устройства для Home Assistant? Столкнулась с аналогичной задачей - нужно получить статус девайса в Home Assistant для проброса его в Home Kit. Но похоже, что HA не понимает пустые топики error в шаблоне payload_available. Можно ли это обойти настройками? Или придётся писать правила свои в WB? Пока вот такой вариант заработал:
После перерыва вернулся к вопросу, что в итоге получилось:
trackMqtt("/devices/+/controls/+/meta/error", function(message){
t = message.topic;
t_metafree = t.substring(0, t.indexOf('/meta')); //отрезаем meta от основного топика
availability_topic = "{}/availability".format(t_metafree); //создаем отдельный топик для HA
if (message.value != "") {
publish(availability_topic, "offline", 2, true);
}
else {
publish(availability_topic, "online", 2, true);
}
});
Минус такого правила: не отслеживается дребезг связи, для этого нужно заводить массив таймеров, отслеживать их сработку и т.д.