603 lines
17 KiB
Markdown
603 lines
17 KiB
Markdown
# Alice Stations Plugin
|
||
|
||
Плагин для поиска Яндекс Станций, сохранения токена, генерации конфигов для Loxone и wb-rules и запуска web UI.
|
||
|
||
Если проект полезен, можно поддержать дальнейшую разработку рублем: https://boosty.to/smd.monster/donate
|
||
|
||
## Содержание
|
||
|
||
- [Что умеет плагин](#что-умеет-плагин)
|
||
- [Что не умеет и слабые места](#что-не-умеет-и-слабые-места)
|
||
- [Структура проекта](#структура-проекта)
|
||
- [Куда устанавливать](#куда-устанавливать)
|
||
- [Быстрый старт](#быстрый-старт)
|
||
- [Полная установка](#полная-установка)
|
||
- [Токен](#токен)
|
||
- [Как получить токен](#как-получить-токен)
|
||
- [CLI](#cli)
|
||
- [Примеры wb-rules](#примеры-wb-rules)
|
||
- [Прямые Python-команды](#прямые-python-команды)
|
||
- [Web UI](#web-ui)
|
||
- [Systemd](#systemd)
|
||
- [Где лежат файлы](#где-лежат-файлы)
|
||
- [Диагностика и логи](#диагностика-и-логи)
|
||
- [Частые ошибки](#частые-ошибки)
|
||
- [Удаление](#удаление)
|
||
|
||
## Что умеет плагин
|
||
|
||
- сохранить OAuth-токен Яндекса;
|
||
- получить список станций из облака и сопоставить его с локальным mDNS-поиском;
|
||
- сохранить итоговый список в `data/stations.json`;
|
||
- сгенерировать конфиги для `configs/loxone`;
|
||
- сгенерировать конфиги для `configs/wb-rules`;
|
||
- скачать ZIP-архивы через web UI;
|
||
- на Wiren Board установить `wb-rules` шаблоны прямо из web UI или CLI;
|
||
- поднять web UI для первичной настройки.
|
||
|
||
## Что не умеет и слабые места
|
||
|
||
- без валидного OAuth-токена обновление списка станций не работает;
|
||
- если станции и контроллер находятся в разных сетях, локальные IP могут не определиться;
|
||
- web UI не исправляет проблемы сети или токена, он только показывает состояние и запускает команды;
|
||
- генерация шаблонов зависит от `data/stations.json`, поэтому сначала всегда нужен поиск колонок;
|
||
- `wb-install` имеет смысл только на Wiren Board или на системе, где есть `/etc/wb-rules`.
|
||
|
||
## Структура проекта
|
||
|
||
```text
|
||
alice/
|
||
├── alice_plugin.py
|
||
├── cli.sh
|
||
├── configs/
|
||
│ ├── loxone/
|
||
│ └── wb-rules/
|
||
├── data/
|
||
├── install.sh
|
||
├── README.md
|
||
├── requirements.txt
|
||
├── start.sh
|
||
├── start_plugin_web.sh
|
||
├── systemd/
|
||
│ ├── shd-alice-plugin.service
|
||
│ └── shd-alice.service
|
||
├── web/
|
||
│ └── index.html
|
||
└── yastation.py
|
||
```
|
||
|
||
Назначение файлов:
|
||
|
||
- `alice_plugin.py` — CLI и backend для web UI;
|
||
- `yastation.py` — демон управления станциями и HTTP API на `:9124`;
|
||
- `cli.sh` — основной способ работы из терминала;
|
||
- `start.sh` — запуск демона для systemd;
|
||
- `start_plugin_web.sh` — запуск web UI для systemd;
|
||
- `install.sh` — установка в `/opt/shd/plugins/alice`, создание `.venv`, каталогов и systemd-юнитов.
|
||
|
||
## Куда устанавливать
|
||
|
||
Штатный путь проекта зафиксирован:
|
||
|
||
```text
|
||
/opt/shd/plugins/alice
|
||
```
|
||
|
||
`install.sh` сам синхронизирует текущий каталог в этот путь. После установки основной рабочий каталог должен быть именно таким:
|
||
|
||
```bash
|
||
/opt/shd/plugins/alice
|
||
```
|
||
|
||
## Быстрый старт
|
||
|
||
```bash
|
||
apt update
|
||
apt install -y git python3 python3-venv python3-pip
|
||
|
||
mkdir -p /opt/shd/plugins
|
||
cd /opt/shd/plugins
|
||
git clone https://git.xyz.su/shd/local_yandex_station.git alice
|
||
cd alice
|
||
chmod +x *.sh
|
||
./install.sh --in-place
|
||
|
||
printf %s 'YANDEX_OAUTH_TOKEN' > /opt/shd/plugins/alice/token.txt
|
||
chmod 600 /opt/shd/plugins/alice/token.txt
|
||
|
||
cd /opt/shd/plugins/alice
|
||
./cli.sh columns
|
||
./cli.sh loxone
|
||
./cli.sh wb-rules
|
||
systemctl enable --now shd-alice.service shd-alice-plugin.service
|
||
|
||
curl -sS http://127.0.0.1:9124/health
|
||
curl -sS http://127.0.0.1:9140/api/status
|
||
```
|
||
|
||
После этого web UI обычно доступен по адресу:
|
||
|
||
```text
|
||
http://<ip-устройства>:9140/
|
||
```
|
||
|
||
## Полная установка
|
||
|
||
### 1. Установить системные зависимости
|
||
|
||
```bash
|
||
sudo apt update
|
||
sudo apt install -y python3 python3-venv python3-pip
|
||
```
|
||
|
||
Для более удобной синхронизации в `/opt` желателен `rsync`, но без него установка тоже работает.
|
||
|
||
### 2. Клонировать проект в рабочий путь и запустить установку
|
||
|
||
```bash
|
||
mkdir -p /opt/shd/plugins
|
||
cd /opt/shd/plugins
|
||
git clone https://git.xyz.su/shd/local_yandex_station.git alice
|
||
cd alice
|
||
chmod +x *.sh
|
||
./install.sh --in-place
|
||
```
|
||
|
||
Что делает `install.sh`:
|
||
|
||
- при запуске с `--in-place` работает прямо из `/opt/shd/plugins/alice`;
|
||
- создаёт `.venv`, если его нет;
|
||
- ставит зависимости из `requirements.txt`;
|
||
- создаёт каталоги `data/`, `configs/loxone/`, `configs/wb-rules/`;
|
||
- копирует systemd-юниты в `/etc/systemd/system/`;
|
||
- выполняет `systemctl daemon-reload` и `systemctl enable` для сервисов.
|
||
|
||
### 3. Сохранить токен
|
||
|
||
Через файл:
|
||
|
||
```bash
|
||
printf %s 'YANDEX_OAUTH_TOKEN' > /opt/shd/plugins/alice/token.txt
|
||
chmod 600 /opt/shd/plugins/alice/token.txt
|
||
```
|
||
|
||
Разовый запуск через переменную окружения (не для постоянного хранения):
|
||
|
||
```bash
|
||
export YANDEX_TOKEN='YANDEX_OAUTH_TOKEN'
|
||
./cli.sh columns
|
||
unset YANDEX_TOKEN
|
||
```
|
||
|
||
### 4. Обновить список станций
|
||
|
||
```bash
|
||
cd /opt/shd/plugins/alice
|
||
./cli.sh columns
|
||
```
|
||
|
||
### 5. Сгенерировать конфиги
|
||
|
||
```bash
|
||
./cli.sh loxone
|
||
./cli.sh wb-rules
|
||
```
|
||
|
||
### 6. Включить сервисы
|
||
|
||
```bash
|
||
sudo systemctl enable --now shd-alice.service shd-alice-plugin.service
|
||
```
|
||
|
||
## Токен
|
||
|
||
Проект ищет токен в таком порядке:
|
||
|
||
1. аргумент `--token`;
|
||
2. переменная окружения `YANDEX_TOKEN`;
|
||
3. файл `token.txt`;
|
||
4. `data/config.json`.
|
||
|
||
Надёжнее всего использовать `token.txt`:
|
||
|
||
```bash
|
||
/opt/shd/plugins/alice/token.txt
|
||
```
|
||
|
||
Рекомендация по безопасности:
|
||
|
||
- для постоянной работы храни токен только в `token.txt` с правами `600`;
|
||
- `YANDEX_TOKEN` используй только временно для разовых команд, затем делай `unset YANDEX_TOKEN`.
|
||
|
||
Если токен неверный, при обновлении списка станций будет ошибка:
|
||
|
||
```text
|
||
YANDEX_OAUTH_TOKEN invalid: update token and retry
|
||
```
|
||
|
||
## Как получить токен
|
||
|
||
Создать собственное OAuth-приложение для этого сценария нельзя. Обычно используют токен,
|
||
полученный через официальные клиенты Яндекс.Музыки.
|
||
|
||
Рабочие варианты:
|
||
|
||
- Веб-сервис (может работать не для всех аккаунтов): [music-yandex-bot.ru](https://music-yandex-bot.ru/)
|
||
- Android-приложение (APK): [MarshalX/yandex-music-token releases](https://github.com/MarshalX/yandex-music-token/releases)
|
||
- Расширение для Google Chrome: [Yandex Music Token (Chrome Web Store)](https://chrome.google.com/webstore/detail/yandex-music-token/lcbjeookjibfhjjopieifgjnhlegmkib)
|
||
- Расширение для Mozilla Firefox: [Yandex Music Token (Firefox Add-ons)](https://addons.mozilla.org/en-US/firefox/addon/yandex-music-token/)
|
||
|
||
Во всех вариантах выше итог один: получить и скопировать OAuth-токен.
|
||
Исходный код инструментов открыт: [github.com/MarshalX/yandex-music-token](https://github.com/MarshalX/yandex-music-token).
|
||
|
||
## CLI
|
||
|
||
Основной интерфейс из терминала — `cli.sh`.
|
||
|
||
Перед использованием:
|
||
|
||
```bash
|
||
cd /opt/shd/plugins/alice
|
||
```
|
||
|
||
### Поиск колонок
|
||
|
||
```bash
|
||
./cli.sh columns
|
||
```
|
||
|
||
С токеном напрямую:
|
||
|
||
```bash
|
||
./cli.sh --token 'YANDEX_OAUTH_TOKEN' columns
|
||
```
|
||
|
||
С таймаутом локального поиска:
|
||
|
||
```bash
|
||
./cli.sh columns --timeout 5
|
||
```
|
||
|
||
Что делает команда:
|
||
|
||
- проверяет токен;
|
||
- читает облачный список устройств;
|
||
- делает локальный mDNS-поиск;
|
||
- объединяет результаты;
|
||
- пишет `data/stations.json`.
|
||
|
||
### Генерация Loxone
|
||
|
||
```bash
|
||
./cli.sh loxone
|
||
```
|
||
|
||
С ручным IP контроллера:
|
||
|
||
```bash
|
||
./cli.sh loxone --controller-host 192.168.1.50
|
||
```
|
||
|
||
Что создаётся:
|
||
|
||
- каталоги по станциям в `configs/loxone/`;
|
||
- `VO.xml`;
|
||
- `VI.xml`;
|
||
- `README.md` по каждой станции;
|
||
- `configs/loxone/loxone_templates.zip`.
|
||
|
||
### Генерация wb-rules
|
||
|
||
```bash
|
||
./cli.sh wb-rules
|
||
```
|
||
|
||
С ручным IP контроллера:
|
||
|
||
```bash
|
||
./cli.sh wb-rules --controller-host 192.168.1.50
|
||
```
|
||
|
||
Что создаётся:
|
||
|
||
- каталоги по станциям в `configs/wb-rules/`;
|
||
- `wb-rules-station.js`;
|
||
- `README.md` по каждой станции;
|
||
- `configs/wb-rules/wb_rules_templates.zip`.
|
||
|
||
### Установка wb-rules в систему
|
||
|
||
```bash
|
||
./cli.sh wb-install
|
||
```
|
||
|
||
Для одной станции:
|
||
|
||
```bash
|
||
./cli.sh wb-install --station-id <station_id>
|
||
```
|
||
|
||
Что делает команда:
|
||
|
||
- берёт файлы из `configs/wb-rules/`;
|
||
- копирует их в `/etc/wb-rules/`;
|
||
- перезапускает `wb-rules`.
|
||
|
||
### Запуск web UI
|
||
|
||
```bash
|
||
./cli.sh web
|
||
```
|
||
|
||
С токеном при первом запуске:
|
||
|
||
```bash
|
||
./cli.sh --token 'YANDEX_OAUTH_TOKEN' web
|
||
```
|
||
|
||
С другим адресом и портом:
|
||
|
||
```bash
|
||
./cli.sh web --host 0.0.0.0 --port 9140
|
||
```
|
||
|
||
## Примеры wb-rules
|
||
|
||
Есть готовый файл:
|
||
|
||
```text
|
||
configs/wb-rules/wb-rules-examples.js
|
||
```
|
||
|
||
- `wb-rules-examples.js`:
|
||
- примеры действий для одной колонки:
|
||
- `player` (`play`, `stop`, `next`, `prev`);
|
||
- `tts`;
|
||
- `command`;
|
||
- `audio + tts` (через параметры `tts_audio` + `text`).
|
||
|
||
Как привязать к конкретной колонке:
|
||
|
||
1. возьми IP нужной станции (или `id` из `data/stations.json`);
|
||
2. подставь его в строку:
|
||
|
||
```js
|
||
var STATION = "PUT_STATION_IP_HERE";
|
||
```
|
||
|
||
3. скопируй файл в `/etc/wb-rules/` и перезапусти `wb-rules`.
|
||
|
||
## Прямые Python-команды
|
||
|
||
Все публичные Python-команды задокументированы ниже. Их можно использовать напрямую, но штатный способ — `cli.sh`.
|
||
|
||
### Обновить станции
|
||
|
||
```bash
|
||
python3 alice_plugin.py --token 'YANDEX_OAUTH_TOKEN' stations-refresh
|
||
```
|
||
|
||
Дополнительно:
|
||
|
||
```bash
|
||
python3 alice_plugin.py --token 'YANDEX_OAUTH_TOKEN' stations-refresh --timeout 5
|
||
```
|
||
|
||
### Сгенерировать Loxone
|
||
|
||
```bash
|
||
python3 alice_plugin.py templates-loxone
|
||
```
|
||
|
||
С ручным IP контроллера:
|
||
|
||
```bash
|
||
python3 alice_plugin.py templates-loxone --controller-host 192.168.1.50
|
||
```
|
||
|
||
### Сгенерировать wb-rules
|
||
|
||
```bash
|
||
python3 alice_plugin.py templates-wb-rules
|
||
```
|
||
|
||
С ручным IP контроллера:
|
||
|
||
```bash
|
||
python3 alice_plugin.py templates-wb-rules --controller-host 192.168.1.50
|
||
```
|
||
|
||
### Установить wb-rules
|
||
|
||
```bash
|
||
python3 alice_plugin.py wb-install
|
||
```
|
||
|
||
Для одной станции:
|
||
|
||
```bash
|
||
python3 alice_plugin.py wb-install --station-id <station_id>
|
||
```
|
||
|
||
### Запустить web UI
|
||
|
||
```bash
|
||
python3 alice_plugin.py --token 'YANDEX_OAUTH_TOKEN' web
|
||
```
|
||
|
||
На другом адресе/порту:
|
||
|
||
```bash
|
||
python3 alice_plugin.py web --host 0.0.0.0 --port 9140
|
||
```
|
||
|
||
## Web UI
|
||
|
||
Web UI умеет:
|
||
|
||
- сохранить токен;
|
||
- сохранить IP контроллера;
|
||
- обновить список колонок;
|
||
- скачать ZIP для Loxone;
|
||
- скачать ZIP для wb-rules;
|
||
- на Wiren Board установить `wb-rules` по кнопке.
|
||
|
||
Страница лежит по адресу:
|
||
|
||
```text
|
||
http://<ip-устройства>:9140/
|
||
```
|
||
|
||
Если станции ещё не найдены, страница покажет пустой список и предложит сначала сохранить токен и нажать кнопку поиска.
|
||
|
||
## Systemd
|
||
|
||
В проекте есть два сервиса:
|
||
|
||
- `shd-alice.service` — основной демон `yastation.py`;
|
||
- `shd-alice-plugin.service` — web UI.
|
||
|
||
Юниты используют фиксированный путь:
|
||
|
||
```text
|
||
/opt/shd/plugins/alice
|
||
```
|
||
|
||
Проверка состояния:
|
||
|
||
```bash
|
||
sudo systemctl status shd-alice.service
|
||
sudo systemctl status shd-alice-plugin.service
|
||
```
|
||
|
||
Логи:
|
||
|
||
```bash
|
||
journalctl -u shd-alice.service -f
|
||
journalctl -u shd-alice-plugin.service -f
|
||
```
|
||
|
||
Ручной запуск:
|
||
|
||
```bash
|
||
cd /opt/shd/plugins/alice
|
||
./start.sh
|
||
./start_plugin_web.sh
|
||
```
|
||
|
||
## Где лежат файлы
|
||
|
||
```text
|
||
/opt/shd/plugins/alice/
|
||
├── token.txt
|
||
├── data/
|
||
│ ├── config.json
|
||
│ └── stations.json
|
||
└── configs/
|
||
├── loxone/
|
||
│ └── loxone_templates.zip
|
||
└── wb-rules/
|
||
├── wb-rules-examples.js
|
||
└── wb_rules_templates.zip
|
||
```
|
||
|
||
Ключевые файлы:
|
||
|
||
- `token.txt` — OAuth-токен;
|
||
- `data/config.json` — сохранённый IP контроллера и служебные настройки;
|
||
- `data/stations.json` — найденные станции;
|
||
- `configs/wb-rules/wb-rules-examples.js` — примеры `player/tts/command/audio+tts` для одной станции;
|
||
- `configs/loxone/loxone_templates.zip` — ZIP для Loxone;
|
||
- `configs/wb-rules/wb_rules_templates.zip` — ZIP для wb-rules.
|
||
|
||
## Диагностика и логи
|
||
|
||
Проверить, что Python и зависимости в порядке:
|
||
|
||
```bash
|
||
cd /opt/shd/plugins/alice
|
||
.venv/bin/python3 -m py_compile alice_plugin.py yastation.py
|
||
```
|
||
|
||
Проверить web API:
|
||
|
||
```bash
|
||
curl http://127.0.0.1:9140/api/status
|
||
```
|
||
|
||
Проверить список станций руками:
|
||
|
||
```bash
|
||
./cli.sh columns
|
||
```
|
||
|
||
Проверить генерацию шаблонов:
|
||
|
||
```bash
|
||
./cli.sh loxone
|
||
./cli.sh wb-rules
|
||
```
|
||
|
||
## Частые ошибки
|
||
|
||
### `YANDEX_OAUTH_TOKEN invalid: update token and retry`
|
||
|
||
Токен неверный или протух. Перезапиши `token.txt` и повтори поиск колонок.
|
||
|
||
### `stations.json is empty, run station refresh first`
|
||
|
||
Сначала выполни:
|
||
|
||
```bash
|
||
./cli.sh columns
|
||
```
|
||
|
||
### `No stations found`
|
||
|
||
Локальный поиск ничего не нашёл. Проверь:
|
||
|
||
- что станции в той же сети;
|
||
- что mDNS не режется роутером/VLAN;
|
||
- что токен валиден и облачный список вообще отдаётся.
|
||
|
||
### `No such file or directory` в systemd
|
||
|
||
Обычно проект лежит не в `/opt/shd/plugins/alice`. Перезапусти установку:
|
||
|
||
```bash
|
||
./install.sh
|
||
```
|
||
|
||
### `/etc/wb-rules not found`
|
||
|
||
Команда `wb-install` запускается не на Wiren Board и не на системе с установленным `wb-rules`.
|
||
|
||
## Удаление
|
||
|
||
Остановить сервисы:
|
||
|
||
```bash
|
||
sudo systemctl disable --now shd-alice.service shd-alice-plugin.service
|
||
```
|
||
|
||
Удалить юниты:
|
||
|
||
```bash
|
||
sudo rm -f /etc/systemd/system/shd-alice.service
|
||
sudo rm -f /etc/systemd/system/shd-alice-plugin.service
|
||
sudo systemctl daemon-reload
|
||
```
|
||
|
||
Удалить каталог проекта:
|
||
|
||
```bash
|
||
sudo rm -rf /opt/shd/plugins/alice
|
||
```
|
||
|
||
## Лицензия
|
||
|
||
Проект распространяется по пользовательской лицензии.
|
||
Личное (некоммерческое) использование разрешено.
|
||
Коммерческое использование и перепубликация возможны только после обсуждения по `info@xyz.su` и с обязательным указанием авторства.
|
||
Полный текст: [LICENSE](LICENSE).
|