250 lines
12 KiB
Markdown
250 lines
12 KiB
Markdown
# Elmer — анализ и план (2026-05-25)
|
||
|
||
## Суть проекта
|
||
|
||
Сервис анализа ошибок электроники автомобиля через ELM327 OBD2 + LLM.
|
||
|
||
## Железо
|
||
|
||
- **Сканер:** ELM327 Bluetooth v1.5, чип PIC18F25K80 (китайский клон)
|
||
- **Ноутбук разработчика:** с Bluetooth, будет соединяться с ELM327 напрямую для отладки
|
||
|
||
## Целевая аудитория
|
||
|
||
- Технически любопытный автовладелец (не профессионал, но и не «глубинарий»)
|
||
- Уже имеет ELM327 — значит базовое понимание есть
|
||
- Хочет понять проблему, а не просто получить код ошибки
|
||
|
||
## Ключевые требования к ответам
|
||
|
||
- **Честная уверенность:** «С вероятностью ~80% проблема в X, потому что...»
|
||
- **Пояснение логики:** почему именно этот вывод
|
||
- **Предупреждения:** «Если НЕ помогло — тогда проверь Y»
|
||
- **Никаких категоричных «меняй X»** без 100% уверенности
|
||
- **Liability Protection:** нельзя чтобы пользователь сломал машину из-за неверного диагноза
|
||
|
||
## LLM
|
||
|
||
- Рассматривается DeepSeek (дёшево через API)
|
||
- Или другая простая/дешёвая модель
|
||
- Нужен RAG/grounding на реальных repair manuals и TSB, чтобы минимизировать галлюцинации
|
||
|
||
## Компоненты системы
|
||
|
||
1. **Android-приложение** (в последнюю очередь)
|
||
- Стабильная версия Android (не гоняться за новейшей)
|
||
- Максимально простое: минимум кнопок
|
||
- Русский язык
|
||
- Bluetooth SPP → ELM327
|
||
|
||
2. **Сервер** (после отладки логики на ноутбуке)
|
||
- Принимает данные от приложения
|
||
- Формирует запросы к LLM
|
||
- Итеративный цикл: запрос → ответ → может запросить ещё параметры или действия от пользователя
|
||
- Отдаёт диагноз с пояснениями
|
||
|
||
3. **LLM-слой**
|
||
- Промпт с контекстом автомобиля (VIN → марка/модель/двигатель)
|
||
- RAG на базу знаний (ошибки, мануалы, TSB)
|
||
- Итеративная диагностика: сервер может переспрашивать LLM
|
||
|
||
## Протокол диагностики (конечный автомат)
|
||
|
||
Цикл:
|
||
1. Приложение считывает VIN → сервер
|
||
2. Приложение считывает коды ошибок → сервер
|
||
3. Сервер → LLM: первичный анализ
|
||
4. LLM может запросить:
|
||
- Дополнительные PID'ы с ЭБУ (live data)
|
||
- Действия от пользователя (прогазовать, проехать, считать на холодную и т.д.)
|
||
5. Повторять пока не будет достаточно данных для диагноза
|
||
6. Финальный ответ: диагноз + степень уверенности + пояснения + что делать
|
||
|
||
## План разработки (три фазы)
|
||
|
||
### Фаза 1: Ноутбук + ELM327 (СЕЙЧАС)
|
||
- Python-скрипт: Bluetooth → ELM327 → читаем VIN, ошибки, PID'ы
|
||
- Отправляем в LLM вручную — отлаживаем логику, промпты, цикл вопросов-ответов
|
||
- Никакого сервера, никакого Android
|
||
|
||
### Фаза 2: Сервер
|
||
- Flask/FastAPI — принимать данные, проксировать в LLM
|
||
- База знаний / RAG
|
||
- State machine диагностики
|
||
|
||
### Фаза 3: Android-приложение
|
||
- Bluetooth SPP (Serial Port Profile) — есть нюансы на Android 12+
|
||
- Минималистичный UI
|
||
- Отправка данных на сервер, отображение ответов
|
||
|
||
## Риски
|
||
|
||
1. **ELM327 v1.5 клон** — неполный протокол, глюки на高速 CAN
|
||
2. **PID'ы разные у разных марок** — нужна БД по производителям
|
||
3. **LLM галлюцинации** — только grounding/RAG спасёт
|
||
4. **Bluetooth SPP на Android 12+** — permissions, pairing
|
||
|
||
## Ресурсы
|
||
|
||
- `python-OBD` — библиотека для работы с ELM327 (или свой serial-протокол)
|
||
- `pyserial` уже установлен в системе
|
||
- DeepSeek API (или OpenRouter как альтернатива)
|
||
|
||
---
|
||
|
||
## Структура проекта (создана 2026-05-25)
|
||
|
||
```
|
||
elmer/
|
||
├── elmer/ # Python-пакет
|
||
│ ├── __init__.py # версия 0.1.0
|
||
│ ├── config.py # загрузка config.yaml + подстановка ${ENV}
|
||
│ ├── elm.py # ELM327: pyserial, VIN, DTC, PID
|
||
│ ├── db.py # SQLite: cars, tokens, llm_messages, ecu_parameters, dtc_codes
|
||
│ ├── prompts.py # SYSTEM_PROMPT + build_user_prompt()
|
||
│ └── diagnose.py # DeepSeek API (OpenAI-совместимый)
|
||
├── config.yaml # настройки (BT-порт, API-ключ, PID'ы)
|
||
├── requirements.txt # pyserial, pyyaml, requests
|
||
├── run.py # главный вход: ELM → данные → LLM → печать + сохранение
|
||
├── idea.md # исходная задумка
|
||
└── analysis.md # этот файл
|
||
```
|
||
|
||
## Запуск (в салоне авто)
|
||
|
||
```bash
|
||
# 1. Установить зависимости
|
||
pip install -r requirements.txt
|
||
|
||
# 2. Сопрячь ELM327 по Bluetooth
|
||
bluetoothctl pair 11:22:33:44:55:66
|
||
# (в config.yaml прописан порт /dev/rfcomm0)
|
||
|
||
# 3. Запустить
|
||
DEEPSEEK_API_KEY=sk-... python run.py
|
||
```
|
||
|
||
Что произойдёт:
|
||
1. Подключится к ELM327
|
||
2. Прочитает VIN
|
||
3. Считает ошибки (stored mode 03 + pending mode 07)
|
||
4. Считает параметры (обороты, температура, скорость, дроссель, MAP, IAT, топливные тримы)
|
||
5. Отправит в DeepSeek → напечатает диагноз
|
||
6. Сохранит всё в `elmer.db` (SQLite)
|
||
|
||
---
|
||
|
||
## Десктопный UI (Web)
|
||
|
||
Для тестирования на ноутбуке (не тыкать грязным пальцем в телефон):
|
||
- `web/app.py` — Flask (порт 5005), один endpoint `/api/diagnose` (POST)
|
||
- `web/templates/index.html` — одна кнопка, тёмная тема, результат
|
||
- В будущем этот же код — прототип серверного API
|
||
|
||
Запуск:
|
||
```bash
|
||
DEEPSEEK_API_KEY=sk-... python web/app.py
|
||
# Открыть http://localhost:5005
|
||
```
|
||
|
||
## Версии для пользователей (будущее)
|
||
|
||
- **Android** — Kotlin/Java, Bluetooth SPP
|
||
- **Windows** — тот же веб-интерфейс в WebView (или Electron, или просто браузер)
|
||
- Общий серверный API между ними
|
||
|
||
---
|
||
|
||
---
|
||
|
||
## Архитектура клиент-сервер (решено 2026-05-25)
|
||
|
||
### Принцип: тонкий клиент
|
||
|
||
Клиент ничего не знает о диагнозе. Только транспорт:
|
||
|
||
```
|
||
ELM327 ←Bluetooth SPP→ Android Client ←HTTP JSON→ Сервер ←API→ DeepSeek
|
||
```
|
||
|
||
### Клиент как универсальный SDK
|
||
|
||
- Пользователь вводит URL своего сервера (или используется наш по умолчанию)
|
||
- Протокол HTTP/JSON документирован — любой backend
|
||
- Два режима работы клиента:
|
||
1. **«Опрос» (основной):** клиент сам читает VIN + DTC + PID'ы, шлёт JSON серверу
|
||
2. **«Ретранслятор» (расширенный):** сервер шлёт сырые AT-команды, клиент пересылает ответ
|
||
|
||
### Десктоп
|
||
|
||
- Браузер (Chrome) → локальный Flask → pyserial → ELM327
|
||
- Отдельного «приложения» для Windows не нужно
|
||
- Тот же `web/app.py` — и тестовый UI, и прототип сервера
|
||
|
||
### Открытость и доверие
|
||
|
||
| Что | Где | Зачем |
|
||
|---|---|---|
|
||
| **Клиент (Android)** | GitHub (открытый) | Доверие — любой может проверить код, собрать сам |
|
||
| **Сервер (Python)** | Gitea (закрытый) | API-ключи, логика, коммерческая часть |
|
||
| **Публикация** | RuStore | Бесплатно, модерация = дополнительное доверие |
|
||
|
||
### Git-стратегия
|
||
|
||
- `gitea.services.ngcloud.ru/Nail/elmer` — разработка сервера (текущий репо)
|
||
- `github.com/Nail/elmer-android` — клиент (будет создан), лицензия MIT
|
||
- Серверный репо на GitHub НЕ публикуем
|
||
|
||
---
|
||
|
||
## TODO / Дорожная карта
|
||
|
||
### 🔴 Фаза 1 — отладка на ноутбуке (ближайшая)
|
||
|
||
- [ ] Проверить Bluetooth на ноутбуке: `hciconfig`, `bluetoothctl`
|
||
- [ ] Сопрячь ELM327: `bluetoothctl pair <MAC>`
|
||
- [ ] Привязать к `/dev/rfcomm0`: `rfcomm bind 0 <MAC>`
|
||
- [ ] `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/<vin>`
|
||
- [ ] База: миграция 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: как собрать самому, как использовать с чужим сервером
|
||
|
||
---
|
||
|
||
## Заметки по итогам обсуждения
|
||
|
||
- **Гипотеза подтверждена:** DeepSeek уже дал полный анализ по логам VCDS. Лучше гугла.
|
||
- **Модерация RuStore:** проверяет вредоносный код и permissions. BLUETOOTH + INTERNET — вопросов не вызовет.
|
||
- **Sideload (APK напрямую):** проверок нет, но permissions видны до установки.
|
||
- **Chrome на Android НЕ может:** Web Bluetooth API только BLE, Web Serial API не поддерживается.
|
||
- **Termux с Python:** теоретически, но Bluetooth-доступ сложен.
|
||
- **ELM327 v1.5 (PIC18F25K80):** китайский клон. Неполный протокол, возможны глюки. Держать в уме.
|
||
- **Нет готового аналога:** ниша новая (LLM + OBD2), старые приложения без AI-анализа.
|
||
|
||
---
|
||
|
||
*Продолжить: тестировать в салоне авто с реальным ELM327.*
|