0
Beantwoord

MQTT driver не обновляет значения после открытия i3 pro

Александр Бондарь 8 jaar geleden in Products / Other drivers bijgewerkt door Aleksandr Romanov (CTO) 6 jaar geleden 20

i3 pro на iOS не обновляет данные от mqtt драйвера при запуске.


Например, i3 pro запущен. Включаем свет. MQTT драйвер возвращает значение ON. Выключаем свет. MQTT драйвер возвращает значение OFF. Закрываем или сворачиваем приложение i3 pro. Запускаем снова приложение и видим значение ON, хотя свет все так же выключен.


Возможно ли заставить драйвер принудительно обновлять значения с брокера при открытии i3 pro?

Waiting for user's reply

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


Уточните пожалуйста каким устройством вы управляете, какое устройство используете в качестве панели управления и не могли бы вы прислать ваш проект на нашу почту support@iridiummobile.ru ?

Я пока не пытаюсь управлять устройствами по средствам MQTT, я пытаюсь получить актуальные данные с MQTT брокера.

Особой разницы с какого устройства эти данные я думаю нет, т.к. непосредственного общения i3 pro с устройством нет, все идет через MQTT брокер. В данном же случае это самоделка на esp8266.

Панель - iphone6 iOS 9.3.2. i3 pro обновлен до последнего доступного в appstore.

Проект не под рукой, скину вечером. Надо ли сделать какую-то пометку в письме для идентификации?

Можете просто продублировать тему как здесь на форуме.

Отправил на support@iridiummobile.ru еще 1 августа.

До сих пор тишина.

Здравствуйте! А мне сообщите, пожалуйста, как обновить состояние топиков при запуске. Я пытаюсь iRidium Server подключиться к MQTT брокеру. Как при запуске "попросить" иридия актуализировать состояния фидбэков пока не пойму.. Я ведь правильно понимаю, что все сущности, которым я по MQTT даю команды или на которые подписываюсь, могут быть только фидбэками или командами? Со скрипта я могу отправить топик, подписаться/отписаться? Тогда наверное и не было бы вопроса..

Добрый день.

В терминологии Иридиум значения топиков это значения фидбэков. Скриптом получить значение фидбэка можно через GetFeedback(). Отправить команду в драйвер (в данном случае отправить что-то в топик) можно через Set(). Документация по драйверу MQTT тут.

Добрый, ссылка у вас не прикрепилась, но, думаю, я её смотрел. 
А как топик прописать произвольно в скрипте? Set, это ведь предустановленная команда, а когда на каждый девайс или порт свой топик, каждый прописать, это ведь значит, на каждый получить фидбэк, так ведь? Напомню, речь идет о иридий сервере. Потом для общения с панелью, как я понимаю, мне надо создать еще виртуальные фидбэки, которые будут уже панелью подтягиваться и расставляться на контроллы. Получается и громоздко и дорого. Или я что-то упускаю?

Ну и опять же, тут, в этой теме) вопрос был про обновление во время старта. 
"Возможно ли заставить драйвер принудительно обновлять значения с брокера при открытии i3 pro?"
просто я не понимаю пока как построить работу с MQTT брокером, если не могу даже произвольно из скрипта команду отправить и произвольным топиком. Ну и может есть команды для актуализации состояний, чтобы я не сам руками прописывал реакцию на свою команду в контроллере (не всегда туда может быть доступ) и вводил еще command в иридий, а как-то нативно оп, обновил - актуализировал.

Можно без скриптов сделать:

1) Добавить драйвер MQTT в студии.

2) Прописать топики и прочие параметры в каналах и фидбэках.

3) Создать графические элементы.

4) Перетянуть фидбэки на нужные графические элементы.

Итог: при старте i3 pro вы получите значения топиков.

Ссылка на документацию по драйверу MQTT.

Set() отправляет команду в нативный драйвер (MQTT в Иридиум - нативный).

Топик нужно прописать в канале и/или фидбэке. Скриптом его указать нельзя. В скрипте указывайте канал драйвера с предварительно прописанным топиком.

Вы правы, условно одно устройство это один топик, если не используются регулярные выражения.

Фидбэк в драйвере MQTT нужен только для получения значения топика. GetFeedback(), если через скрипт.

Громоздкости тут не более, чем в любом другом драйвере.

