12 KiB
12 KiB
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, чтобы минимизировать галлюцинации
Компоненты системы
-
Android-приложение (в последнюю очередь)
- Стабильная версия Android (не гоняться за новейшей)
- Максимально простое: минимум кнопок
- Русский язык
- Bluetooth SPP → ELM327
-
Сервер (после отладки логики на ноутбуке)
- Принимает данные от приложения
- Формирует запросы к LLM
- Итеративный цикл: запрос → ответ → может запросить ещё параметры или действия от пользователя
- Отдаёт диагноз с пояснениями
-
LLM-слой
- Промпт с контекстом автомобиля (VIN → марка/модель/двигатель)
- RAG на базу знаний (ошибки, мануалы, TSB)
- Итеративная диагностика: сервер может переспрашивать LLM
Протокол диагностики (конечный автомат)
Цикл:
- Приложение считывает VIN → сервер
- Приложение считывает коды ошибок → сервер
- Сервер → LLM: первичный анализ
- LLM может запросить:
- Дополнительные PID'ы с ЭБУ (live data)
- Действия от пользователя (прогазовать, проехать, считать на холодную и т.д.)
- Повторять пока не будет достаточно данных для диагноза
- Финальный ответ: диагноз + степень уверенности + пояснения + что делать
План разработки (три фазы)
Фаза 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
- Отправка данных на сервер, отображение ответов
Риски
- ELM327 v1.5 клон — неполный протокол, глюки на高速 CAN
- PID'ы разные у разных марок — нужна БД по производителям
- LLM галлюцинации — только grounding/RAG спасёт
- 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 # этот файл
Запуск (в салоне авто)
# 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
Что произойдёт:
- Подключится к ELM327
- Прочитает VIN
- Считает ошибки (stored mode 03 + pending mode 07)
- Считает параметры (обороты, температура, скорость, дроссель, MAP, IAT, топливные тримы)
- Отправит в DeepSeek → напечатает диагноз
- Сохранит всё в
elmer.db(SQLite)
Десктопный UI (Web)
Для тестирования на ноутбуке (не тыкать грязным пальцем в телефон):
web/app.py— Flask (порт 5005), один endpoint/api/diagnose(POST)web/templates/index.html— одна кнопка, тёмная тема, результат- В будущем этот же код — прототип серверного API
Запуск:
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
- Два режима работы клиента:
- «Опрос» (основной): клиент сам читает VIN + DTC + PID'ы, шлёт JSON серверу
- «Ретранслятор» (расширенный): сервер шлёт сырые 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.txtDEEPSEEK_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.