pyserial select-based read(4096) на RPi+PL2303 кидает 'readiness to read but no data'
и теряет байты в потоке (эхо ввода превращалось в кракозябры). Чтение по in_waiting
собирает доступные байты и отдаёт, когда поток утих — стабильно как minicom.
pyserial на Raspberry Pi временами кидает SerialException (readiness but no data)
на простоях порта — читаем как пустоту и продолжаем, а не роняем WS-консоль.
В console-режиме на arm atxctl нет по пути — status больше не падает (power=unknown).
WS: баннер 'console ready' уходит в веб-клиент, а не записывается в serial (не мусорим на экран сервера).
- ATXPI_MODE=console: /api/power/* → 403, кнопки питания скрыты в UI
- /api/status отдаёт mode; env-шаблон и install.sh учитывают ATXPI_MODE
- нужно для безопасного запуска панели на серверах-«управленцах» без риска питания
mcp-SDK: streamable_http_app требует собственного run() (task-group),
не встраивается в FastAPI напрямую. Оставляю чистый веб-UI (REST+WS+static+auth).
mcp закреплён на v1 (mcp>=1.2,<2) для будущего mcp_server.py.
streamable_http_app() уже содержит маршрут /mcp, поэтому Mount на /mcp
давал двойной префикс (307→/mcp/→404). Монтируем суб-приложение в корень
после всех маршрутов — /api/*, /, /static приоритетны, /mcp отдаёт MCP.