diff --git a/doc/architecture.md b/doc/architecture.md new file mode 100644 index 0000000..d07ccfd --- /dev/null +++ b/doc/architecture.md @@ -0,0 +1,88 @@ +# Архитектура 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 — базовая проверка на вредоносный код diff --git a/doc/competitors.md b/doc/competitors.md new file mode 100644 index 0000000..9c552f5 --- /dev/null +++ b/doc/competitors.md @@ -0,0 +1,69 @@ +# Конкуренты (2026-05-25) + +## Резюме + +На рынке есть 4 буржуазных конкурента. **Русскоязычных — ноль.** RuStore пустой по запросу «OBD2 + AI диагностика». + +Это главное преимущество: мы не «ещё один», а **первый на русском рынке**. + +--- + +## DiagnostiX AI +| | | +|---|---| +| **Разработчик** | Exza / Ontario Analytics (Канада) | +| **Платформа** | Android (Google Play) | +| **ID** | `com.exza.diagnostixai` | +| **Описание** | OBD2 scanner + AI mechanic assistant. Чтение/сброс DTC, live data, сенсоры в реальном времени, AI-помощь | +| **LLM** | Не раскрыт | +| **Слабость** | Всё в одном app, locked-in | + +## OBDAI +| | | +|---|---| +| **Разработчик** | Ontario Analytics (Канада/США) | +| **Платформа** | iOS + Android | +| **ID** | `com.ontarioanalytics.obdai` | +| **Описание** | AI-агент ARIA (Automotive Reasoning & Intelligence Agent). Профессиональные диагностические отчёты. «Поговори с машиной» | +| **LLM** | ARIA (вероятно свой/кастомный) | +| **Слабость** | Закрытый, платный, английский | + +## Zero Touch Car Diagnostics +| | | +|---|---| +| **Разработчик** | kellinheller (GitHub) | +| **Платформа** | Кроссплатформа (Flutter) | +| **Репозиторий** | `github.com/kellinheller/zero_touch_car_diagnostics` | +| **Описание** | Open source. OBD2 + датчики телефона + GPS + AI-анализ через Google Gemini 2.5 Pro | +| **LLM** | Google Gemini 2.5 Pro | +| **Слабость** | Gemini платный. Flutter = тяжёлый. Не для ELM327 v1.5 (клонов) | + +## MUCAR 892BT MUAI (THINKCAR) +| | | +|---|---| +| **Производитель** | THINKCAR (Китай) | +| **Тип** | Железка + софт | +| **Описание** | Полноценный диагностический сканер со своим экраном. 8 диагностических модулей, отчёты | +| **LLM** | **DeepSeek** (единственный конкурент на DeepSeek) | +| **Слабость** | Свой сканер (~$150-300). Не работает с ELM327 | + +--- + +## Сравнение с Elmer + +| Критерий | DiagnostiX AI | OBDAI | Zero Touch | MUCAR MUAI | **Elmer** | +|---|---|---|---|---|---| +| Open source клиент | ❌ | ❌ | ✅ | ❌ | ✅ | +| Тонкий клиент (свой сервер) | ❌ | ❌ | ❌ | ❌ | ✅ | +| Русский язык | ❌ | ❌ | ❌ | ❌ | ✅ | +| RuStore | ❌ | ❌ | ❌ | ❌ | ✅ | +| Работает с дешёвым ELM327 | ✅ | ✅ | 🟡 | ❌ | ✅ | +| DeepSeek | ❌ | ❌ | ❌ | ✅ | ✅ | +| Бесплатно | 🟡 | ❌ | ✅ | ❌ | ✅ | + +--- + +## Вывод + +Ниша существует и растёт. MUCAR с DeepSeek — сигнал что LLM-подход правильный. +Наш козырь: **открытость + русский рынок + дешёвый ELM327**. Никто не сочетает эти три фактора. diff --git a/doc/research.md b/doc/research.md new file mode 100644 index 0000000..ae72867 --- /dev/null +++ b/doc/research.md @@ -0,0 +1,47 @@ +# Заметки и находки + +## 2026-05-25 — Исследование конкурентов + +- Найдено 4 конкурента: DiagnostiX AI, OBDAI, Zero Touch, MUCAR MUAI +- Русскоязычных нет, RuStore пустой +- MUCAR уже использует DeepSeek → подтверждение правильности выбора LLM +- Никто не делает открытый клиент (кроме Zero Touch, но там Flutter/Gemini) + +## 2026-05-25 — Подтверждение гипотезы + +DeepSeek дал полный подробный анализ по логам VCDS с тестового проезда. +Лучше любого гугла. Гипотеза подтверждена. + +## 2026-05-25 — Платформенные ограничения + +- Chrome Android: Web Bluetooth API — только BLE. ELM327 использует Bluetooth Classic SPP → НЕСОВМЕСТИМЫ +- Web Serial API — не поддерживается на Android вообще +- Termux + Python + pyserial — теоретически возможно, но Bluetooth-доступ в Termux сложен +- Вывод: нативное Android-приложение обязательно + +## 2026-05-25 — ELM327 v1.5 (PIC18F25K80) + +- Китайский клон, не оригинальный чип PIC18F2480 +- Протокол неполный, возможны глюки на高速 CAN +- Держать в уме при тестировании + +## 2026-05-25 — RuStore + +- Бесплатная регистрация разработчика +- Модерация 1-3 дня +- Проверяет: вредоносный код, подозрительные permissions +- Не проверяет: скрытые закладки в легальном API +- Наши permissions (BLUETOOTH + INTERNET) — минимальны, вопросов не вызовут + +## 2026-05-25 — Sideload (установка APK напрямую) + +- Проверок нет совсем +- Android показывает список permissions перед установкой +- Пользователь видит только BLUETOOTH + INTERNET → доверие + +## 2026-05-25 — Целевая аудитория + +- Технически любопытный автовладелец с ELM327 +- Не профессионал, но и не «глубинарий» (это шутка) +- Хочет понять проблему, а не просто получить код +- Требования к ответам: честная уверенность, пояснения, предупреждения diff --git a/doc/roadmap.md b/doc/roadmap.md new file mode 100644 index 0000000..d8bb8dc --- /dev/null +++ b/doc/roadmap.md @@ -0,0 +1,34 @@ +# Дорожная карта + +## 🔴 Фаза 1 — отладка на ноутбуке (ближайшая) + +- [ ] Проверить Bluetooth на ноутбуке: `hciconfig`, `bluetoothctl` +- [ ] Сопрячь ELM327: `bluetoothctl pair ` +- [ ] Привязать к `/dev/rfcomm0`: `rfcomm bind 0 ` +- [ ] `pip install -r requirements.txt` +- [ ] `DEEPSEEK_API_KEY=sk-... python run.py` — консольный тест +- [ ] `DEEPSEEK_API_KEY=sk-... python web/app.py` — веб-тест +- [ ] Подключить реальную машину, считать VIN + ошибки + параметры +- [ ] Оценить качество ответа DeepSeek + +## 🟡 Фаза 2 — сервер + +- [ ] Выделенный сервер/ВМ (или Kubernetes pod) +- [ ] Flask → production (gunicorn) +- [ ] API: `/api/diagnose` + `/api/sessions` + `/api/history/` +- [ ] База: миграция SQLite → PostgreSQL +- [ ] RAG: база знаний (repair manuals, TSB) для grounding +- [ ] State machine: итеративные запросы к LLM +- [ ] HTTPS (Let's Encrypt) + +## 🟢 Фаза 3 — Android-клиент + +- [ ] Создать репо `github.com/Nail/elmer-android` +- [ ] Kotlin, minSdk ~24 (Android 7), targetSdk 34 +- [ ] Bluetooth SPP: поиск, pairing, connect, read/write +- [ ] OBD2 парсер: VIN (0902), DTC (03/07), PID (01XX) +- [ ] UI: одна кнопка «Диагностика» + поле ввода URL сервера +- [ ] HTTP-клиент: POST JSON на сервер, показ ответа (Markdown → текст) +- [ ] Permissions: только BLUETOOTH + INTERNET +- [ ] Подпись APK, публикация в RuStore +- [ ] README: как собрать самому, как использовать с чужим сервером