Статья

ioBroker.paw II - управляем android устройством посредством HTTP и MQTT

Предисловие

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

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

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

Приложение доступно в Google Play

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

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

Внешний вид

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

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

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

Подключение

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

HTTP (Web server) 

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

Для примера, некоторый список GET запросов:

<IP>  — это ip адрес устройство в сети,  <PORT>  — порт (По умолчанию 8080)

<!-- Получить данные об устройстве. --> http://<IP>:<PORT>/api/get.json <!-- Регулировка уровня подсветки от 4 до 100 % --> http://<IP>:<PORT>/api/set.json?brightness=30 <!-- Установка режима подсветки. --> http://<IP>:<PORT>/api/set.json?brightnessMode=auto <!-- Открыть ссылку в браузере устройства. --> http://<IP>:<PORT>/api/set.json?link=google.com <!-- Включение вибрации на устройстве. Время указывается в миллисекундах. (1000 == 1сек) --> http://<IP>:<PORT>/api/set.json?vibrate=1000 <!-- Установка времени работы подсветки на устройстве в сек. --> http://<IP>:<PORT>/api/set.json?timeScreenOff=60 <!-- Перейти на главный экран --> http://<IP>:<PORT>/api/set.json?home=1 <!-- Создать alert dialog, это окно с предупреждением которое вы можете конфигурировать на ваше усмотрение --> http://IP:<PORT>/api/set.json?alert=message&title=Title&negativeButton=no&positiveButton=yes&neutralButton=Yes%20and%20no&cancel=true <!-- Отправить уведомление на устройство. --> http://IP:<PORT>/api/set.json?newNoti=Text&title=Title1&id=1&light=true&sound=true&vibrate=true&contentInfo=textLeft&progress=40 <!-- Удалить все уведомления --> http://IP:<PORT>/api/set.json?delNoti=all <!-- Удалить одно уведомление с id = 2 --> http://IP:<PORT>/api/set.json?delNoti=2 <!-- Позвонить по номеру. --> http://<IP>:8080/set.json?call=89876543201 <!-- Завершить разговор --> http://<IP>:<PORT>/api/set.json?callEnd=true <!-- Установка уровня громкости. --> http://<IP>:<PORT>/api/set.json?volume=12&type=notification <!-- Отправка текста на синтез речи. --> http://<IP>:<PORT>/api/set.json?tts=Привет <!-- Остановить синтез речи. --> http://<IP>:<PORT>/api/set.json?ttsStop=true

Ответы от запросов будут возвращаться в 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, и если вам какой-то функции не хватает вы можете ее добавить, и взаимодействовать через приложение.


Спасибо огромное за хороший контент.

Привет. Исправь пожалуйста на "посредством". Без обид. Сделаем мир чище вместе.

Ребята! Очень прошу! Обновите приложение добавьте во все методы /api/ заголовок, что это JSON, чтобы можно было обрабатывать данные через JS!

Спасибо :(

К сожалению проект мертв

Вернуться назад
Вернуться назад