Інтеграція 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 може змінитися. Для production-рішень з камерами Device Access API надійніше.
Строки інтеграції: Device Access API для iOS — 2-3 тижні; Android Google Home SDK з Matter — 3-4 тижні; Flutter з обома платформами — 5-6 тижнів. Вартість розраховується індивідуально після аналізу вимог.







