• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Очередной MQTT-клиент для android в виде приборной панели списком

dao89

New member
Еще одна пожелалка из области удобства интерфейса: очень не лишним будет возможность переключаться между tab'ами пролистыванием влево\вправо (так же, как пролистываются страницы на главном экране телефонов). Даже если не будет соответствующей анимации - это всё равно будет удобнее, чем жать на названия tab'ов снизу...
P.S. Установил приложение на телефон подруги, импорт настроек работает. Ещё одну оценку в маркете поставил :)
 
Последнее редактирование:

ravend

Member
Ещё вопрос. Кажется, что сообщения от виджета Slider отправляются с флагом retain, т.е. они хранятся на брокере, это было сделано специально? Может тогда сделать соответствующую галку в настройках виджета, позволяющую указать нужен retain или нет?
P.S. Похоже это относится ко всем виджетам, не только ко Slider
Добрый день!
С признаком "retained=да" работают два виджета, это switch и slider. У Кнопки есть возможность выбрать retained в настройках виджета.
Как должен вести себя виджет slider (и switch) не имея данных на брокере для топика к которому подключен, т.е. без признака retained?
Начальное состояние (в какой позиции) определить будет невозможно. Поэтому считаю, что для этих двух виджетов нет никакого смысла работать без признака retained. Это всего лишь моё мнение, пожалуйста опишите сценарий, при котором это не так.

Кстати, сегодня вышло обновление - теперь можно перемещать виджеты между вкладками, также переработан механизм подключения к серверу, теперь "ненужные" реконьекты отсутствуют.
 

dao89

New member
Добрый день!
С признаком "retained=да" работают два виджета, это switch и slider. У Кнопки есть возможность выбрать retained в настройках виджета.
Как должен вести себя виджет slider (и switch) не имея данных на брокере для топика к которому подключен, т.е. без признака retained?
Начальное состояние (в какой позиции) определить будет невозможно. Поэтому считаю, что для этих двух виджетов нет никакого смысла работать без признака retained. Это всего лишь моё мнение, пожалуйста опишите сценарий, при котором это не так.
Я вас понял, это логично. Хотя считаю, что давать возможность выбора (если это не отнимает много времени на реализацию) - будет не лишним. Но не настаиваю: для этих двух виджетов, действительно, логично хранить состояние на брокере.
Кстати, сегодня вышло обновление - теперь можно перемещать виджеты между вкладками, также переработан механизм подключения к серверу, теперь "ненужные" реконьекты отсутствуют.
Перемещение виджетов работает, спасибо. Механизм отложенного отключения от брокера пока ещё не реализован? Сейчас, когда я захожу, к примеру, в настройки "Tabs" и возвращаюсь обратно, значок MQTT становится красным, через секунду - зеленым, т.е. программа переподключается к брокеру. Тоже самое происходит если переключиться на другую программу, а потом снова открыть вашу. Вроде бы это и не страшно, но было бы лучше, если программа отключалась через какое-то время после того. как пользователь переключился на другое приложение или заблокировал телефон.

Из пожелалок (повторюсь):
1. Хотелось бы иметь возможность переключаться между вкладками пролистыванием.
2. Для виджета Value сделать возможность указать какой значок будет добавлен к отображаемому значению (например, % для влажности и т.п.)
3. В виджете Meter хранить выбор варианта отображения значения (не выводится, показывается процент или отображается абсолютное значение), так же как сейчас, только чтобы запоминалось.

И ещё... у меня для управления люстрами используются похоже команды (1, 2, 3, выкл и т.д. \ пример на скриншоте)... и они в итоге занимают очень много места на странице. Может у вас есть мысли как более лаконично это можно разместить? Может, можно разместить несколько маленьких кнопок в одной строчке?

P.S. Спасибо за обновление! Заплатил за возможность не смотреть рекламу :)
 

Вложения

ravend

Member
Механизм отложенного отключения от брокера пока ещё не реализован?
Реализован, но время установлено в 1 секунду, т.е. если Вы не смотрите на панель с виджетами более одной секунды (перешли на редактирование закладок например, свернули приложение и т.д.), то приложение переходит в режим фоновой работы (если стоит галка работать в фоне, и топик для пуш уведомлений заполнен то подписка только на этот топик, иначе просто дисконьект). Так сделано, чтобы сэкономить трафик и заряд аккумулятора, ведь данные по подпискам будут продолжать приходить, конечно в большинстве случаев, это единицы или десятки топиков, по которым данные приходят, скажем, не чаще чем раз в минуту. Но может быть и такое, что данные, оборудование обновляет в топиках очень часто и в больших количествах... Я подумаю, скорей всего в настройках соединения будет новый параметр - как быстро переходить в фоновый режим.
Другие Ваши пожелания, увидел.
более лаконично это можно разместить?
На данный момент, предложить ничего не могу, но я работаю над этим, есть несколько идей, озвучивать пока не буду по нескольким причинам.
Спасибо за обратную связь!
 

