Лаба “Smart Home Washer” по созданию устройств для Google Home объясняет, как сделать “облачную” часть собственного устройства и связать ее с “облаком” Google Home. Но это только начало: далее необходимо “олбако” связать с самим устройством.

Архитектура полученного решения такова: услышав пользователя, Google Assistant передает распознанную команду в Google Home. Тот, в свою очередь, определяет, какому устройству команда предназначается, и вызывает соответствующий webhook. Лаба объясняет, как создать webhook с помощью Firebase Cloud Functions и сохранить состояние устройства в Firebase Realtime Database.

База данных - это еще не само устройство. Следующая задача - связать исполнителя команд с базой данных и получать сообщения об изменении сохраненного в базе состояния устройства. Изменение состояния в базе означает необходимость привести реальное устройство в это же состояние (передать устройству команду).

Далее примеры на Python. Документация универсальная.

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

Получение токена описано здесь. Там же есть инструкция, как сгенерировать ключ и получить файл с ключом. Подсказка: чтобы найти нужную секцию, нужно у проекта в Firebase открыть Project Settings (иконка-шестеренка рядом с пунктом Project Overview). Далее вкладка Service accounts, и внизу кнопка Generate new private key.

Шаг второй. подготовить запрос для получения необходимых данных.

dbUrl - ссылка к нужному месту данных. В консоли Firebase откройте страницу с данными Realtime database, докликайте до нужного места в дереве с данными (можно никуда не кликать и получать обновление всех данных, от корня), вверху окна будет ссылка.

Использование REST API для получения данных описано здесь.

Шаг третий: оформить подписку на события.

Если к готовому запросу добавить заголовок Assept: text/event-stream, то вместо JSON от сервера придет поток в формате EventSource / Server-Sent Events protocol.

Работа с потоком обновлений описана в том же документе

Для работы с Server-Set Events на Python есть библиотека Python SSE Client

Пример того, что приходит:

2019-05-15 05:29:41.799600
put
{"path":"/","data":{"OnOff":{"on":true},"RunCycle":{"dummy":true},"StartStop":{"isPaused":false,"isRunning":false}}}
2019-05-15 05:29:48.867432
put
{"path":"/OnOff/on","data":false}
2019-05-15 05:30:18.877440
keep-alive
null
2019-05-15 05:30:48.927935
keep-alive
null
2019-05-15 05:31:18.886840
keep-alive
null

Шаг четвертый. Превратить поток сообщений в структуру данных.

The End

Как дальше обрабатывать события - уже за рамками этой истории. Я для начала собираюсь заменить все пульты с infrared led, об этом будет отдельная статья на JollyDroid.ru.