# Архитектура Elmer (2026-05-25) ## Принцип: тонкий клиент Клиент ничего не знает о диагнозе. Только транспорт: ``` ELM327 ←Bluetooth SPP→ Android Client ←HTTP JSON→ Сервер ←API→ DeepSeek ``` ## Режимы работы клиента ### Режим «опрос» (основной) Клиент сам читает VIN + DTC + PID'ы, шлёт готовый JSON серверу. Быстро: один HTTP-запрос на сессию. ### Режим «ретранслятор» (расширенный) Сервер шлёт сырые AT-команды, клиент пересылает ответ. Медленно (каждый PID — HTTP round-trip), но клиент вообще ничего не знает об OBD2. ## Универсальность - Пользователь вводит URL сервера (или наш по умолчанию) - Протокол HTTP/JSON документирован - Любой backend может работать с этим клиентом ## Десктоп (Windows/Linux) ``` Браузер (Chrome) → локальный Flask → pyserial → ELM327 ``` - Отдельного «приложения» для Windows не нужно - `web/app.py` — и тестовый UI, и прототип сервера - Chrome на Android НЕ может: Web Bluetooth API только BLE, Web Serial API не поддерживается ## Открытость и доверие | Что | Где | Зачем | |---|---|---| | **Клиент (Android)** | GitHub (открытый) | Доверие — любой может проверить код, собрать сам | | **Сервер (Python)** | Gitea (закрытый) | API-ключи, логика, коммерческая часть | | **Публикация** | RuStore | Бесплатно, модерация = дополнительное доверие | ## Git-стратегия - `gitea.services.ngcloud.ru/Nail/elmer` — разработка сервера (текущий репо) - `github.com/Nail/elmer-android` — клиент (будет создан), лицензия MIT - Серверный репо на GitHub НЕ публикуем ## База данных ### SQLite (MVP) ``` cars — VIN, марка, модель, год, двигатель diagnostic_tokens — id (PK), car_id (FK), created_at llm_messages — token_id (FK), role, content, timestamp ecu_parameters — token_id (FK), pid_code, value, unit, timestamp dtc_codes — token_id (FK), code, description, status ``` ### PostgreSQL (production) Та же схема, миграция при переходе к production-серверу. ## API (прототип) ### POST /api/diagnose ```json // Request (от клиента) { "vin": "WVWZZZ1KZAW123456", "dtc_codes": [{"code": "P0301", "status": "stored"}], "parameters": [{"pid_code": "0105", "name": "coolant_temp", "value": 85.0, "unit": "°C"}] } // Response (от сервера) { "diagnosis": "## Краткий диагноз\n...", "token_id": 42 } ``` ## Безопасность - Permissions Android: только BLUETOOTH + INTERNET - Никаких SMS/контактов/файлов/звонков - Пользователь видит permissions ДО установки (RuStore и sideload) - Модерация RuStore — базовая проверка на вредоносный код