dao89

New member
Странное дело, стоило только убрать рекламу, как несколько раз поймал баг: переключаюсь на приложение, значок MQTT горит зеленым, но сообщения не отправляются (при изменении параметров не пропадает *). Наверное есть какие-то шероховатости в новом механизме подключения к серверу. Постараюсь выявить какую-то закономерность...
Я подумаю, скорей всего в настройках соединения будет новый параметр - как быстро переходить в фоновый режим.
Было бы здорово!
 

ravend

Member
горит зеленым, но сообщения не отправляются
Попробуйте просто подождать какое то время, для эксперимента - до 1 минуты (пропадет ли звездочка около измененного параметра). Если клиент не может по каким то причинам подключиться к серверу, то происходит удвоение времени, через которое произойдет следующая попытка и т.д. (пауза может достигать двух минут максимум). На индикатор MQTT особо не надейтесь, этот статус получен не прямым путем, возможны неточности в его работе.
 

dao89

New member
@ravend пришел домой сейчас, убедился что wifi подключен, запускаю вашу программу - network горит зеленым, mqtt - красным. Пробую изменить параметр - звездочка горит и не потухает (ждал больше минуты). Думаю может что-то с брокером, но нет - запускаю тут же с телефона другую программу - она тут же подключается к брокеру и принимает сообщения. Вышел на рабочий стол, потом опять открыл программу - всё равно нет соединения. Только после того, как выгрузил ваше приложение из памяти и запустил снова, MQTT загорелось зеленым и всё заработало... Такие вот наблюдения.

P.S. Может быть вам эта информация чем-то поможет... у меня на телефоне 4Гб оперативной памяти и я за ненадобностью отключил выгрузку приложений из памяти в фоновом режиме. Т.е. ваше приложение, скорее всего, не выгружалось из памяти ещё со вчера... Это я к тому, что если бы выгрузка неиспользуемых приложений была включена, то уже ночью телефон бы выгрузил ваше приложение из памяти и сегодня оно запустилось бы "с чистого листа" и проблемы бы, я думаю, не возникло.
 
Последнее редактирование:

dao89

New member
Пока что проблема не повторялась, если опять всплывёт - дам знать.
 

dao89

New member
И всё-таки бывают проблемы с подключением: открыл сейчас приложение, mqtt горит зеленым, но по факту сообщения не принимаются и не отправляются. Заблокировал телефон, через какое-то время еще раз открыл - mqtt горел красным, через секунду зеленым, всё заработало. В общем, примерно раз в день бывают какие-то проблемы с подключением.
 

dao89

New member
И ещё столкнулся с проблемой: не могу изменить порядок виджетов: в режиме редактирования перемещаю вниз или вверх - всё ок, перехожу в Play Mode - тоже нормально, но стоит выйти на рабочий стол и опять открыть программу - виджет возвращается на старое место... Раньше вроде бы без проблем перемещал.
 

ravend

Member
И ещё столкнулся с проблемой: не могу изменить порядок виджетов: в режиме редактирования перемещаю вниз или вверх - всё ок, перехожу в Play Mode - тоже нормально, но стоит выйти на рабочий стол и опять открыть программу - виджет возвращается на старое место... Раньше вроде бы без проблем перемещал.
Да, есть такое, в следующем релизе будет исправлено, сейчас эту проблему можно обойти так, после изменения порядка зайти в редактирование любого виджета и нажать Save.
 

dao89

