# 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 ` - [ ] Привязать к `/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: как собрать самому, как использовать с чужим сервером --- ## Заметки по итогам обсуждения - **Гипотеза подтверждена:** 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.*