Интеграция Яндекс.Алисы для управления IoT-устройствами в мобильном приложении
Управление умным домом через Яндекс.Алису — это либо Умный дом API (для устройств в экосистеме Яндекса), либо Skills API (для голосового навыка с собственным бэкендом), либо прямая интеграция через Yandex IoT Core MQTT-брокер. Для мобильного приложения, которое хочет управлять устройствами через Алису, путь почти всегда такой: OAuth 2.0 → Умный дом API → управление устройствами.
Умный дом 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 час. Обновление токена — отдельный корутин с таймером.
Особенности для российского рынка
Умный дом API требует аккаунт разработчика Яндекса с подтверждённым ИНН для публикации навыков и для регистрации OAuth-приложения с расширенными правами. Для тестирования в период разработки достаточно обычного аккаунта.
Интеграция Умный дом API в существующее iOS или Android приложение: 1-2 недели. Разработка Skills API с OAuth-привязкой и webhook-бэкендом: 2-3 недели. IoT Core MQTT-интеграция с реальными устройствами: 3-4 недели. Стоимость рассчитывается индивидуально.







