Files
elmer/analysis.md
T

250 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.*