Я продолжаю рассказ о том, как сделать интеграцию с Google Home своими руками. В этом проекте я буду интегрировать несколько домашних кондиционеров, которые исходно управляются с пульта по infrared. Интеграция с Google Home означает возможность сказать “Hey G, turn on air conditioner” и получить желаемый результат.

В этой части я сделаю обзор всех API, которые мы можем (и в некоторых случаях должны) реализовать для того, чтобы интеграция с Google Home заработала.

Полный список заметок этой серии:

Новости с последнего Google IO

Я начинал делать это проект еще до Google IO 2019. На этом Google IO было несколько хороших выступлений, на одном из них еще раз было рассказано об общей структуре проектов Google Home. Если ваше любопытство простирается дальше моих статей - рекомендую посмотреть.

Учтите, что Local Home SDK, о котором они активно рассказывают, также как и App Flip, обычным разработчикм еще недоступны.

Про push-уведомления на этом IO ничего не слышно. Если не знаете, на Google IO 2018 была очень красивая демонстрация устройства, использующего push-уведомление, но этот API канул в Лету, еще не родившись.

Архитектура

Две важные диаграммы из документации, которые объясняют почти все.

AUTH_and_SYNC (Картинка взята вот отсюда)

EXECUTE (Картинка взята вот отсюда)

Основная идея в том, что Google Home не взаимодействует напрямую (по крайней мере пока) ни с одним устройством. Он взаимодействует с нашим сервером через несколько API, а наш сервер уже взаимодействует с устройствами (помните, что устройства с нашим сервером мы уже связали?).

На диаграммах все желтое - это реализованное нами, все синее - инфраструктура Google. То, что я в рассказе называю “наш сервер”, - это правый желтый квадрат с надписью “Partner Cloud Services”.

Все взаимодействие между Google Home и нашим сервером можно разбить на 4 группы. Дальше я сделаю обзор каждой из них. Реализация будет в следующих статьях.

Account linking, OAuth

Account linking случается в тот момент, когда пользователь в приложении Google Home выбирает наш проект и связывает со своим аккаунтом. Пользователь перенаправляется на страницу авторизации, реализованную нашим сервером. При успешном завершении Google Home получает токен, по которому наш сервер сможет определить, для устройств какого пользователя (и, соответственно, каких именно устройств) пришел запрос. Для пользователя в этот момент в приложении Google Home становятся видны все его устройства, и их можно распределить по комнатам.

На первой диаграмме это последовательнойсть из трех желтых “экранов” вверху.

Я так понимаю, что это обычный Account Linking, доступный в проектах Google Assistant. Для Assistant доступны OAuth, Google Sign-In и их комбинация. Однако, из документации Google Home ссылка ведет именно на OAuth. Доступно ли Google Sign-In для Google Home, я не изучал.

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

Intents

Есть 4 вида запросов от Google Home к серверу, в документации они называются Intents. С их помощью Google Home получает конфигурацию и возможности устройств, получает текущее состояние, и передает команды для управления устройствами.

На обеих диаграммах вверху intents - это взаимодействие между синим Assistant Services и нашим желтым Partner Cloud Services.

Intents всегда инициируются со стороны Google, наш сервер на них отвечает.

Именно в обработке Intents находится самое “мясо” интеграци с Google Home, и про реализацию я расскажу в следующей статье.

Request Sync

К тому моменту, как пользователь первый раз скажет “Hey G, turn on air conditioner”, Google Assistant должен знать все возможности всех устройств в доме. Первый раз список всех устройств с их возможностями передается сразу после Account linking, для этого есть отдельный intent SYNC, и после этого Google считает этот список неизменным.

На практике у пользователя могут появиться новые устройства, либо у текущий измениться возможности (при смене на новую модель, например). В этом случае нужен способ каким-то образом инициировать обновление данных: intent приходит к нешему серверу от Google Home, а сервер не может отправить обновленный список иначе как в ответ на intent.

Для этого есть API Request Sync. О нем я расскажу в одной из следующих статей.

Report State

Некоторые устройства помимо управления через Google Home и Google Assistant могут иметь собственный орган управления. Для этих случаев есть возможность отправлять в Google Home стейты устройства самим. Для этого есть API Report State

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

Я этот функционал пока не реализовал: моим пассивным кондиционерам не о чем рапортавать. Но со временем я до этого API точно доберусь.

В заключении

И еще раз в заключении: есть 4 вида API, которые необходимы для полноценной интеграции с Google Home. OAuth для Account Linking мы реализовать должны, но можем использовать “заглушку”. Intents обязательны, без них все не имеет смысла, поэтому о них будет следующая статья. Request Sync теоретически необязателен, но альтернативной является повторный Account Linking, и никто не хочет это делать несколько раз в день, поэтому тоже сделаем. Google Home может обходиться без Report State, поэтому я его отложу до лучших времен.