Files
elmer/analysis.md
T

12 KiB
Raw Blame History

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         # этот файл

Запуск (в салоне авто)

# 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

Запуск:

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.