Первичная инициализация через MQTT

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

Продолжая знакомство с WB, с концепцией MQTT я сделал несколько выводов и зашел в тупик. Поправьте меня, если я где-то не прав.

  1. Внешние связи с WB лучше производить через MQTT. (если речь идет о программных продуктах) Городить TCP не очень хороший вариант, т.к. для WB MQTT первично, и какие-то процессы внутри него завязаны на MQTT.
  2. MQTT - событийная система, для домашней автоматизации - то, что надо, не забивает траффик, более устойивая, чем то т же modbus. Опять же, в указанном контексте применения.
  3. Тупик: Как тогда производить начальную инициализацию состояния контроллов WB со внешнего устройства? Ведь в брокер приходит информация только об изменених, точнее, WB отправляет информацию брокеру при изменении контролла. А как тогда организуется процесс получения текущего состояния, ведь как такового изменения не происходит?

Я, честно говоря, пока не знаю специфику Wiren Board, но в самом MQTT есть прекрасная для этого возможность – persistent messages. Если отправлять сообщения с флагом persistent, то сервер его помнит и при подключении нового клиента отправит ему разом все такие сообщения, которые попадают под маску подписки. Для хранения состояний это то, что надо.

Смотрите, как все работает: есть “драйвера”, то есть службы, которые поставляют события в MQTT_очередь. MQTT-serial опрашивает сконфигурированные устройства достаточно часто поэтому их состояние отражается в MQTT. Движок правил и Web-интерфейс имеют доступ к текущему, с точки зрения mqtt, состоянию.
То есть, когда wb-mqtt-serial запускается, он наполняет очередь сообщениями о текущем состоянии регистров устройства, и в дальнейшем актуализирует его по мере изменения.

Так, если я правильно понял, то клиент MQTT в WB часто опрашивает устройства, и сохраняет где-то у себя в MQTT-очередь.
Но это не то же самое, что и отправка этих данных по запросу. Что WB “видит” текущее положение дел, это понятно. Но как со стороны через MQTT, раз уж он является “окном” во вне, получить эту очередь, ведь клиент отправляет топик только по его изменению. Я чувствую, что повторяюсь, но стараюсь донести суть вопроса. Я не понимаю, как можно извне “попросить” выдать текущее состояние, которое, как выяснилось, знает WB.
Попробую предположить, что упоминание движка правил может быть путем решения. Я уже видел в логах, что да, текущее значение я могу получить в любой момент. Но еще раз. Я не понимаю, как это текущее значение получить через MQTT стороннему по отношению к WB устройству, например, мобильному интерфейсу.

Получается, можно забить очередь сообщениями, и как-то их запомнить. Допустим, при подключении клиента, брокер выдаст не все их пачкой (1-0-1-0-1), а последний. Даже пусть так. Но я рассматриваю простой случай. Ребут компьютера, на котором установлен брокер. Пока ребутится идут сообщения. Куда? - да в никуда, нет брокера. Потом брокер появляется, получает сообщения с какими угодно знаменами и никто не в курсе что там до этого было, а главное - что есть сейчас. Либо просто первый запуск, инициализация. Как со стороны понять в каком состоянии находятся входы-выходы WB, чтобы использовать подходящие алгоритмы сторонним приложением? Опять тем же интерфейсом. Я понимаю, что не может так быть, чтобы этот вопрос не был решен. Он очевиден в контексте использования WB в системах домашней автоматизации, просто хотел узнать, как это делается без костылей с TCP(HTTP) и прочего.

Смотрите, когда клиент впервые после загрузки подключается к брокеру на контроллере, он получает список retained-сообщений, В нашем случае, в них фигурируют последние состояния устройств, которые контроллер получил, опросив эти устройства по Modbus.
При определении состояний устройств в этом случае ваша программа на мобильно клиенте полагается на данные, которые ему предоставляет Mosquitto. Это удобно и не требует самостоятельно опрашивать все устройства на физической шине. Но вы полагаетесь на то, что устройства опрашиваются демоном, и он адекватно передает их состояния в топики.
Посмотрите на состояние устройства, запустив mosquitto_sub — вы с очень высокой долей вероятности определите текущее состояние устройства.
Альтернатива — опрашивать устройства самому. Вы можете написать программу, которая заменит wb-mqtt-serial.

Это понятно, но мне важна ситуация, когда брокер не работал, а сообщения шли. С любым флагом, они ведь просто потеряются, так ведь?
В общем, я придумал костыль, если реализую, и кому-то будет интересно, расскажу.
Смысл в том, что я создаю вирт. девайс с самосбрасываемым топиком. В ответ на него клиент отправил в брокер состояние всех интересующих меня топиков.
Пока для проверки мне надо раскрыть другие вопросы, я топик создал. Спасибо!