# 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://: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 ``` Что делает команда: - берёт файлы из `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 ``` ### Запустить 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://: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).