Files
local_yandex_station/README.md
T

531 lines
14 KiB
Markdown

# Alice Stations Plugin
Плагин для поиска Яндекс Станций, сохранения токена, генерации конфигов для Loxone и wb-rules и запуска web UI.
## Содержание
- [Что умеет плагин](#что-умеет-плагин)
- [Что не умеет и слабые места](#что-не-умеет-и-слабые-места)
- [Структура проекта](#структура-проекта)
- [Куда устанавливать](#куда-устанавливать)
- [Быстрый старт](#быстрый-старт)
- [Полная установка](#полная-установка)
- [Токен](#токен)
- [CLI](#cli)
- [Прямые 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
cd /путь/к/распакованному/репозиторию
chmod +x *.sh
./install.sh
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
./cli.sh web
```
После этого web UI обычно доступен по адресу:
```text
http://<ip-устройства>:9140/
```
## Полная установка
### 1. Установить системные зависимости
```bash
sudo apt update
sudo apt install -y python3 python3-venv python3-pip
```
Для более удобной синхронизации в `/opt` желателен `rsync`, но без него установка тоже работает.
### 2. Распаковать проект и запустить установку
```bash
cd /путь/к/распакованному/репозиторию
chmod +x *.sh
./install.sh
```
Что делает `install.sh`:
- копирует проект в `/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
```
Или через CLI/web-команду:
```bash
cd /opt/shd/plugins/alice
./cli.sh web --token 'YANDEX_OAUTH_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
```
Если токен неверный, при обновлении списка станций будет ошибка:
```text
YANDEX_OAUTH_TOKEN invalid: update token and retry
```
## 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
```
## Прямые 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_templates.zip
```
Ключевые файлы:
- `token.txt` — OAuth-токен;
- `data/config.json` — сохранённый IP контроллера и служебные настройки;
- `data/stations.json` — найденные станции;
- `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
```