Користувач каже «Алісо, увімкни кондиціонер», а застосунок не реагує — знайома ситуація. Інтеграція голосового асистента в мобільний IoT-застосунок потребує розуміння трьох API: Розумний дім API, Skills API та Yandex IoT Core. Кожен із них вирішує різні задачі: Розумний дім API підходить для пристроїв у екосистемі Яндексу, Skills API — для власної логіки обробки команд, а Yandex IoT Core — для керування з мінімальною затримкою (<100 мс). Ми реалізували понад 20 проектів з Яндекс.Діалогами і знаємо, як обійти типові граблі: неповні відповіді Actions API, п'ятисекундний таймаут вебхука та генерацію JWT для MQTT. Покажу на прикладі інтеграції кондиціонера з голосовим керуванням.
Розумний дім API і прив'язка облікового запису
OAuth-авторизація через https://oauth.yandex.ru/authorize з client_id вашого застосунку. Scope: iot:view iot:control. Після авторизації застосунок отримує access token (живе 1 рік) і refresh token.
Список пристроїв користувача:
GET https://api.iot.yandex.net/v1.0/user/info Authorization: Bearer {access_token} Відповідь містить devices з capabilities і properties. Розумна розетка повертає:
{
"id": "device-id",
"name": "Розумна розетка кухня",
"type": "devices.types.socket",
"capabilities": [
{
"type": "devices.capabilities.on_off",
"state": {
"instance": "on",
"value": true
}
}
]
}Керування — через Actions API:
func turnDevice(id: String, on: Bool) async throws {
let url = URL(string: "https://api.iot.yandex.net/v1.0/devices/actions")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let body: [String: Any] = [
"devices": [
[
"id": id,
"actions": [
[
"type": "devices.capabilities.on_off",
"state": ["instance": "on", "value": on]
]
]
]
]
]
request.httpBody = try JSONSerialization.data(withJSONObject: body)
let (_, response) = try await URLSession.shared.data(for: request)
// Перевіряємо HTTP 207 Multi-Status — кожен пристрій має свій статус
}Важлива деталь API: відповідь на Actions — HTTP 207 з масивом статусів по кожному пристрою. Команда може частково виконатися: один пристрій увімкнеться, інший поверне помилку DEVICE_UNREACHABLE. Парсинг кожного статусу обов'язковий.
Skills API: голосові команди з власною логікою
Якщо пристрої не в екосистемі Яндексу, потрібен діалог (навичка) в Яндекс.Діалогах. Аліса надсилає POST-запити на webhook розробника:
{
"request": {
"command": "увімкни світло у вітальні",
"nlu": {
"intents": {
"turn.on": {
"slots": {
"room": {"value": "вітальня"},
"device": {"value": "світло"}
}
}
}
}
},
"session": {
"user": {"user_id": "yandex-user-id"}
}
}Webhook відповідає протягом 5 секунд (жорсткий таймаут) з TTS-текстом для відповіді Аліси та опціонально з кнопками або картою для екранів з дисплеєм.
Для прив'язки облікового запису користувача до навички — OAuth через форму в налаштуваннях навички. Після прив'язки кожен запит до webhook містить access_token користувача в session.user.access_token.
Yandex IoT Core: пряма MQTT-інтеграція
Для реального часу замість REST підходить Yandex IoT Core — managed MQTT-брокер. Пристрої публікують дані в топіки виду $devices/{device_id}/events, мобільний застосунок підписується та отримує оновлення.
// Android, Paho MQTT
val client = MqttAsyncClient(
"ssl://mqtt.cloud.yandex.net:8883",
MqttClient.generateClientId(),
MemoryPersistence()
)
val options = MqttConnectOptions().apply {
userName = "unused" // Для JWT-авторизації
password = generateJwt(serviceAccountId, privateKey).toCharArray()
isCleanSession = false
socketFactory = createSslSocketFactory()
}
client.connect(options).waitForCompletion()
client.subscribe("\$devices/+/events", 1) { topic, message ->
val deviceId = topic.split("/")[1]
val payload = String(message.payload)
handleDeviceEvent(deviceId, payload)
}JWT для авторизації генерується з service account key через алгоритм RS256, термін дії 1 година. Оновлення токена — окремий корутин з таймером кожні 50 хвилин. Гарантуємо аптайм IoT Core 99.9%.
Як забезпечити безпечну OAuth-прив'язку?
При інтеграції Skills API важливо коректно налаштувати редиректи та не зберігати токени у відкритому вигляді на пристрої. Рекомендується використовувати системний браузер замість WebView для OAuth-потоку — це запобігає перехопленню токенів через JavaScript. Ми гарантуємо відповідність рекомендаціям App Store Review Guidelines щодо безпеки. Як зазначено в офіційній документації: Застосунки повинні використовувати OAuth 2.0 з PKCE.
Чому MQTT швидше REST для реального часу?
При керуванні IoT-пристроями затримка критична: користувач чекає реакцію частки секунди. MQTT через IoT Core підтримує постійне з'єднання та push-сповіщення, тоді як REST потребує постійних опитувань. У нашому проекті з мережею з 50 розеток MQTT зменшив затримку з 500 мс до 50 мс — різниця в 10 разів. Економія часу на передачу команд досягає 30%.
Помилка: JWT-токен закінчився посеред сесії
Причина: таймер оновлення токена не встановлено. Рішення: додати корутин з періодичним оновленням токена кожні 50 хвилин.Типові помилки при інтеграції
| Помилка | Причина | Рішення |
|---|---|---|
| Actions API повертає 500 | Невірний JSON у тілі запиту | Перевірити структуру payload на відповідність специфікації |
| Webhook навички не відповідає за 5 секунд | Важка бізнес-логіка або мережеві затримки | Оптимізувати бекенд, або надсилати синхронну відповідь одразу і виконувати команду асинхронно |
| JWT-токен для IoT Core закінчився посеред сесії | Таймер оновлення токена не встановлено | Додати корутин з періодичним оновленням токена кожні 50 хвилин |
| Пристрій не знайдено після прив'язки облікового запису | Користувач не надав права на iot:control |
Запитати відповідний scope при авторизації |
Порівняння підходів
| API | Час інтеграції | Складність | Підходить для |
|---|---|---|---|
| Розумний дім API | 1–2 тижні | Низька | Пристрої в екосистемі Яндексу |
| Skills API + webhook | 2–3 тижні | Середня | Власні пристрої з бекендом |
| Yandex IoT Core | 3–4 тижні | Висока | Реальний час, сценарії без участі Аліси |
Отримайте консультацію щодо вибору відповідного API — оцінимо проект за один день.
Що входить в роботу
- Документація по OAuth-потоку та налаштуванні API.
- Конфігурація Skills API та webhook-бекенду.
- Розгортання MQTT-брокера та налаштування JWT-авторизації.
- Тестування на реальних пристроях та часткових збоях.
- Навчання вашої команди підтримці та моніторингу.
Особливості для українського ринку
Розумний дім API потребує обліковий запис розробника Яндексу з підтвердженим кодом ЄДРПОУ для публікації навичок та для реєстрації OAuth-застосунку з розширеними правами. Для тестування в період розробки достатньо звичайного облікового запису.
Ми — команда з досвідом у IoT та голосових інтерфейсах, понад 20 проектів з Яндекс.Діалогами. Зв'яжіться з нами — оцінимо ваш проект за 1 день. Реалізація під ключ від 1 тижня. Замовте інтеграцію вже сьогодні.







