alice-smart-home
alice-smart-home copied to clipboard
Simple Python framework to control your DIY smart home devices using Alice from Yandex
alice-smart-home
Простейший фреймвок для управления умным домом с помощью Алисы от Яндекса.
Требования
- Веб-сервер (достаточно какого-нибудь одноплатного компьютера, например Raspberry Pi)
- Доменное имя
- SSL сертификат для работы HTTPS (можно использовать бесплатный от Let's Entrypt)
- Этот проект основан на Flask, поэтому нужен Python 3.x.x и установленный Flask
Установка
- Склонируйте репозиторий к себе на сервер
- Отредактируйте alice.wsgi и введите корректный путь к проекту
- Разверните проект на веб-сервере с помощью WSGI, не забудьте разрешить заголовки с авторизацией
- Идём на https://dialogs.yandex.ru/ и нажимаем "Создать навык" -> "Создать диалог" -> "Умный дом"
- Заполняем название (не принципиально)
- Заполняем Endpoint URL: https://ваш-домен/
- Не показывать в каталоге -> ставим галочку
- Официальный навык -> нет
- Заполняем остальные поля и загружаем иконку - всё это абсолютно неважно для приватного навыка
- Нажимаем "Авторизация" -> "оздать"
- Придумываем, запоминаем и вписываем идентификатор приложения и секрет
- URL авторизации: https://ваш-домен/auth/
- URL для получения токена: https://ваш-домен/token/
- "Сохранить"->"Cохранить"->"На модерацию" - модерация должна пройти мгновенно в случае приватного навыка
- "Опубликовать"
- Отредактируйте config.py и введите CLIENT_ID и CLIENT_SECRET, которые вы указали, также укажите USERS_DIRECTORY, TOKENS_DIRECTORY, and DEVICES_DIRECTORY - пути к директориям users, tokens and devices
- Рекомендуется сделать chmod go-rwx tokens users
Как использовать
- Создайте файл имя-пользователя.json в директории users и напишите JSON, в котором должны быть пароль пользователя и доступные ему устройства, например:
{
"password": "test",
"devices": [
"pc"
]
}
- Создайте файл имя-устройства.json в директории devices и напишите JSON с описанием устройства в соответствии с документацией Яндекса: https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/device-types-docpage/
Например:
{
"name": "Компьютер",
"description": "Основной компьютер",
"room": "Моя комната",
"type": "devices.types.switch",
"capabilities": [
{
"type": "devices.capabilities.on_off",
"retrievable": true
}
],
"device_info": {
"manufacturer": "Cluster",
"model": "0",
"hw_version": "1.0",
"sw_version": "1.0"
}
}
- Создайте файл имя-устройства.py в директории devices и напишите Python скрипт с двумя методами: *query(capability_type, instance) и *command(capability_type, instance, value, relative)
Пример скрипта для включения/выключения компьютера:
import subprocess
def pc_query(capability_type, instance):
if capability_type == "devices.capabilities.on_off":
p = subprocess.run(["ping", "-c", "1", "192.168.0.2"], stdout=subprocess.PIPE)
state = p.returncode == 0
# Возвращаем состояние и опционально instance
return state, "on"
def pc_action(capability_type, instance, value, relative):
if capability_type == "devices.capabilities.on_off":
if value:
subprocess.run(["wakeonlan", "-i", "192.168.0.255", "00:11:22:33:44:55"])
else:
subprocess.run(["sh", "-c", "echo shutdown -h | ssh [email protected]"])
return "DONE"
Первая функция должна возвращать текущее состояние устройства и опционально instance (если он не указан ни в запросе, ни в описании устройства), а вторая используется для управления им. В параметрах capability_type и instance передаётся, чем мы управляем, а в параметрах value и relative само значение. Подробности опять же смотрите в документации Яндекса.
- Откройте вкладку "Тестирование" в панели управления Яндекс диалогами и попробуйте связать аккаунты, используя ваши имя пользователя и пароль
- Проверяйте, должно работать как в панели для тестирования, так и на всех устройствах привязанных к вашему аккаунту