Ок, а обновить то как? Есть возможность в нативном драйвере MQTT в Иридии? Запустил я сервер, например, он должен пройтись по всем топикам, собрать значения. Но MQTT ведь штука событийная, я представляю как накостылить это решение, но точно тогда нужен доступ к устройству, которые подключаю к Иридию, программировать туда ответ состоянием на мою новую команду. Вот я и предположил, что в брокере могут быть свои средства обновления и быть может свои команды на это. А у иридий драйвера MQTT соотв. свои средства для работы с этим. 
Итак, как обновить состояние MQTT устройств при стартовой, например, инициализации iRServer?

У вас есть проект, в котором что-то работает не так, как вы ожидаете?

Если это просто теоретические рассуждения, то MQTT работает через подписку/публикацию. В контексте Иридиум:

1) Вы указываете в фидбэке топик. Это означает подписку на него.

2) При старте проекта (неважно - серверный или панельный) драйвер обращается к брокеру и если есть что-то в подписанных топиках - получает.

3) Если что-то в ходе работы приходит в подписанные топики - драйвер получает новые значения.

4) Соответственно, команда в канале это издатель (публикация в топик).

Конечно есть. только может мои ожидания не соотв. реалиям)
Все очень просто. Вот только что попробовал. 
Рестарт сервера, на нем же и брокер. Пока идет рестарт, данные меняются. Запускается свервер, запускается брокер. Что мы видим? Текущее состояние - как бы не так. Ничего мы не видим. Вот и интересуюсь, можно ли обновить.

Если брокер рестартует, то данные меняться не могут (брокер ещё не работает). В вашем случае подключитесь сторонним MQTT клиентом к брокеру и сравните значение в топике с тем, что показывает Иридиум. Если они отличаются, то нужно разбираться в причине.

Итак, я правильно понял, что у брокера и  иридия нет возможности по команде получить текущее состояние топиков, на которые осуществлена подписка? Конечно будут отличаться. И получается, что иридий сервер не будет корректно обрабатывать алгоритмы, т.к. данных не будет, а появятся они только при изменении. Ну включил кто-то свет пока сервер ребутился и все, сбой, накладка. 
А надо всего-то, чтобы по моей команде пришел пакет с состояниями всех топиков, тока престарт пройдет успешно, инициализация произведется. Ведь если я буду читать GetFeedback, то увижу только лишь то, что сейчас в иридии, а не то, что должно быть, не текущее состояние устройства, данные там появятся только при изменении. И дело даже не в сбоях, а вообще в первом старте, когда стоят несколько контроллеров и т.д. 
Вообще получается интересная вещь. MQTT - событийная штука -хорошо, но как получить состояние, пока не произошло изменений за сессию работы брокера - не понятно. И я понимаю, что так не может быть, т.к. никакой девайс по MQTT не подключишь без этого. 

Если значение "свет включен" не пришло в брокер, то подписчики не узнают о статусе. Это больше вопрос отказоустойчивости и доступности брокера. Драйвер MQTT в Иридиум не содержит брокера, это клиент.

Драйвер MQTT читает текущее состояние брокера, а не состояние издателей. Подписчики и издатели не должны знать друг о друге, это забота брокера.

это я понимаю, спасибо, что отвечаете мне так оперативно. Но также я понимаю, что для работы клиента и брокера в нашем контексте не достаточно одних только событий об изменении. Как тогда происходит инициализация? Может я чекго-то не знаю, может есть у брокеров какие-то инструменты, может они даже и где-то задокумментированы, что, например, при подключении клиента к брокеру он шлет в клиент все топики. Я этого не вижу, значит, возможно, есть какой-то способ клиенту отправить запрос брокеру и брокер опросит топики и пришлет их клиенту.. Тогда это дело клиента иметь такой функционал. Я не знаю как это сделать, но понимаю, что без этого, без считывания текущего состояния, не возможна работа системы автоматики. 
Что происходит в модбас - циклический опрос. Опрос всего и вся. Т.о. влкючаем и получаем состояние. А тут тогда как?

Неплохая статья по MQTT. В конце есть список литературы, если нужно больше подробностей.

Брокер анализирует, кто из подключившихся клиентов подписан на определенные темы и шлёт сообщения только по их подпискам. Если никто не подключен и/или не подписан - не шлёт ничего. Протокол работает поверх TCP, поэтому подключение/отключение отслеживается.