Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/clusterm/alice-smart-home

Simple Python framework to control your DIY smart home devices using Alice from Yandex
https://github.com/clusterm/alice-smart-home

home-automation smarthome yandex

Last synced: about 1 month ago
JSON representation

Simple Python framework to control your DIY smart home devices using Alice from Yandex

Awesome Lists containing this project

README

        

# 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, в котором должны быть пароль пользователя и доступные ему устройства, например:
```json
{
"password": "test",
"devices": [
"pc"
]
}
```

* Создайте файл _имя-устройства_.json в директории __devices__ и напишите JSON с описанием устройства в соответствии с документацией Яндекса: https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/device-types-docpage/

Например:
```json
{
"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)

Пример скрипта для включения/выключения компьютера:
```python
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__ само значение. Подробности опять же смотрите в документации Яндекса.

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