Многие, вероятно, не в курсе, что у колонок 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 штук, и среди них есть “устройства” кошка и собака...
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-колонок, можно попытаться реализовать позиционирование человека в пределах квартиры.
У меня достаточно много проектов, чтоб заняться ещё и этим. Но надеюсь, кто-нибудь воспользуется этими знаниями и сделает что-то прикольное для себя, а может, и для сообщества.
petro_64
Данную задачу можно решить сильно проще.
1. Покупаем за 10 евро платку(и) с ESP32 на борту
2. Заливаем прошивку: датчик сигналов BLE + отправку списка обнаруженных девайсов на MQTT шину
3. Размещаем платки в удобных местах там где есть USB
4. Детектим наличие людей по сигналам BLE фитнес-браслетов
Я использовал данную систему как детектор присутствия на основе фитнес-браслетов Xiaomi MiFit. Мы управляли отоплением что бы отключать его когда все уходят из дома. Сейчас мы переехали в другой дом с паушальной платой за отопление и необходимость системы отпала, отключил датчик присутствия за ненадобностью, сейчас у нас управление больше сконцентрировано на замечательных кнопках ZigBee от Ikea для отдачи команд типа «выключить всё» при уходе из дома, оказалось несколько практичнее.
З.Ы. с удивлением обнаружил что код прошивки часов + датчик BLE не выложил на гитхаб, могу поделиться если есть интерес.
AlexxIT Автор
NodeMCU ESP32 стоит гораздо дешевле 10 евро. И конечно она сильно универсальнее этого способа. Плюс именно BLE-устройства колонки, вероятно, не найдут.
Но когда колонки уже есть, почему бы не найти им дополнительное применение. Особенно, когда они на распродажах строят $20 и уже и так в каждой комнате.
Voiddancer
nodeMCU это esp8266
AlexxIT Автор
Есть NodeMCU на чипе ESP32 с Bluetooth. На нём часто делают или гейт для Bluetooth датчиков Xiaomi или трекер BLE устройств. Например, установив прошивку ESPHome.
Voiddancer
И правда, но ценник как раз где-то 10 евро.
AlexxIT Автор
350 рублей. Недавно купил, как раз, чтоб сделать трекером BLE.
AndreyDmitriev
Поделитесь пожалуйста — ваш коммент и пост выше подкинули мне пару идей как можно браслет использовать. А там какой-нибудь уникальный идентификатор прилетает? Иными словами могу я задетектить присутствие именно моего браслета, а не чужого?
gsaw
Ну да, у каждого BT девайса свой уникальный айди, вроде MAC у сетевых карт. По нему и можно детектить свой браслет. Я как то пробовал давно уже такое сделать. Купил брелок с бт. Пробовал мерить расстояние до него. Если к примеру на кухне, то включать свет. Но все оказалось нестабильно. Если брелок в кармане, стоит его закрыть рукой или повернуться как то неловко, то все, сигнал не ловится или слабый. Ты стоишь рядом а система думает, что ты в десяти метрах и гасит свет. А так прикольно. Да. Пробовал ещё с Pebble часами так делать, это работает, причем лучше чем брелок с бт меткой, но только если часы неспаренны с телефоном. Они просто в невидимом режиме. Только если их отлучить от телефона, тогда детектятся, но тогда зачем они, только время показывают? :) Как сделать, что бы спаренные обнаружились, не нашел. Может надо такие, которые с двумя устройствами одновременно могут спариваться, не знаю.
Забил вообще, в маленькой квартире все равно это баловство имхо. Трудно придумать нормальный сценарий. Датчики движения проще и надёжнее.
Voiddancer
Я пробовал сделать детектор, фиксирующий подъезжающие к точке машины (на разгрузку), чтобы их (машины) считать. Стабильность, мягко говоря, хромала, да. Вероятно, мне не хватало фундаментальных знаний радио теории. Машина могла не фиксироваться при нахождении на точке, а могла фиксироваться в 100м от неё.
petro_64
Да, разумеется, BLE пересылает MAC адрес в Beacon-пакете, для этого надо включить в настройках браслета рассылку широковещательных пакетов. Тогда всё становится реально просто, работает вне в зависимости от пейринга с телефоном, можно различать устройства, батарейку тоже не кушает заметно.
У нас работало в целом неплохо, радиус действия был примерно на комнату, в каждой стоял ESP32 модуль, который присылал список из MAC-адресов устройств которые он чувствовал в эфире, а центральный сервер умного дома уже сам разбирался что делать с этой информацией (у меня используется OpenHab).
Вы так же можете сканировать вручную на устройствах с BLE на линуксе через команду hcitool — так можно проверить концепцию с радиусом, частотой рассылки и т.п.
На эту тему довольно много всего писано, зацените например статью от Domoticz, там с примерами девайсов подходящих.