New member
@ravend здравствуйте!
Опишу две ситуации, в которых у меня возникает одно и тоже затруднение в использовании вашей программы. В конце описано предлагаемое решение.
Ситуация №1. На кухне подсветка под гарнитуром по-умолчанию у меня включается если кто-то находится на кухне (по датчику движения).
Датчик движения можно программно отключить (сообщения об движении всё равно будут поступать, но лента не будет загораться) и задать нужную яркость вручную.
Чтобы днём, при ярком естественном свете, при движении на кухне лента не горела зря, она отключается при определенном уровне освещения и включается, если становится темно.
Т.е. датчик движения может быть отключен как человеком, так и автоматикой. При этом отключение человеком имеет приоритет и в таком случае автоматика уже не может вама вклчить датчик движения.
Датчик движения у меня включается\или отключается путём посылки on или off в топик /set/ku/pir/state. Соответственно в вашей программе создан виджет Switch.
Если речь идёт только об ручном управлении, то всё нормально. Но когда датчик отключается автоматически (днём при ярком свете), то как сделать так, чтобы я это увидел в программе?
Можно сделать так, чтобы контроллер при автоматическом отключении датчика слал off в топик /set/ku/pir/state и в вашей программе отобразится правильное положение переключателя, но... тут есть проблема. Это сообщение тут же вернётся в контроллер и он будет "думать", что эту команду подал человек... Ведь контроллер не может понять что это сообщение было отправлено им самим, а не человеком через вашу программу...
Ситуация №2. В комнате над окном на потолочном карнизе у меня приклеена лента. Лентой можно управлять как с "крутилки" (потенцио́метром), так и путём отправки сообщения (яркости) в топик /set/za/le
В вашей программе для управления яркостью у меня создан виджет - slider. Если управлять яркостью через программу, то всё нормально.
А вот как сделать так, чтобы когда я изменил яркость "крутилкой", в вашем приложении отобразилось выставленная яркость?
Первое что приходит на ум - после того как человек закончит крутить "крутилку", отправить сообщение с яркостью в топик /set/za/le. Это сработает, в приложении отобразится текущая яркость, выставленная потенциометром.
Но проблема (в данном случае она не очень серьезная) в том, что контроллер, опять же, получит своё же сообщение и не применяя каких-нибудь программных "костылей" он не сможет понять, что это сообщение от него самого, а не от человека. И если в данной ситуации это совсем не страшно, то в первой - это проблема.

Надеюсь я доходчиво объяснил суть проблемы. Решение мне видится довольно простым. Нужно во все виджеты, предусматривающие изменения своего состояние при получении сообщения, сделать опциональную настройку с указанием топика, из которого (наряду с основным топиком), ваша программа будет брать значения для виджета.
Т.е. если сейчас у меня настроен виджет таким образом
Widget type: Switch
Name Датчик движения
Topic /set/va/pir/state
'On' value on
'Off' vslue off
То для решения описанной проблемы, нужно добавить буквально одну опцию. Называться она может к примеру
Read-only topic
В этой опции я укажу что-то вроде /mqtt-dashboard/set/var/pir/state. Возвращаясь к первой ситуации: когда на кухне станет светло, контроллер отключит датчик движения и сообщит об этом отправкой сообщения не в основной топик /set/ku/pir/state, а в /dashboard/set/var/pir/state. Ваша программа получит сообщение и изменит значение виджета, а вот сам контроллер это сообщение не получит, потому, что не будет подписан на этот топик. Все счастливы и довольны.
Букв получилось много, но иначе, я думаю, было бы непонятно зачем я прошу добавить новую опцию в настройки некоторых виджетов (slider, switch)...
 

dao89

New member
@ravend нет, это не фабричное устройство, самодельное \ самописное :)
Я понимаю, что после отправки контроллером сообщения (в описанных ситуациях), можно, к примеру, сделать так, чтобы он игнорировал одно следующее сообщение в данном топике. Но такое решение не кажется мне правильным...
 

dao89

New member
Смысл моего предыдущего большого поста на самом деле сводится к одному простому вопросу: как контроллеру сообщить вашей программе об изменении какого-то параметра так, чтобы сообщение об этом не вернулось ему обратно?
P.S. Речь, конечно, идёт только о тех параметрах, которые могут быть изменены не только пользователем через вашу программу, но и самим микроконтроллером.
 
Последнее редактирование:

ravend

Member
@ravend нет, это не фабричное устройство, самодельное \ самописное :)
Я понимаю, что после отправки контроллером сообщения (в описанных ситуациях), можно, к примеру, сделать так, чтобы он игнорировал одно следующее сообщение в данном топике. Но такое решение не кажется мне правильным...
Я сожалению не могу найти, я кому-то (скорей всего не на этом форуме) уже описывал свою точку зрения на счет организации обратной связи в виджетах, и вообще...
Физически мне не трудно добавить второй топик, который решил бы описанную Вами проблему, но я не считаю это правильным (представьте себе, до какой-то версии и в моей программе был второй топик, потом я решил его выкинуть...).
Сейчас говорю только про проблему №1 (но и для решения второй это тоже применимо).
Прежде всего считаю правильным, что контроллер должен обновить значение в топике /set/ku/pir/state, таким образом "всем" будет доступна актуальная информация о текущем состоянии.
Второй вопрос, что контроллер получит свое же собственное сообщение и будет плохо. Вот это надо решать. Вы предложили "игнорировать одно следующее сообщение", я предлагаю по-другому - на контроллере проверять последнее отправленное (и полученное ранее) им же сообщение в этот топик, а при получении такого же значения игнорировать его. Похоже на то, что так нужно поступать со всеми retained сообщениями, поэтому можно(нужно) запрограммировать универсальный механизм, сохраняющий пары значений топик-сообщение при отправке сообщений контроллером, а при получении сверять "актуальность", если значение не изменилось, - игнорировать его.

