Это уже третья попытка подружить умный дом с android, напомню, что первая попытка контролировать android устройства посредством HTTP была с помощью приложения Paw Server. Данное приложение позволяло с помощью языка BeanShell встраивать свой код в xhtml страницу и взаимодействовать с ним, получать данные или управлять им. Для интеграции с сервером умного дома (ioBroker) был написан драйвер, но для его первой настройки приходилось вручную загружать скрипты. Далее, уже посредством драйвера, происходило обновление скриптов, что позволяло добавлять новые функции и исправлять ошибки, но и накладывала ряд ограничений в попытках отойти от заложенных в Paw Server методов для реализации новых функций.

Второй попыткой, было собрать свое приложение на базе исходников от Paw server. Главной целью была упростить для пользователя процесс настройки, а также добавить новые возможности, которые не могли быть реализованы в предыдущей версии.

В этой же версии было решено полностью отказаться от Paw server и переписать приложение и драйвер для ioBroker. Добавить новые способы подключения, кроме уже имеющегося HTTP, еще и MQTT. Добавить больше настроек по выбору событий, как от самой системы, так и от встроенных датчиков. Конечно первым дело приложение будет оптимизировано для ioBroker, но и без особого труда может быть интегрировано и в другие системы.

Google Play

Приложение позволяет:

  1. Получать состояние системных настроек (яркость подсветки, состояние экрана, уровень громкости, батареи и т.д.)
  2. Получать данные от входящих вызовов, распознавание речи
  3. Получать данные от встроенных датчиков.
  4. Получать координаты местоположения.
  5. Получать список установленных приложений и запуск их.
  6. Управлять системными настройками (яркость подсветки, уровень громкости и т.д.)
  7. Совершать звонки.
  8. Создавать уведомления и «диалоговые» окна.
  9. Отправлять текст на синтез речи.
  10. Взаимодействовать с таскером.
  11. Отправлять файлы на устройства (только HTTP).

Внешний вид




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

С навигацией по приложению, я думаю, не должно возникнуть трудностей. При первом запуске приложение кратко информирует о текущих изменениях в новой версии и предложит воспользоваться «помощником». Перейдя в настройки приложения можно изменить основные параметры работы, выбрать тип подключения, выбрать события которые будут передаваться на сервер, а также разрешить или запретить доступ к некоторым данным (телефонная книга, сообщения, список вызовов и фотографиям).

На главном экране можно увидеть «плитки», пока это пробный вариант, но со временем планирую расширить их возможности. Из доступных «плиток», на данный момент, имеется: кнопка, диммер, время, список, цвет, информация. Главная задача «плиток» отправлять или получать данные (команды) от сервера или управлять другими устройствами. Пока нет общей картины как должно все работать, поэтому не буду сейчас описывать все нюансы.

Подключения


Теперь про подключения и команды управления, приложение имеет два варианта подключения по протоколу HTTP и MQTT. У каждого способа есть, как свои плюсы, так и недостатки, какой способ подключения выбрать решать вам.

HTTP


Данный способ предусматривает подключение по Wi-Fi, к локальной сети. Приложение «поднимает» свой веб сервер (ip-адрес и порт можно посмотреть в уведомлении при подключении) и дает доступ управлять им. Это можно делать как напрямую (через браузер), так и в интеграции с сервером УД, посредством POST или GET запросов.





Ответы от запросов будут возвращаться в JSON формате, в теле ответа передается имя устройства, ip адрес и статус команды. Некоторые запросы вызывают дополнительно «обратный вызов», например при отправке текста на синтез речи, приложение отправит запрос серверу о начале проговаривания текста и его завершение. Таким же способом приложение передает данные о событиях и показания встроенных датчиков на сервер. Поэтому для полноценной работы, требуется чтобы сервер УД умел обрабатывать их.

MQTT


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

При подключении к MQTT брокеру создается основная ветка /PAW/, далее идет имя устройств (для каждого устройство оно должно быть свое), которые в свою очередь делятся на две ветки топика /info/ и /comm/, из названия можно догадаться, что в ветке info (information) публикуется вся поступающая информация от устройства, а в ветке comm (command) топики для управления им. Это сделано для наглядности, чтобы лучше понимать какой топик за что отвечает.



Также в основной ветки есть /all_devices/ в данной ветке находятся топики на которые подписываются все устройства, что позволяет управлять всеми устройствами сразу.

Для универсальности, в тех топиках значения которых может быть истинное (true) или ложное (false), могут принимать разные значения, то есть 1, on, auto, true — это истинное значение, а 0, off, false, manual — это ложное. Еще одной особенностью работы приложения является то, что для проверки выполнения команды, в случае успешной ее выполнения, в тот же топик публикуется пустое значение. А если значение после публикации не исчезло, это говорит о том, что при выполнении команды возникла ошибка или значение не соответствует корректному для данного топика. Например, при изменении уровня громкости, если значение будет не соответствовать числу или выйдет за пределы максимального, для данного типа уровня громкости, вернет ошибку.

