вторник, 19 сентября 2023 г.

Сделал приложение для управление "умным" домом через яндекс станцию

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

В прошлом году я купил себе яндекс станцию, и почти сразу же решил немного добавить умности своему дому. По сути мой умный дом - это умная лампа, умная розетка (которая чаще даже не подключена к сети), и робот-пылесос - который запускается по фразе "алиса включи пылесос", но управлять его мощностью алиса не может, и потому приходится пользоваться еще и пультом. Ах да, так как станция макс, то она еще и умеет включать-выключать телевизор через режим HDMI CEC, настраиваемый в телевизоре, ну и соответственно показывать каналы или фильмы по подписке. 

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

Перво-наперво пошел в Гугл Яндекс и начал искать "API Яндекс станции", и он привел меня на страницу Протокол программного управления устройствами. Там все довольно просто, но для первого раза все же нужно было поразбираться. Из ссылки в статье переходим в панель создания приложения и там забиваем необходимые данные:

Сохраняем приложение и далее в его настройках получаем идентификатор приложения. Для получения токена, делаем все по инструкции: https://yandex.ru/dev/id/doc/ru/tokens/debug-token. Правда это только отладочный токен, но для экспериментов сойдет. далее возвращаемся на странуцу API и видим внизу пример CURL запроса для получения информации об умном доме пользователя:

curl -i -X GET 'https://api.iot.yandex.net/v1.0/user/info' \
-H 'Authorization: Bearer YOUR_OAUTH_TOKEN'

Проблема этого запроса в том что он рассчитан для curl под Linux - формат запросов под винду отличается, этот же запрос в винде будет таким (естественно нужно вставить свой токен внутри кавичек в заголовке авторизации):

curl -H "Authorization: Bearer y0_123qw...s" -ik https://api.iot.yandex.net/v1.0/user/info -X GET -o output.txt

Вконце я еще добавил вывод в файл, чтобы скопировать ответ из него и можно было проанализировать. Поскольку данные в тексте будут не отформатированы, то очень придется кстати сервис https://jsonformatter.org/

Но и это еще не все, т.к. хочется не просто заполучить некие данные а поуправлять например той же лампой то идем на странуцу Управление умениями устройств копируем оттуда код запроса, подставляем ID лампы, токен авторизации и делаем новый запрос. проблема в том что более сложный запрос curl преобразовать в виндовый формат сложнее, но и это не проблема, можно воспользоваться сервисом https://curlconverter.com/ и хотя там еще нет такого преобразования, но зато есть преобразование в Power Shell и уже из-под него отправлять запросы. Я проверил, это работает отлично.

Теперь начинается чуть больше танцев с бубном, поскольку надо как-то писать приложение - и это действительно для новичка сущий ад. Тем не менее у меня есть рецепт. В первую очеред скачал андроид студию, а потом там создал новый проект по такой инструкции: Создание простейшего приложения. Обязательно нужно скомпилить все и попробовать запустить, чтобы понять что описанное все действительно работает. После того как убеждаемся, что кнопка обрабатывает нажатия, и выводится тот текст который нам нужен, мы можем добавить функционал по отправке HTPP запросов на сервер яндекса - то есть делать ровно то что делали при помощи скриптов, но уже в Java. Эта задача тоже оказалась не самой тривиальной - я к тому что внятных инструкций нет, я нашел одну, но для новичка было не совсем ясно как это работает, но тем не менее, все получилось: https://coderlessons.com/articles/mobilnaia-razrabotka-articles/http-klient-android-get-post-zagruzka-vygruzka-mnogochastnyi-zapros

В общем немного переработав тот код, удалось делать запросы из эмулятора и получать ожидаемую реакцию - и уже на этом можно умыть руки - программа минимум выполнена) И да - "выключить все" это запуск сценария, который добавляется через приложение яндекса. Чтобы получить список и ID сценариев нужно покурить мануал, там просто))

Полный код, есть на моем гитхабе: GetHTTP-Android

Комментариев нет:

Отправить комментарий