Не формируется /meta/error/

Здраствуйте, не формируется подтопик /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 брокера невозможно.

Итак подробнее:

  1. Топик “температура” с вашего wb-msw-v3 (или любой другой с modbus устройства)
  2. Версия wb-mqtt-serial: 2.7.1
  3. Лог подписки при потере и восстановлении связи:

mosquitto_sub -t ‘/devices/wb-msw-v3_217/controls/Temperature/#’ -v
/devices/wb-msw-v3_217/controls/Temperature/meta/order 1
/devices/wb-msw-v3_217/controls/Temperature/meta/readonly 1
/devices/wb-msw-v3_217/controls/Temperature/meta/type temperature
/devices/wb-msw-v3_217/controls/Temperature 27.1
/devices/wb-msw-v3_217/controls/Temperature/meta/error r
/devices/wb-msw-v3_217/controls/Temperature/meta/error r
/devices/wb-msw-v3_217/controls/Temperature/meta/error (null)
/devices/wb-msw-v3_217/controls/Temperature 27.2
/devices/wb-msw-v3_217/controls/Temperature/meta/error (null)
/devices/wb-msw-v3_217/controls/Temperature 27.2

здесь видно появление топика meta/error/ со значениями r и null (неясно почему по два раза).
Далее при перезапуске подписки:

mosquitto_sub -t ‘/devices/wb-msw-v3_217/controls/Temperature/#’ -v
/devices/wb-msw-v3_217/controls/Temperature/meta/order 1
/devices/wb-msw-v3_217/controls/Temperature/meta/readonly 1
/devices/wb-msw-v3_217/controls/Temperature/meta/type temperature
/devices/wb-msw-v3_217/controls/Temperature 27.2

выходят только retain данные, meta/error среди них нет.

Сейчас объясню зачем все это надо, и почему я не могу принимать решение о наличии связи по отсутствию топика meta/error:
Для frontend я использую home assistant, через мост к его mosquitto брокеру передаются mqtt данные. Далее в HA описываются объекты на основе mqtt топиков, в том числе определяется доступность объекта, выглядит это так:

availability:
topic: “/devices/wb-msw-v3_217/controls/Temperature/meta/error”
payload_available: “”
payload_not_available: “r”

Эта конструкция работает только в том случае, если после запуска HA (т.е. после активации подписки) оборвать связь и восстановить.
Теоретически можно создать виртуальные устройства в WB с топиками, описывающими состояние связи как нужно HA, но имхо это избыточно и усложняет в дальнейшем добавление устройств.

А насколько оправдано использование null - оно по факту уничтожает топик, и к нему нет доступа… Хотя бы банально “ок” или “no”.
Сколько работал с различными шлюзовыми устройствами - теги здоровья обмена всегда имеют значение, в простейшем случае единица - есть обмен, ноль - нет обмена.

Подскажите - удалось ли вам решить проблему получения статуса устройства для Home Assistant? Столкнулась с аналогичной задачей - нужно получить статус девайса в Home Assistant для проброса его в Home Kit. Но похоже, что HA не понимает пустые топики error в шаблоне payload_available. Можно ли это обойти настройками? Или придётся писать правила свои в WB? Пока вот такой вариант заработал:

# Димируемое освещение через мосфет
- platform: mqtt
  name: "Мосфет димер"
  state_topic: "/devices/wb-mdm3_56/controls/K3"
  command_topic: "/devices/wb-mdm3_56/controls/K3/on"
  brightness_state_topic: "/devices/wb-mdm3_56/controls/Channel 3"
  brightness_command_topic: "/devices/wb-mdm3_56/controls/Channel 3/on"
  brightness_scale: 100
  availability:
    - topic: "/devices/wb-mdm3_56/controls/Serial/meta/availability"
  payload_available: "online"
  payload_not_available: "offline"
  #availability_mode: latest
  qos: 1
  payload_on: "1"
  payload_off: "0"
  optimistic: false

И скрипт добавляет параллельный топик availability со значением online|offline:


trackMqtt("/devices/+/controls/+/meta/error", function(message){
  t = message.topic;
  v = message.value
  availability_topic = message.topic.replace('/error', '/availability');
  availability_value = "online";
  
  if (v == "r")
  {
    availability_value = "offline";
  }
  
  log.info("topic: {}".format(t));
  log.info("value: {}".format(v));
  log.info("availability_topic: {}".format(availability_topic));
    
  var command = 'mosquitto_pub -t "{}" -m "{}"'.format(availability_topic, availability_value);

  log.info("command: {}".format(command));
 
  runShellCommand(command);
});

После перерыва вернулся к вопросу, что в итоге получилось:

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);
  }   
});

Минус такого правила: не отслеживается дребезг связи, для этого нужно заводить массив таймеров, отслеживать их сработку и т.д.

1 лайк

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.