Многие, вероятно, не в курсе, что у колонок Google есть свой локальный API. Я сейчас говорю не про протокол Chromecast, который бесспорно хорош. Я говорю про API, который позволяет настраивать колонки Google с помощью мобильного приложения Google Home.



Первая информация об этом протоколе появилась в январе 2018 года. API можно было свободно пользоваться в пределах локальной сети.


В январе 2019 года Google выпустил обновление, добавляющее обязательную авторизацию. Для выполнения команд требовался локальный токен — прям как в колонках Яндекса. В сообществе нашли решение в виде запуска виртуальной машины с рутованным Android, а затем извлечение токена из приложения Google Home по adb. Сложность такого подхода заставила многих отказаться от этого API.


И вот совсем недавно автор неофициальной документации локального API предложил более цивилизованный способ получить локальный токен — с помощью логина и пароля от Google-аккаунта.


Сперва необходимо получить master-токен для своего аккаунта Google. Для этого нужно притвориться Android-приложением от Google, используя библиотеку gpsoauth (Google Play Services OAuth). Для безопасности можно создать и использовать пароль приложений Google вместо своего основного пароля. И в итоге сохранить только токен. Он выдаётся надолго.


Затем, используя ту же библиотеку, получить access-токен. И уже с его помощью, используя утилиту gRPCurl и предложенный автором файл proto, получить ваш Home Graph.


Home Graph сам по себе очень интересен: он содержит полную информацию о вашем умном доме Google, включая список устройств, комнат, локацию во всех подробностях. В Home Graph есть локальные токены колонок.


Ещё там есть список типов устройств, которые потенциально собирается поддерживать Google. Я насчитал 130 штук, и среди них есть “устройства” кошка и собака...


Типы устройств из Home Graph

AC_HEATING: Air conditioner and heating unit
AC_UNIT: Air conditioner
AIRCOOLER: Air cooler
AIRFRESHENER: Air freshener
AIRPURIFIER: Air purifier
ALARM: Alarm
AUDIO_VIDEO_RECEIVER: AVR
AUTO: Automobile
AWNING: Awning
BAG: Bag
BATHTUB: Bathtub
BATTERY: Battery
BED: Bed
BIKE: Bike
BLENDER: Blender
BLINDS: Blinds
BOILER: Boiler
BUTTON: Button
CAMERA: Camera
CARBON_MONOXIDE_DETECTOR: Carbon monoxide detector
CAT: Cat
CHARGER: Charger
CHROMECAST: Chromecast
CLOCK: Clock
CLOCKRADIO: Clock radio
CLOSET: Closet
CLOTHING: Clothing
COFFEE_MAKER: Coffee maker
COMPUTER: Computer
COOKTOP: Cooktop
CURTAIN: Curtain
DEHUMIDIFIER: Dehumidifier
DEHYDRATOR: Dehydrator
DISHWASHER: Dishwasher
DISPLAY: Display
DOG: Dog
DOOR: Door
DOORBELL: Doorbell
DRAWER: Drawer
DRYER: Dryer
ELEVATOR: Elevator
FAN: Fan
FAUCET: Faucet
FILTER: Filter
FIREPLACE: Fireplace
FREEZER: Freezer
FRYER: Fryer
GAME_CONSOLE: Game console
GARAGE: Garage
GARDEN: Garden
GATE: Gate
GOOGLE_HOME: Speaker
GRILL: Grill
HEADPHONES: Headphones
HEATER: Heater
HOOD: Range hood
HUMIDIFIER: Humidifier
IDBADGE: ID badge
INTERCOM: Intercom
KETTLE: Kettle
KEYS: Keys
LAPTOP: Laptop
LIGHT: Light
LOCATORTAG: Locator tag
LOCK: Lock
MAILBOX: Mailbox
MATTRESS: Mattress
MICROPHONE: Microphone
MICROWAVE: Microwave
MIXER: Mixer
MOP: Mop
MOWER: Mower
MULTICOOKER: Multicooker
NETWORK: Network
NOTEBOOK: Notebook
OUTLET: Outlet
OVEN: Oven
PASSPORT: Passport
PERGOLA: Pergola
PETFEEDER: Pet feeder
PHONE: Phone
PICTURE: Picture frame
PRESSURECOOKER: Pressure cooker
RADIATOR: Radiator
REFRIGERATOR: Refrigerator
REMOTECONTROL: Remote control
ROBOT: Robot
ROOF: Roof
ROUTER: Router
ROUTINE: Router
SCENE: Scene
SCREEN: Screen
SECURITYSYSTEM: Security system
SENSOR: Sensor
SETTOP: Set-top box
SHOWER: Shower
SHUTTER: Shutter
SMOKE_DETECTOR: Smoke detector
SOUNDBAR: Soundbar
SOUSVIDE: Sous-vide cooker
SPEAKER: Speaker
SPEAKER_GROUP: Speaker group
SPEAKER_PAIR: Speaker pair
SPRINKLER: Sprinkler
STANDMIXER: Stand Mixer
STREAMING_BOX: Streaming Box
STREAMING_SOUNDBAR: Streaming Soundbar
STREAMING_STICK: Streaming Stick
STYLER: Styler
SWITCH: Switch
SYNCBOX: Sync box
TABLET: Tablet
THERMOSTAT: Thermostat
TOILET: Toilet
TOY: TOY
TV: TV
UMBRELLA: Umbrella
VACUUM: Vacuum
VALVE: Valve
VENTILATOR: Ventilator
WALLET: Wallet
WATCH: Watch
WASHER: Washer
WATERHEATER: Water heater
WATERPURIFIER: Water purifier
WATERSOFTENER: Water softener
WEATHERSTATION: Weather station
WINDOW: Window
WINECELLAR: Wine Cellar
YOGURTMAKER: Yogurt maker


Так чем же хорош локальный API? С его помощью можно узнавать список будильников и удалять их (создавать нельзя). Можно управлять эквалайзером и режимом “не беспокоить”. Но самое интересное — можно запускать поиск окружающих устройств Bluetooth.


В списке Bluetooth-устройств будет MAC-адрес и мощность сигнала. И по возможности — имя и класс устройства.


На этих данных можно построить “логику присутствия”. Конечно, при условии, что ваши устройстройства дают себя обнаружить. В Home Assistant когда-то давно был как раз такой компонент, но его удалили после появления авторизации в API.


Если в вашем доме несколько Google-колонок, можно попытаться реализовать позиционирование человека в пределах квартиры.


У меня достаточно много проектов, чтоб заняться ещё и этим. Но надеюсь, кто-нибудь воспользуется этими знаниями и сделает что-то прикольное для себя, а может, и для сообщества.