Интеграция Google Home-устройств в мобильное IoT-приложение
Google Home SDK стал публично доступен в 2023 году после нескольких лет закрытой беты. До этого единственный путь — Google Home API через REST, что давало ограниченный контроль и требовало OAuth-авторизации каждого пользователя через аккаунт Google. Сейчас есть два пути: Google Home SDK для Android (нативная интеграция) и Device Access API (REST/gRPC, работает с Android и iOS).
Device Access API: REST-интеграция для iOS и Flutter
Device Access работает с устройствами Nest (термостаты, камеры, дверные звонки). Авторизация через OAuth 2.0, после чего приложение получает доступ к Structures, Rooms и Devices:
GET https://smartdevicemanagement.googleapis.com/v1/enterprises/{projectId}/devices
Authorization: Bearer {access_token}
Ответ содержит список устройств с трейтами. Термостат Nest Learning 3rd gen возвращает:
{
"name": "enterprises/project-id/devices/device-id",
"type": "sdm.devices.types.THERMOSTAT",
"traits": {
"sdm.devices.traits.ThermostatMode": {
"mode": "HEAT",
"availableModes": ["HEAT", "COOL", "HEATCOOL", "OFF"]
},
"sdm.devices.traits.ThermostatTemperatureSetpoint": {
"heatCelsius": 21.5
},
"sdm.devices.traits.Temperature": {
"ambientTemperatureCelsius": 19.8
}
}
}
Управление — через ExecuteCommand:
// iOS, Alamofire
func setThermostatMode(_ mode: String, deviceName: String) async throws {
let url = "https://smartdevicemanagement.googleapis.com/v1/\(deviceName):executeCommand"
let body: [String: Any] = [
"command": "sdm.devices.commands.ThermostatMode.SetMode",
"params": ["mode": mode]
]
_ = try await AF.request(url, method: .post, parameters: body,
encoding: JSONEncoding.default,
headers: authHeaders)
.serializingDecodable(CommandResponse.self)
.value
}
Авторизация через Google Sign-In SDK с scope https://www.googleapis.com/auth/sdm.service. Refresh token нужно хранить в Keychain — DeviceAccess токены живут 1 час.
Android: Google Home SDK
На Android Google Home SDK предоставляет нативный доступ к экосистеме, включая Matter-устройства:
// build.gradle.kts
implementation("com.google.home:google-home-sdk:1.1.0")
Инициализация:
val homeClient = HomeManager.getHomeClient(context)
homeClient.getHomes()
.flowOn(Dispatchers.IO)
.collect { homes ->
homes.forEach { home ->
home.devices().collect { devices ->
devices.forEach { device ->
processDevice(device)
}
}
}
}
Интересная особенность SDK — реактивная модель на основе Kotlin Flow. Состояние устройства — это Flow, который автоматически эмитит новые значения при изменении:
suspend fun observeThermostat(device: HomeDevice) {
device.trait(ThermostatMode)
?.changes()
?.collect { mode ->
updateUI(mode.mode)
}
}
Команды выполняются через те же объекты трейтов:
val thermostatTrait = device.trait(ThermostatMode) ?: return
thermostatTrait.setMode(ThermostatMode.Mode.COOL)
Камеры Nest: WebRTC стриминг
Camera Access трейт возвращает rtspUrl или WebRTC offer, в зависимости от модели камеры. Новые Nest Cam (2021+) работают только через WebRTC:
val cameraLiveStream = device.trait(CameraLiveStream)
val streamResponse = cameraLiveStream?.generateWebRtcStream(
offerSdp = localPeerConnection.localDescription?.description ?: ""
)
// streamResponse.answerSdp передаём в RTCPeerConnection
peerConnection.setRemoteDescription(
RTCSessionDescription(RTCSessionDescription.Type.ANSWER, streamResponse.answerSdp)
)
Ошибка, которую делают почти все: не обновляют stream token. WebRTC-сессия живёт 5 минут, потом Nest закрывает соединение. Нужен фоновый таймер, который за 30 секунд до истечения вызывает extendWebRtcStream().
Ограничения экосистемы
Device Access API требует одобрения Google для каждого проекта — подаётся заявка через консоль, ответ через 1-5 рабочих дней. Есть плата: $5 за регистрацию проекта. Камеры не работают в Device Access без подписки Nest Aware на аккаунте пользователя — это нужно явно указывать в UX.
Google Home SDK на Android в 2024 году всё ещё в Developer Preview, API может измениться. Для продакшн-решений с камерами Device Access API надёжнее.
Сроки интеграции: REST Device Access API для iOS — 2-3 недели; Android Google Home SDK с Matter — 3-4 недели; Flutter с обеими платформами — 5-6 недель. Стоимость рассчитывается индивидуально после анализа требований.







