[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-106522":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":21,"topics":23,"createdAt":9,"pushedAt":30,"updatedAt":31,"readmeContent":32,"aiSummary":9,"trendingCount":15,"starSnapshotCount":15,"syncStatus":16,"lastSyncTime":33,"discoverSource":34},106522,"yapanel-web","dimap\u002Fyapanel-web","dimap","Веб-панель для Яндекс Станций (Лайт 2, Мини 3, Мини 3 Про, Станция 2) с root-доступом по adb: плеер, будильник без интернета, заставка, подсветка, Bluetooth, графики, консоль",null,"Python",65,19,59,14,0,2,6,10,51.5,"Other",false,"main",[24,25,26,27,28,29],"adb","alice","docker","quasar","web-panel","yandex-station","2026-11-02 10:17:46","2026-11-02 10:17:52","# yapanel — веб-панель для Станций\n\nЛокальная веб-панель для **Станций с root-доступом по adb**. Разрабатывалась в первую очередь под Лайт 2, но так же в некоторой степени поддерживает Лайт, Мини 3 Про, Станции 2 и Мини 3 (см. [Другие модели](#другие-модели-и-несколько-колонок)). Задачей проекта было расширить возможности колонки поверх Алисы, без установки кастомных бекендов. Многие функции работают на стороне панели, работая с колонкой по adb. На колонку ничего не ставится без разрешения пользователя\n\n> [!WARNING]\n> Неофициальный проект, не связан с Яндексом и не одобрен им. Панель работает только на колонке, где уже есть root-доступ по adb,\n> и сама колонку не рутирует. Консоль, файлы и некоторые функции дают полный доступ к системе колонки:\n> используйте на свой риск.\n\n![Обзор](docs\u002Fscreenshots\u002Foverview.png)\n\n\u003Ctable>\n  \u003Ctr>\n    \u003Ctd width=\"50%\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fplayer.png\" alt=\"Плеер\">\u003C\u002Ftd>\n    \u003Ctd width=\"50%\">\u003Cimg src=\"docs\u002Fscreenshots\u002Falarm.png\" alt=\"Будильник\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd align=\"center\">Плеер: текст песни, очередь, похожие треки\u003C\u002Ftd>\n    \u003Ctd align=\"center\">Локальный будильник\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd width=\"50%\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fcharts.png\" alt=\"Графики\">\u003C\u002Ftd>\n    \u003Ctd width=\"50%\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fconsole.png\" alt=\"Консоль\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd align=\"center\">Графики за сутки\u003C\u002Ftd>\n    \u003Ctd align=\"center\">Интерактивная root-консоль\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd width=\"50%\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fanimations.png\" alt=\"Анимации\">\u003C\u002Ftd>\n    \u003Ctd width=\"50%\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fassistant.png\" alt=\"Ассистент\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd align=\"center\">Редактор анимаций: часы по кадрам с яркостью сегментов, кольцо\u003C\u002Ftd>\n    \u003Ctd align=\"center\">Свой голосовой ассистент на любой OpenAI-совместимой модели\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd width=\"50%\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fscenes.png\" alt=\"Сценарии\">\u003C\u002Ftd>\n    \u003Ctd width=\"50%\">\u003Cimg src=\"docs\u002Fscreenshots\u002Foverview-dark.png\" alt=\"Тёмная тема\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd align=\"center\">Сценарии на поле нод: условия, речь Алисы, вопрос ассистенту\u003C\u002Ftd>\n    \u003Ctd align=\"center\">Тёмная тема\u003C\u002Ftd>\n  \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## Содержание\n\n- [Возможности](#возможности)\n- [Что нужно](#что-нужно)\n- [Установка](#установка): [Windows](#windows--запускать-когда-нужно) · [macOS](#macos--запускать-когда-нужно) · [Linux](#linux--запускать-когда-нужно) · [Docker](#docker--постоянно-на-сервере) · [Android](#android--приложение-на-телефоне)\n- [Другие модели и несколько колонок](#другие-модели-и-несколько-колонок)\n- [Параметры](#параметры)\n- [Безопасность](#безопасность)\n- [Что панель ставит на колонку](#что-панель-ставит-на-колонку)\n- [Как это устроено](#как-это-устроено)\n- [Благодарности и лицензии](#благодарности-и-лицензии)\n\n## Возможности\n\n**Основной функционал**\n- **Обзор** — графики состояния колонки; 3D-модель колонки, изменяющаяся в реальном времени с визуализатор на фоне; управление громкостью, «Сказать на колонке», менеджер звуки колонки, вывод своего текста на дисплей часов. Виджеты можно переставлять и прятать по желанию.\n- **Плеер** — что играет, управление, громкость,текст песни (Яндекс Музыка или [LRCLIB](https:\u002F\u002Flrclib.net)), очередь, похожие треки, об исполнителе.\n  Для работы с Яндекс Музыкой необходим вход. Музыку с телефона по Bluetooth плеер тоже показывает.\n- **Локальный будильник** — работает на самой колонке без интернета, в отличии от встроенного. На звук: «Моя волна», утреннее шоу,\n  любой запрос Алисе или свой звук (если нет интернета — играет звук). Нарастание громкости, «отложить», выключение кнопкой на колонке или голосом.\n- **Сценарии** — мощная система, подобная будильнику, но позволяет выполнить ряд действий по очереди. Вызываются по времени, после включения колонки, по команде ассистенту (не Алисе) или вручную. Менять сценарии можно просто списком, или если хочется добавить условий - системой нод. На данный момент набор функций простой и касается в основном функций самой колонки, в будущем планируется расширятся.\n- **Ассистент** — свой голосовой помощник рядом с Алисой. «Алиса, спроси GPT, …» уходит выбранной модели вместо Алисы. Настроить можно любой OpenAI-совместимый API, свой системный промт, прокси для ассистента. Отвечает голосом Алисы или OpenAI-совместимым синтезатором (Лично я рекомендую Silero). Работает на самой колонке, компьютер не нужен. **Внимание!** Голосовой вопрос по-прежнему распознаёт облако Яндекса. Всё что вы спрашиваете у ассистента, Яндекс всё равно видет. Ответ модели — тоже, если его читает Алиса.\n\n**Колонка**\n- **Анимации** — редактор любых анимаций часов и кольца. Встроенные анимации можно изменить (стандартная не стирается: своя поверх её, можно легко вернуть) или\n  добавить свою отдельную.\n- **LED-панель** (Станция 2) — редактор всех 88 диодов панели, включая логотип: заливка, кисть, пресеты, 11 эффектов,\n  штатные анимации прошивки и свой GIF. Работает через штатный `led-play`, на колонке ничего не оставляет.\n- **Приложения** — [yam 2](https:\u002F\u002Fgithub.com\u002Fnyakokitsu\u002Fyam), пакетный менеджер на колонке: панель ставит его в\n  `\u002Fdata\u002Fyam`, подключает каталог, ставит и удаляет пакеты под модель колонки, проверяет и чинит их (`doctor`\u002F`repair`). Службы пакетов (например, Luna) yam сам не запускает — это делает панель: «Запустить» и «При загрузке» через хук. Так же, есть поддержка старых пакетов yam (yamd, v0.1) с реестром\n  [yapkg](https:\u002F\u002Fgithub.com\u002Fnyakokitsu\u002Fyapkg).\n- **Файлы** — просмотр, правка, загрузка и скачивание, проигрывание аудио прямо с колонки.\n- **Консоль** — root терминал (xterm.js).\n- **Bluetooth** — список сопряжённых устройств и управление ими.\n- **Звук через Bluetooth-колонку** — вывод звука с Станции на внешнюю колонку. Станция остаётся «мозгом» (слушает и отвечает), а Алиса, музыка и её звуки\n  играют из подключённой Bluetooth-колонки. Там же — **эквалайзер** для Bluetooth-выхода с пресетами или своими собственнымы настройками.\n\n**Состояние**\n- **Графики** — процессор, температура, память, диск, Wi‑Fi, нагрузка и воспроизведение за сутки, события\n  (перезагрузки, обрывы связи, будильники).\n- **Логи** — логи демонов Quasar и dmesg с фильтром, а ещё журнал самой панели: что нажимали, чем ответила колонка,\n  обрывы связи. Хранится рядом с панелью (`.panel_journal.jsonl`, последние 1000 записей), тексты запросов в него не попадают.\n\n**Панель**\n- Пароль, HTTPS со своим сертификатом, установка как приложение (PWA), светлая и тёмная тема, цвет акцента.\n- Резервная копия всего, что панель поставила на колонку, и **полное удаление в один клик**.\n\n## Что нужно\n\n- Станция с **root-доступом по adb** — по сети или по USB.\n- Компьютер, Android смартфон или сервер в той же сети:\n  - **Python 3.9+** (только стандартная библиотека) и **adb** ([Android platform-tools](https:\u002F\u002Fdeveloper.android.com\u002Ftools\u002Freleases\u002Fplatform-tools) 28 или новее — старый adb, например 1.0.31 из старых дистрибутивов, панель не примет);\n  - для заставки и анимаций часов (формат zstd) — **Python 3.14+** или программа **zstd**;\n  - по желанию **ffmpeg** — чтобы играть mp3\u002Fogg\u002Fopus и менять звуки (без него — только WAV) и **openssl** — для HTTPS;\n  - или **Docker** — там всё уже есть.\n\n## Установка\n\n### Windows\n\n1. Скачайте со страницы [Releases](https:\u002F\u002Fgithub.com\u002Fdimap\u002Fyapanel-web\u002Freleases\u002Flatest) архив\n   `…-windows-x64.zip` (для ARM-ноутбуков — `…-windows-arm64.zip`) и распакуйте в любую папку.\n2. Дважды щёлкните **`start.bat`**.\n\nPython в архиве уже есть. Остальное `start.bat` сделает сам. Если в системе нет adb или ffmpeg, он предложит скачать их\nв папку `runtime` рядом с панелью: platform-tools с сайта Google\n(~7 МБ) и по желанию ffmpeg (~110 МБ, нужен для mp3\u002Fogg и своих звуков). В систему ничего не устанавливается,\nправа администратора не нужны; чтобы убрать всё, достаточно удалить папку. При первом запуске панель откроется\nв браузере и сама найдёт колонку в сети (если колонок несколько — даст выбрать), а запомнит адрес.\n\n### macOS\n\n1. Установите [Homebrew](https:\u002F\u002Fbrew.sh), если его ещё нет, затем зависимости в Терминале:\n\n   ```sh\n   brew install python ffmpeg zstd\n   brew install --cask android-platform-tools\n   ```\n\n   Python и adb нужны для запуска; ffmpeg — для mp3\u002Fogg и своих звуков, zstd — для анимаций\n   при Python ниже 3.14. [Android platform-tools](https:\u002F\u002Fformulae.brew.sh\u002Fcask\u002Fandroid-platform-tools)\n   можно не ставить повторно, если adb уже установлен через Android Studio.\n\n2. Скачайте **Code → Download ZIP** и распакуйте архив или склонируйте репозиторий:\n\n   ```sh\n   git clone https:\u002F\u002Fgithub.com\u002Fdimap\u002Fyapanel-web.git\n   cd yapanel-web\n   ```\n\n3. Дважды щёлкните **`start.command`** в Finder. Откроется Терминал, а панель — в браузере: при первом запуске\n   она сама найдёт колонку в сети (или подключится по USB) и запомнит её адрес.\n   Если macOS блокирует открытие скачанного скрипта, запустите его из Терминала в папке проекта:\n\n   ```sh\n   sh start.command\n   ```\n\nМожно сразу передать адрес и параметры:\n\n```sh\n.\u002Fstart.sh 192.168.1.50     # дальше достаточно .\u002Fstart.sh или start.command\n```\n\nСкрипт находит Homebrew в `\u002Fopt\u002Fhomebrew` на Apple Silicon и `\u002Fusr\u002Flocal` на Intel.\nadb также ищется в `~\u002FLibrary\u002FAndroid\u002Fsdk\u002Fplatform-tools`, `ANDROID_HOME` и `ANDROID_SDK_ROOT`.\nHTTPS использует доступный `openssl`; свой путь можно задать через `PANEL_OPENSSL`.\nПанель: `http:\u002F\u002F127.0.0.1:8765\u002F`. Остановить — Ctrl+C в окне Терминала.\n\n### Linux\n\n```sh\n# Debian\u002FUbuntu: sudo apt install python3 adb ffmpeg zstd      Fedora: sudo dnf install python3 android-tools ffmpeg zstd\ngit clone https:\u002F\u002Fgithub.com\u002Fdimap\u002Fyapanel-web.git\ncd yapanel-web\n.\u002Fstart.sh                  # первый раз панель сама найдёт колонку в сети и запомнит её адрес\n.\u002Fstart.sh 192.168.1.50     # или сразу IP колонки\n```\n\nПанель откроется на `http:\u002F\u002F127.0.0.1:8765\u002F`. Остановить — Ctrl+C.\n\n### Docker\n\nГотовый образ: **`ghcr.io\u002Fdimap\u002Fyapanel-web`** (amd64, arm64 и armv7 — подойдёт и Raspberry Pi). В нём уже есть всё необходимое.\n\nОдной командой (вместо `192.168.1.50` — IP колонки):\n\n```sh\ndocker run -d --name yapanel-web --network host --restart unless-stopped \\\n  -e ADB_SERIAL=192.168.1.50 -v \"$PWD\u002Fdata:\u002Fdata\" \\\n  -v \u002Fetc\u002Flocaltime:\u002Fetc\u002Flocaltime:ro \\\n  ghcr.io\u002Fdimap\u002Fyapanel-web:latest\n```\n\nИли через Docker Compose — сохраните как `docker-compose.yml` и запустите `docker compose up -d`:\n\n```yaml\nservices:\n  panel:\n    image: ghcr.io\u002Fdimap\u002Fyapanel-web:latest\n    container_name: yapanel-web\n    network_mode: host               # сертификат HTTPS выпишется на адрес сервера в сети\n    environment:\n      ADB_SERIAL: \"192.168.1.50\"     # IP колонки (порт 5555 подставится сам)\n      # PANEL_PORT: \"8765\"\n      # PANEL_HTTPS_PORT: \"8766\"     # 0 — без HTTPS\n    volumes:\n      - .\u002Fdata:\u002Fdata\n      - \u002Fetc\u002Flocaltime:\u002Fetc\u002Flocaltime:ro\n    restart: unless-stopped\n```\n\nПанель: `http:\u002F\u002F\u003Cадрес сервера>:8765\u002F`. Всё своё (вход в Яндекс, пароль, сертификаты, история графиков,\nключ adb) хранится в `.\u002Fdata`.\n\nБудильники и сценарии используют часовой пояс сервера панели. В Linux монтирование\n`\u002Fetc\u002Flocaltime` передаёт его в контейнер, который иначе обычно работает в UTC.\nПосле добавления этого монтирования пересоздайте контейнер и сохраните будильники или\nсценарии заново: часовой пояс копируется на колонку при сохранении. Сверьте время во\nвкладке «Будильник» со временем, на которое назначаете запуск. Если сервер находится\nв другом часовом поясе, вместо `\u002Fetc\u002Flocaltime` слева можно указать файл нужной зоны,\nнапример `\u002Fusr\u002Fshare\u002Fzoneinfo\u002FEurope\u002FMoscow`. Для Docker Desktop нужен доступный\nна хосте файл TZif нужной зоны вместо Linux-пути `\u002Fetc\u002Flocaltime`.\n\n- **Обновить:** `docker compose pull && docker compose up -d` (или `docker pull` и пересоздать контейнер).\n- **Версии:** `latest` — последняя из ветки `main`, `0.1.0` и т. д. — конкретный релиз.\n- **Без `network_mode: host`** (Docker Desktop на Windows\u002FmacOS) — пробросьте порты `-p 8765:8765 -p 8766:8766`;\n  панель работает так же, только HTTPS-сертификат будет выписан на адрес контейнера.\n- **Собрать образ самому:** склонируйте репозиторий и запустите `docker compose up -d --build`\n  с `build: .` вместо `image:` в `docker-compose.yml` из репозитория.\n\n> В Docker панель открыта для всей локальной сети — **задайте пароль** во вкладке «Настройки» → «Доступ».\n\n### Android\n\n\u003Ctable>\n  \u003Ctr>\n    \u003Ctd width=\"33%\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fandroid-overview.png\" alt=\"Обзор в приложении\">\u003C\u002Ftd>\n    \u003Ctd width=\"33%\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fandroid-player.png\" alt=\"Плеер в приложении\">\u003C\u002Ftd>\n    \u003Ctd width=\"33%\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fandroid-console.png\" alt=\"Консоль в приложении\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd align=\"center\">Обзор\u003C\u002Ftd>\n    \u003Ctd align=\"center\">Плеер\u003C\u002Ftd>\n    \u003Ctd align=\"center\">Консоль с клавишами над клавиатурой\u003C\u002Ftd>\n  \u003C\u002Ftr>\n\u003C\u002Ftable>\n\nПанель целиком внутри приложения: компьютер не нужен. Скачайте со страницы\n[Releases](https:\u002F\u002Fgithub.com\u002Fdimap\u002Fyapanel-web\u002Freleases\u002Flatest) файл `yapanel-web-….apk` и установите\n(телефон попросит разрешить установку из этого источника). Нужен Android 7 или новее на 64-битном процессоре.\n\n- Колонка подключается по Wi-Fi (`adb` по сети, порт 5555): adb встроен в приложение, ставить ничего не нужно.\n- Панель работает в фоне, пока в шторке висит её уведомление («Остановить» — выключить). Что играет на колонке, видно\n  в шторке и на экране блокировки, а кнопки громкости телефона меняют громкость колонки.\n- ffmpeg в приложении нет: свои звуки — только WAV.\n- Обновление — новый APK поверх старого: вход, настройки и история сохранятся.\n\nСборка из исходников — [android\u002FREADME.md](android\u002FREADME.md).\n\n## Другие модели и несколько колонок\n\nИзначально проект создавался под Лайт 2, но сейчас так же имеется базовая поддержка некоторых других колонок.\nПанель сама определяет модель по плате колонки (платформа в `\u002Fproc\u002Fdevice-tree`) и запоминает её. При первом\nподключении другой модели она один раз перезапускается с подходящим профилем. Задать профиль вручную —\n`--model lite2 | lite | mini3pro | mini3 | mini2 | station2 | midi`.\n\n| Профиль | Часы \u002F подсветка | Запуск \u002F будильник | Проверено на колонке |\n|---|---|---|---|\n| `lite2` | 36 сегментов \u002F кольцо 3 RGB | есть | полностью |\n| `lite2nc` (Лайт 2 без часов) | дисплея нет \u002F кольцо 3 RGB | будильник есть, заставка нет | чтение, кольцо |\n| `mini3pro` | 36 сегментов \u002F кольцо 16 RGB | отключены | чтение, часы, кольцо |\n| `mini2` (Мини 2 с часами) | 4 цифры, двоеточие, минус, градус \u002F логотип 6 RGB | заставка выключена; будильник\u002Fсценарии на пробу, нужен штатный хук | чтение, «12:34», RGB и откат на прошивке 0.369; [границы проверки](docs\u002Fsupport\u002Fmini2.md) |\n| `midi` (Миди, `cucumber`) | карта 45 каналов; живые часы на 3D и в карточке; короткие пробы кольца и логотипа | постоянные режимы часов и загрузка на приёмке | громкость, речь, плеер, файлы, RGB 8\u002F8, карта 45\u002F45; [границы проверки](docs\u002Fsupport\u002Fmidi.md) |\n| `mini2nc` (Мини 2 без часов) | дисплея нет \u002F логотип 6 RGB | отключены | чтение, кольцо |\n| `station2` | без часов \u002F LED-панель 88 RGB (framebuffer) | отключены | чтение, LED-панель |\n| `mini3` | запись отключена | отключены | нет, экспериментальный |\n| `lite` (Лайт 1-го поколения) | дисплея нет \u002F кольцо 3 RGB | заставка отключена, будильник есть | кольцо, хук, будильник, звуки — автором [PR #6](https:\u002F\u002Fgithub.com\u002Fdimap\u002Fyapanel-web\u002Fpull\u002F6); «Сказать» — [#23](https:\u002F\u002Fgithub.com\u002Fdimap\u002Fyapanel-web\u002Fissues\u002F23) |\n\nНа других моделях будильник и сценарии открыты экспериментально с предупреждением. 3D-корпуса Станции 2, Мини 3,\nМини 3 Про и Лайт первого поколения — реконструкции по фото производителя; Мини 2 — по фото и замерам владельца ([источники](static\u002Fmodels\u002FSOURCES.md)).\n\n**Станция Миди** (`cucumber`) имеет отдельный экспериментальный профиль. Статус, файлы, консоль,\nGlagol и общие функции на пробу доступны; постоянные режимы часов и загрузка ещё не приняты. Краткий вывод и обычные команды RGB\nоткрываются после приёмки выбранного устройства; глобальные аппаратные флаги выключены.\nКорпус в галерее приблизительный, с отдельной отметкой о непроверенной совместимости; картинка\nне включает аппаратные команды. Проверено на factory-9; другая прошивка требует отдельной проверки.\n\n**Станция Мини 2 с часами** (`yandex,station-mini2`, платформа Glagol `yandexmini_2`). Сегменты её дисплея\nназываются иначе, чем у Лайт 2 (цифры 1–4 без точек, двоеточие `PLUS1`\u002F`PLUS2`, `MINUS`, `DEGREE`), поэтому\nпрофиль держит на колонке каталог ссылок `\u002Ftmp\u002Fwebpanel_clock` с именами Лайт 2, и весь код часов работает\nбез изменений. Анимации часов из прошивки (кадр на 32 светодиода) читаются и проигрываются. Подсветка — кольцо логотипа\nАлисы в центре крышки, 6 RGB-светодиодов без LED-триггера: «Вернуть» восстанавливает прежние значения, анимации\nкольца проигрывает штатный `led_util`. YAM на ней лежит в\n`\u002Fdata\u002Fquazar\u002Fyam`, как на Лайт 2.\n\n**Станция Лайт 2 Plum\u002FPrune** (`yandex,plum`, `yandex,prune`) — общий профиль `lite2` для Plum с часами;\nPrune без clock-сегментов получает `lite2nc` (кольцо 3 RGB, дисплей скрыт).\n\n**Станция Мини 2 без часов** (`yandex,station-mini2` без `mini2:white:clock*`) — профиль `mini2nc`:\nкольцо 6 RGB, дисплей скрыт. Вариант с часами остаётся на `mini2`.\n\n**Станция 2** (`yandex,station-midi`, платформа Glagol `yandexmidi`) — профиль `station2`: у неё та же\nLED-панель из 89 диодов через framebuffer. Не путать со **Станцией Миди**: она в device-tree называется\n`cucumber`\u002F`cucumber-dvt2` (платформа `cucumber`), и этим профилем пока не покрыта — issue #7.\n\n**Станция Лайт первого поколения** (`yandex,station-micro`, платформа Glagol `yandexmicro`) — профиль `lite`\n(из PR #6). Дисплея нет, часы скрыты. Подсветка — кольцо из трёх RGB-светодиодов `micro:*:ring1–3` через `\u002Fdev\u002Ffb0`,\nкак у Лайт 2. Заставка часов отключена. Хук автозапуска, будильник и замена звуков проверены на колонке;\nсценарии, ассистент, «Сказать» и yam 2 открыты на пробу с предупреждением. Старый yam ставится в `\u002Fdata\u002Fquazar\u002Fyam`, как на Лайт 2.\n\n**Несколько колонок в одной панели.** Скопируйте `speakers.example.json` в `speakers.json`, укажите свои\nколонки (модель — явно) и запустите:\n\n```sh\npython3 multi.py --config speakers.json --data-dir data\u002Fmulti --port 8765\n```\n\nНа `http:\u002F\u002F127.0.0.1:8765\u002F` пункт «Выбор колонки» переключает устройство; у каждой колонки свой адрес\n`\u002Fspeaker\u002F\u003Cid>\u002F`, свой вход в Яндекс и своя история, пароль панели общий. Для доступа из сети задайте пароль\nи добавьте `--host 0.0.0.0` (по желанию `--allow-network 192.168.1.0\u002F24` и `--https-port 8766`). В Docker\nзамените команду контейнера на `python multi.py --config \u002Fconfig\u002Fspeakers.json --data-dir \u002Fdata --host 0.0.0.0`.\nОбновление из «Настроек» в этом режиме обновляет шлюз и перезапускает панели всех колонок.\n\nОбновление yamd на Станции 2 и Мини 3 Про работает с уже установленным `\u002Fdata\u002Flocal\u002Fyam\u002Fservice.sh`: перед заменой\nдемона делается резервная копия, при ошибке — откат.\n\n3D-модели без колонки: «Настройки» → «Оформление» → «Галерея 3D-моделей» или без панели: `python3 -m http.server 8870 -d static` и http:\u002F\u002F127.0.0.1:8870\u002Fmodel-preview.html. Кроме поддерживаемых моделей в галерее есть заготовки остальных колонок и ТВ Станций (`static\u002Fmodel-concepts.js`): только внешний вид, совместимость не проверена — при добавлении новой модели корпус можно взять оттуда.\nДобавить новую модель или проверить, что ещё умеет ваша колонка: [CONTRIBUTION.md](CONTRIBUTION.md).\n\nМини 2 и Миди: [общий реестр проверок P0–P2 и текущих результатов](docs\u002Fsupport\u002Fmini2-midi-tests.md),\nвключая зависимости автозапуска, аппаратную приёмку и новую 3D-модель Миди.\n\n## Параметры\n\n| Аргумент | Переменная | По умолчанию | |\n|---|---|---|---|\n| `--device` | `ADB_SERIAL` | запомненный | IP колонки (порт 5555 подставится сам), `host:port` или серийник USB |\n| `--find` | | | найти колонку в локальной сети и запомнить её адрес; можно указать подсеть: `--find 192.168.1.0\u002F24`. На Windows: `start.bat --find`. То же — из панели: кнопка «Найти колонку в сети» на экране подключения и «Настройки» → «О панели» → «Другая колонка…» |\n| `--host` | `PANEL_HOST` | `127.0.0.1` | `0.0.0.0` — доступ из локальной сети (в Docker так и есть) |\n| `--port` | `PANEL_PORT` | `8765` | порт HTTP |\n| `--https-port` | `PANEL_HTTPS_PORT` | `8766` | порт HTTPS, `0` — выключить |\n| `--data-dir` | `PANEL_DATA_DIR` | рядом с `server.py` | где хранить токен, пароль, сертификаты, историю |\n| `--model` | `PANEL_MODEL` | `auto` | профиль колонки: `auto` — определить по плате, или `lite2`, `lite`, `mini3pro`, `mini3`, `mini2`, `station2` |\n| `--open` | | | открыть панель в браузере |\n| | `ADB` | из `PATH` | путь к adb |\n| | `PANEL_OPENSSL` | из `PATH` | путь к openssl для HTTPS (на Windows ищется и в Git for Windows) |\n\n## Безопасность\n\n- По умолчанию панель слушает только `127.0.0.1`. Если открываете её в сеть (`--host 0.0.0.0`, Docker) — задайте пароль.\n- Пароль хранится только как PBKDF2-хэш; вход — cookie на 90 дней; после 5 ошибок — пауза. Забыли пароль —\n  удалите `.panel_auth.json` в папке данных и перезапустите панель.\n- Запросы и консоль с чужих сайтов отклоняются всегда (проверка `Origin`), даже без пароля.\n- HTTPS: при первом запуске создаётся свой маленький центр сертификации. Он ограничен локальными адресами\n  и именами, поэтому, даже установленный на телефон, для чужих сайтов не действует.\n- Токен Яндекса хранится только на компьютере с панелью (`.yandex_auth.json`, права 600) и в браузер не попадает.\n- У веб-интерфейса yamd и Luna (порт 8099 на колонке) своей авторизации нет — это свойство этих программ, а не панели.\n\n## Что панель ставит на колонку\n\nТолько то, что вы включили сами, — всё в `\u002Fdata\u002Fquasar\u002Fwebpanel` плюс одна строка автозапуска в\n`\u002Fdata\u002Fquasar\u002Frootkeeper.sh` (перед первой правкой сохраняется копия). Если `rootkeeper.sh` нет и штатная\nзагрузка его не вызывает, панель кладёт свой сценарий в `\u002Fetc\u002Finit.d\u002FS99zwebpanel` — на колонках с корнем\nтолько для чтения по кнопке в панели, с коротким перемонтированием корня в режим записи и обратно:\n\n| Функция | Что на колонке |\n|---|---|\n| Своя заставка \u002F звук запуска | файл + bind mount поверх стандартного (`\u002Fsystem` только для чтения) |\n| Свои системные звуки и анимации | `override\u002Fsounds\u002F…`, `override\u002Fledpatterns\u002F…` + bind mount поверх стандартных; оригиналы не копируются — они целы под подменой |\n| Свои отдельные анимации | `anims\u002Fring\u002F*.led`, `anims\u002Fclock\u002F*.binscled` — встроенные не трогают |\n| «Показывать заставку при каждой загрузке», автозапуск yamd | файлы-флаги |\n| Будильник и сценарии | `alarm\u002F`: скрипт-демон, будильники, сценарии, звуки, журнал |\n| Ассистент | `assistant\u002F`: программа помощника (~6 МБ), настройки с ключами API, журнал |\n| Живой спектр (экспериментально) | `viz\u002F`: программа `vizd` (~2 МБ) — читает захват усилителя и пишет полосы в `\u002Ftmp` |\n| Службы пакетов yam 2 | `yam2\u002F`: скрипт запуска на каждую службу, `yam2\u002Fboot\u002F` — какие запускать при загрузке. Сам yam 2 — в `\u002Fdata\u002Fyam`, у него своё удаление |\n\nОстальное работает через adb и ничего не оставляет (временное — в `\u002Ftmp`). Вкладка «Настройки» → «Колонка»\nпоказывает, что установлено, делает резервную копию и одной кнопкой убирает всё, возвращая колонку к исходному\nсостоянию.\n\n## Как это устроено\n\nОдин процесс на Python без зависимостей (`server.py`) и одна страница (`static\u002Findex.html`).\n- С колонкой — через adb: `shell`, файлы — `pull`\u002F`push` (`exec-out` этот adbd не умеет, а `shell` портит бинарные данные).\n  Фоновые скрипты на колонке запускаются через `start-stop-daemon`, иначе их убивает adbd.\n- Плеер и громкость — локальный протокол Glagol (WebSocket на порту 1961 колонки) с токеном вашего аккаунта;\n  трек, текст, очередь — API Яндекс Музыки.\n- Дисплей часов — sysfs `plum:white:clock*`; кольцо — framebuffer `\u002Fdev\u002Ffb0`, как у самой Алисы.\n- Будильник — sh-демон `device\u002Falarmd.sh`; запросы Алисе он отправляет сам через отладочный CLI `maind --cli`.\n- Консоль — WebSocket `\u002Fapi\u002Fterm` ↔ `adb shell` (псевдотерминал выделяет adbd на колонке).\n- Ассистент — программа на Go (`device\u002Fassistant`), статическая сборка под колонку. Распознанную фразу она берёт из\n  журнала Алисы, её собственный ответ отменяет через `maind --cli` (Алиса начинает говорить примерно через секунду\n  после распознавания — отмена успевает), а ответ модели озвучивает «Повтори за мной» или синтезатором через `aplay`.\n  Если синтезатор ассистента недоступен (адрес, ключ, сеть), текст читает Алиса — ответ и ошибки не теряются.\n  Готовую программу CI прикладывает к каждому релизу: панель скачивает её для своей версии и сверяет `SHA256SUMS`.\n  Если на компьютере есть Go, панель собирает программу из `device\u002Fassistant` сама — это нужно, только если меняете её код.\n\nПроверялось на прошивке 0.369.1.50. На других версиях что-то может работать иначе — пишите в Issues. Приложите отчёт:\n«Настройки» → «О панели» → «Скопировать отчёт» (или ссылка на экране подключения, если колонка не подключается). В нём\nверсии панели, adb и прошивки, хук, что панель поставила на колонку, и журнал панели; токены, ключи, IP и MAC скрыты.\n\n## Благодарности и лицензии\n\nКод панели — [MIT](LICENSE).\n\n- 3D-модель колонки — [«Yandex Station Lite 2 | Яндекс станция лайт 2»](https:\u002F\u002Fwww.thingiverse.com\u002Fthing:7349611)\n  от **vanyabeat**, лицензия [CC BY-SA 4.0](https:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby-sa\u002F4.0\u002F). STL\n  не изменён (`static\u002Fmodels\u002Flite2.stl`), подробнее — [static\u002Fmodels\u002FSOURCES.md](static\u002Fmodels\u002FSOURCES.md).\n- 3D-модели Станции 2, Мини 3 и Мини 3 Про — собственные приблизительные реконструкции по общедоступным фотографиям\n  производителя от **[chelaxian](https:\u002F\u002Fgithub.com\u002Fchelaxian)** (`static\u002Fmodel-studio.js`), лицензия MIT, как у кода\n  панели. Это не официальные чертежи и не скачанные модели; фотографии в проект не входят —\n  [источники](static\u002Fmodels\u002FSOURCES.md).\n- 3D-модель Станции Мини 2 — приблизительная реконструкция по фотографиям и замерам владельца колонки\n  (`static\u002Fmodel-studio.js`), лицензия MIT. Дисплей использует общую геометрию часов, кольцо Алисы —\n  шесть RGB-зон; фотографии в проект не входят — [источники](static\u002Fmodels\u002FSOURCES.md).\n- 3D-модель Станции Лайт первого поколения — такая же приблизительная реконструкция по фотографиям\n  (`static\u002Fmodel-studio.js`), лицензия MIT.\n- Поддержка других моделей, профили колонок и единая панель для нескольких колонок —\n  [PR №1](https:\u002F\u002Fgithub.com\u002Fdimap\u002Fyapanel-web\u002Fpull\u002F1) от **[chelaxian](https:\u002F\u002Fgithub.com\u002Fchelaxian)**.\n  Галерея моделей, цвета подсветки Станции 2, обновление yamd и панели в режиме нескольких колонок —\n  [PR №4](https:\u002F\u002Fgithub.com\u002Fdimap\u002Fyapanel-web\u002Fpull\u002F4) от него же.\n- [three.js](https:\u002F\u002Fthreejs.org) (MIT), [xterm.js](https:\u002F\u002Fxtermjs.org) (MIT),\n  [QR Code Generator](https:\u002F\u002Fgithub.com\u002Fkazuhikoarase\u002Fqrcode-generator) Kazuhiko Arase (MIT) — в `static\u002Fvendor`.\n- Тексты песен — [LRCLIB](https:\u002F\u002Flrclib.net); пакеты — [yam \u002F yapkg](https:\u002F\u002Fgithub.com\u002Fnyakokitsu\u002Fyam).\n- Протокол Glagol и вход по QR — по мотивам [YandexStation](https:\u002F\u002Fgithub.com\u002FAlexxIT\u002FYandexStation) для Home Assistant.\n\n«Яндекс», «Алиса», «Яндекс Станция» и их логотипы — товарные знаки ООО «Яндекс». yapanel — неофициальный проект,\nне связан с Яндексом и не одобрен им. Названия используются только чтобы указать, с какими устройствами работает\nпанель; логотипы и фирменный стиль Яндекса в проекте не используются, а 3D-модели колонок — приблизительные\nреконструкции формы корпуса без логотипов.\n","2026-11-03 04:32:10","CREATED_QUERY"]