Также в данной версии был расширен набор команд для уведомлений и «диалогов», они позволяют выводить более подробную информацию, а также взаимодействовать с пользователем, если устройство используется как информер. При их построение требуется большое количество параметров, поэтому необходимо в соответствующий топик публиковать значение в JSON формате.

Для уведомлений топик /comm/notification/create (ниже пример значения)

{
 "noti":"Any text",
 "title":"Title 2",
 "info":"Any text",
 "vibrate":true,  
 "sound":true,    
 "light":true,     
 "id":2
}

Для «диалогов» топик /comm/notification/alert. Ответ от «диалогов» приходит в JSON формате и публикуется в топике /info/alert/response

{
 "alert":"Turn the lights off?",
 "title":"Light",
 "negative":"No",  
 "positive":"Yes",  
 "neutral":"Neutral",  
 "sound":true,      
 "id":2
}

Интеграция с ioBroker




Встраивая в приложения возможность работы через протокол MQTT, я как раз хотел упростить интеграцию с системой и избавиться от написания отдельного драйвера. Но некоторые функции не могут быть реализованы через протокол MQTT и по этой причине без драйвера не обойтись.

Структура объектов драйвера похоже на структуру MQTT, и так же разделены на две ветки /info/ и /comm/, имеет схожие команды для управления и такую же реакцию на некорректные данные. Я не буду тут описывать настройку и работу драйвера, вся актуальная информация будет обновляться на GitHub.

Примечания


Что касается управлением системными настройками (управления яркостью подсветки, выход из сна и т.д.) — разные устройства будут по-разному реагировать, или же не реагировать, на команды. Из-за большого разнообразия устройств, версий SDK, прошивок сложно задать одну модель поведение на команду. Тут нужно подбирать действие согласно вашему устройству, так например для большинства устройств отключения экрана (отправить его в сон) достаточно изменить время тайм-аута подсветки, но на некоторых устройствах это не сработает. Такая же ситуация и с другими системными настройками, для большинства устройств сразу произойдут изменения, а для других же необходимо отправить устройство в сон и затем разбудить его, что бы изменения вступили в силу. Наименьших проблем такого рода возникает с SDK 19 (Android 4.4), но это не точно.) Так же не забывайте, что есть поддержка Tasker, и если вам какой-то функции не хватает вы можете ее добавить, и взаимодействовать через приложение.

Комментарии (5)


  1. firedragon
    04.05.2019 21:08

    Открывать телефон на распашку всему миру. Это вы пожалуй погорячились. Да и зачем управлять мобильником по большей части это вещь в себе. Да и не гарантируют они постоянного подключения. Всякие энергосберегайки и прочее, заботятся об этом.

    Какие цели можно решать?


    1. bondrogeen Автор
      04.05.2019 22:27

      Ну в первую очередь данное приложение предназначено для планшетов которые используется в качестве информеров для умного дома и подразумевает использования в локальной сети, без внешнего доступа. Приложение дает контроль над андройд устройством и позволяет серверу или пользователю управлять им. В качестве таких устройств могут выступать старые планшеты или телефоны от версии андройда 4.1.
      Что касаемо энергосбережения, как привило, такие устройства постоянно находятся на зарядке или подключены напрямую от источника питания, поэтому это не так важно.


      Если использовать приложения в качестве "пульта управления" для устройств вашего умного дома, например, через внешний MQTT сервер, то возможна только публикации топиков, но тогда нужно понимать, что и не будет обратной связи.


      А вообще, для телефонов и работы в качестве "пульта управления", планирую написать другое приложение в котором будут учтены все аспекты, в том числе и связанные с минимальным энергопотреблением и возможностью оставаться на связи для получать уведомления. Но скорей всего это будет приложение только для ioBroker и работать оно будет через облачные службы.


      1. ilya73
        05.05.2019 10:10

        Кстати хорошая идея это реализовать в вашей системе «плагин», который позволит реализовать резервный канал информирования! Предположим: прошел ураган и порвал ВОЛС до вашего объекта, вы в «панике и в неведение», но тут вам приходить СМС от устройства с предупреждением.


        1. Bluefox
          06.05.2019 17:32

          Уже в работе: github.com/Apollon77/serialport-gsm
          Из этого потом будет драйвер для брокера.


          1. instalator
            07.05.2019 06:25

            Отлично, как раз куча gsm модулей не пристроенная. В драйвер бы добавить ещё возможность подключать модем не только через serial, а через tcp to serial