alice-smart-home icon indicating copy to clipboard operation
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 само значение. Подробности опять же смотрите в документации Яндекса.

  • Откройте вкладку "Тестирование" в панели управления Яндекс диалогами и попробуйте связать аккаунты, используя ваши имя пользователя и пароль
  • Проверяйте, должно работать как в панели для тестирования, так и на всех устройствах привязанных к вашему аккаунту