UPD: при получении сообщений контроллером так же обновлять значения в таблице "актуальных значений"
 

dao89

New member
@ravend в вашем видении проблемы я не увидел описания того, как узнать кто же всё-таки отправил сообщение - контроллер или человек... Ибо в некоторых случаях (один из них я описал в своём "большом" посте) - это важно и влияет на логику работы. Отдельный топик для приёма значений от контроллера решил бы эту проблему..

P.S. Вторая проблема приведена для примера, на самом деле в описанной там ситуации ничего страшного не происходит. Контроллеру приходит команда на выставление той яркости, которая только что уже была выставлена пользователем "крутилкой", соответственно ничего не происходит.
Но вот в первом случае нужно знать от кого пришло сообщение (в функции отключения или включения датчика движения даже передаётся параметр, который указывает на то поступила команда от человека или нет и в зависимости от него функция работает по разному).
 
Последнее редактирование:

ravend

Member
@dao89
как узнать кто же всё-таки отправил сообщение
Не должно быть никакой разницы, кто отправил сообщение, контроллер, человек или контроллер № N. Все подписчики на топик (контроллеры в данном случае) должны уметь корректно отрабатывать любые сообщения, пришедшие хоть от кого, и если это вызывает нежелательные эффекты, то проблема на принимаемой стороне. Исходя из того, что описанные Вами (действительно в большом посте, спасибо за это!) проблемы можно решить не нагружая клиент (Linear MQTT D.) дополнительными параметрами, для решения частного случая, я по прежнему не нахожу доводы достаточными для ввода "второго топика", и считаю это лишним и более того, ошибочным выходом из проблемной ситуации. (всё, что я пишу, это лично моё мнение, никто меня этому не учил и в какой либо литературе за правило не принял, я могу ошибаться, не любитель спорить, но придется, пожалуйста, приведите ещё доводы и/или аргументы против, возможно я передумаю).

Анекдот:
Послали админов на армейскую переподготовку. Выдали по автомату, патронов как никогда, и на стрельбище.
Стреляли-стреляли — куда угодно попали, только не по мишеням.
Командир их строит:
— Вы блин связисты так вашу разэтак! Кто ж так стреляет! Чему вас учили?
И тут голос из строя:
— Командир! У нас пуля из ствола вылетела — проблемы на вашей стороне.
 

ravend

Member
@dao89 Теперь я знаю, что Вы пользуетесь слайдером, рад сообщить, что скоро (скорей всего в выходные) будет обновление, в котором слайдер будет посылать значения, даже тогда, когда вы не отпустили его, а всего лишь сдвинули. Ориентировочно, значения будут посылаться максимум 10 рав в секунду, пока жестко так, потом, скорей всего будет добавлена настройка для влияние на "частоту" обновления значения во время скроллинга слайдера.
 

dao89

New member
@dao89приведите ещё доводы и/или аргументы против, возможно я передумаю).
Над доводами и аргументами нужно подумать, сейчас уже пора спать... Первое, что приходит в голову, так это то, что делать защиту "от дурака" (в частности, игнорирование тех сообщений которые по задумке не должны приходить) на контроллере с 2 килобайтами RAM не совсем логично, когда есть телефон с 4194304 килобайтами памяти...
Также мне кажется очень даже логично иметь отдельный канал для приема входящих управляющих сообщений и отдельный канал для исходящих информационных сообщениях. Не вижу причин их смешивать. В программировании ведь так же - плохо когда всё свалено в одну кучу и гораздо лучше, когда код структурирован, разбит на функции, классы и т.п.
Но я понимаю, что для вас это не аргументы. Буду думать дальше :) Или просто сделаю некрасивый, неправильный, но работающий в 99.999999999% случаев с пропуском первого сообщения в топике, к примеру.
@dao89 Теперь я знаю, что Вы пользуетесь слайдером, рад сообщить, что скоро (скорей всего в выходные) будет обновление, в котором слайдер будет посылать значения, даже тогда, когда вы не отпустили его, а всего лишь сдвинули. Ориентировочно, значения будут посылаться максимум 10 рав в секунду, пока жестко так, потом, скорей всего будет добавлена настройка для влияние на "частоту" обновления значения во время скроллинга слайдера.
У меня, к примеру, слайдерами пока управляются только ленты: когда контроллер получает команду на изменение яркости ленты, он не просто в одно мгновение её меняет, а устанавливает "целевой" уровень яркость и плавно (секунда-две) к ней приходит. Пытаться делать плавность за счет высокой частоты отправки сообщений со слайдера - считаю неправильным. Мне бы лично хватило частоты скажем 3 раза в секунду. Это к вопросу о возможности настройки.

P.S. Спасибо за то, что выслушиваете предложения и предлагаете какие-то варианты.
 
Последнее редактирование:
Сверху Снизу