Files
elmer/STRUCTURE.md
T

14 KiB
Raw Blame History

Структура репозитория elmAI

elmAI — сервис OBD2-диагностики автомобилей через ELM327 + LLM (DeepSeek). Android-приложение + Python-сервер. Анализ ошибок ЭБУ, live-параметры, диагноз через ИИ.


Корневые файлы

Файл Назначение
run.py Главная точка входа (CLI). Подключается к ELM327 по Bluetooth, читает VIN/DTC/PID, сохраняет в SQLite, отправляет в LLM. Запуск: python run.py [--no-llm] [--port]
config.yaml Конфигурация: LLM (API key, модель), ELM327 (порт, baudrate), список PID для чтения
requirements.txt Зависимости Python: pyserial, pyyaml, requests, flask, flask-cors
deploy.sh Скрипт деплоя на сервер obdai.ru: обновление репо, venv, systemd-сервис (gunicorn), nginx, SSL (certbot)
legacy-deploy.sh Устаревшая версия деплоя (ветка fat-client, GPT-OSS модель)
analysis.md Анализ и план проекта от 2025-05-25: железо, ЦА, требования, компоненты, протокол, риски
idea.md Концепция сервиса: OBD2 + AI диагностика, три компонента (сервер, Android, десктоп)
morda.md Макет UI (морда) v2: иконки-светофоры, кнопка-трансформер, поле вывода, поле ввода
QUICKSTART.md Быстрый старт: тест с mock ELM327, тест в машине, веб-интерфейс
resume.txt Резюме проекта для нового чата: версия v0.77.0-dev, инструкции по деплою
legacy-resume.txt Устаревшее резюме (v0.48.0, ветка master)
CHANGELOG.md Полное описание проекта: архитектура, модули, эндпоинты, БД, стейт-машина (актуально v0.95.0-dev)
token.txt Токены и ключи: gitea, DeepSeek API, SSH-ключ VM
STRUCTURE.md Этот файл — описание структуры репозитория

api/ — Flask REST API + БД + парсинг

Файл Назначение
__init__.py Пустой (пакет)
config.py Загрузка config.yaml с подстановкой ${VAR} из переменных окружения. Кэш через @lru_cache
db.py SQLite-база данных (WAL mode). Таблицы: sessions, cars, diagnostic_tokens, llm_messages, ecu_parameters, dtc_codes, command_queue. Класс Database
routes.py Основные эндпоинты: GET /api/v1/script, POST /api/v1/session/upload, POST /api/v1/chat, POST /api/v1/elm/probe. Проверка X-Api-Key, сборка промпта для LLM
dtc.py DTC-эндпоинты: POST /api/v1/dtc/decode (расшифровка кодов из справочника), POST /api/v1/dtc/upload. Справочник из doc/dtc_codes.txt
ping.py Эндпоинты проверки: GET /api/v1/ping (доступность), GET /api/v1/ping-llm (проверка LLM с адаптивным кэшем 60с/7с)
parser.py Парсинг батча ELM-ответов: VIN (из decoded и raw HEX), DTC stored/pending (mode 03/07), PID-параметры (mode 01)
scripts.py Сборка диагностических скриптов трёх уровней: L0 (5 PID + stored DTC), L1 (8 PID + VIN + stored/pending), L2 (14 PID + калибровки). + динамические скрипты
raw_elm.py Сырое взаимодействие с ELM327: локальный режим (прямое подключение) и удалённый (через Android-реле). HTTP-очередь команд

brain/ — LLM-клиент и промпты

Файл Назначение
__init__.py Пустой (пакет)
client.py Diagnoser — HTTP-клиент к OpenAI-совместимому API (api.aillm.ru). Модели: gpt-oss-120b, qwen3-6-27b-fp8. Обработка ошибок: Timeout, 429, 5xx, 4xx
prompts.py SYSTEM_PROMPT (10 правил для диагноза: расшифровка, отклонения, степени уверенности), DYNAMIC_PROMPT (для динамических тестов), build_user_prompt()

obd/ — ELM327-протокол (Python, порт AndrOBD)

Файл Назначение
__init__.py Пустой (пакет)
connection.py SerialTransport — транспортный слой: открыть serial/Bluetooth порт, побайтовое чтение до >, запись + flush
protocol.py AndrOBD — стейт-машина ELM327 (порт ElmProt.java). Состояния: UNDEFINED → INITIALIZING → READY → BUSY → ERROR. Канонический init, обработка BUS ERROR
state.py State (enum состояний) и Rsp (классификация ответов: PROMPT, OK, SEARCHING, ERROR, BUS_ERROR, NODATA и т.д.)
timing.py AdaptiveTiming — адаптивный таймаут (50..2000мс). Увеличивается при таймаутах, уменьшается при быстрых ответах, сброс при BUS ERROR
commands.py Каталог AT-команд ELM327 с метаданными: name, desc, level (0/1/2), safe. L0 (универсальные), L1 (ATAT), L2 (CAF/CFC)
classifier.py Классификация сырых ответов ELM327 и определение уровня устройства по ответам на пробинг
probe.py Пробинг ELM327: трехуровневый каскад (L0→L1→L2), каждая команда с таймаутом 500мс, без ретраев
raw_console.py RawELM — сырой слой без стейт-машины: только send/read/drain/available. Для изучения поведения ELM327

web/ — Веб-интерфейс (Flask)

Файл Назначение
app.py Точка входа Flask: регистрация эндпоинтов, режим RAW (блокировка всех, кроме /elm/raw/*), раздача APK, главная страница
script_builder.py Сборка диагностических скриптов (устаревшая версия — дублирует api/scripts.py)
script_endpoint.py Эндпоинты скриптов (устаревшая версия — дублирует api/routes.py)
script_parser.py Парсинг батча (устаревшая версия — дублирует api/parser.py)
templates/index.html Главная HTML-страница: скачивание APK, десктоп-диагностика, отображение результатов
static/style.css Стили: тёмная тема, оранжевый акцент, карточки, спиннеры, DTC-бейджи

android/ — Android-приложение (Kotlin)

Файл Назначение
build.gradle.kts Корневой build-файл Gradle: плагины Android + Kotlin
settings.gradle.kts Настройки Gradle-проекта
gradle.properties Свойства Gradle
gradlew Gradle Wrapper (исполняемый)
app/build.gradle.kts Модуль app: minSdk 24, OkHttp 4.12.0, зависимости
app/src/ Исходники Android-приложения (Kotlin) — основной клиент + raw-реле
raw/build.gradle.kts Модуль raw — ретранслятор ELM327 через HTTP
doc/opus-review-android.md Рецензия кода Android-приложения
doc/opus-questions-android.md Вопросы по Android после рецензии
gradle/wrapper/ Gradle Wrapper JAR и настройки

tools/ — Вспомогательные утилиты

Файл Назначение
mock_elm327.py Эмулятор ELM327 v1.5 через TCP (порт 35000). Отвечает на AT-команды, PID, DTC, VIN. Для тестирования без реального сканера
mock_elm327_v2.py Улучшенный мок: поддержка > как разделителя, ATST, случайные ошибки (BUS BUSY, UNABLE), побайтовая отправка
elm_console.py Интерактивная консоль ELM327 (сырой режим). Команды: ATZ, 0105, !drain, !timeout, !log. Для изучения поведения ELM
elm_relay.py Интерактивная консоль удалённого управления ELM327 через Android-реле. HTTP-команды: !status, !history, !mode
test_androbd.py Тест AndrOBD-протокола против Mock ELM327 v2: проверка что ответы не перемешаны (VIN → DTC → RPM → coolant)
analyze_sessions.py Анализ сессий из SQLite: статистика команд, ошибок, пустых ответов

scripts/ — Скрипты развёртывания

Файл Назначение
setup-bt.sh Настройка Bluetooth-сопряжения с ELM327: поиск, pairing, rfcomm bind на /dev/rfcomm0

tests/ — Автотесты

Файл Назначение
test_all.py Сквозные тесты (без LLM): сборка скриптов, парсер ELM-ответов (VIN из decoded/raw, DTC, PID), работа с БД, идемпотентность, эндпоинты

doc/ — Документация и исследования

Файл Назначение
architecture.md Полная архитектура проекта: два режима (app/raw), схема, эндпоинты, модули
roadmap.md План развития проекта
research.md Исследования и заметки
competitors.md Анализ конкурентов
diagnostic-logic.md Логика диагностики
dynamic-diagnostics-analysis-2026-06-14.md Анализ динамической диагностики
dynamic-tests.md Динамические тесты
dtc_codes.txt Справочник DTC-кодов (формат: P0301=Пропуски зажигания цилиндр 1)
elm-reference.md Справочник по ELM327
elm-raw-relay-plan.md План raw-реле
failures-journal.md Журнал отказов
field-test-2026-06-07.md Полевой тест
git-guide.md Гайд по Git
morda-v2.md Макет UI v2
mpscholar-automotive-sensing-actuators.md Обучающий материал
opinion-dynamic-diagnostics-2026-06-14.md Мнение по динамической диагностике
relay-mistakes-2026-07-04.md Ошибки реле
test-cases.md Тест-кейсы
SETUP.md Инструкция по установке
audit-2026-06-07.md Аудит проекта
audit-prompt.md Промпт для аудита
opus-review.md Рецензия кода (Opus)
opus-fix-plan.md План исправлений по рецензии
opus-questions.md Вопросы к Opus
opus-questions-post-tests-2026-06-29.md Вопросы после тестов
opus-recheck-request-2026-06-28.md Запрос на перепроверку
opus-review-android.md Рецензия Android-кода
sonnet-apk-cache-questions-2026-06-28.md Вопросы по кэшу APK
android-bugs-2026-05-25.md Баги Android
claude-analysis-elm.md / claude-analysis-elm-v2.md Анализ ELM от Claude
claude-request-elm.md / claude-request-elm-v2.md Запросы к Claude по ELM
session-*.md Логи сессий разработки по датам
session-resume-2026-06-14.md Резюме сессии
history/ Архив старых заметок, логов сессий и результатов тестов по датам
history/2026-05-31.md Лог сессии 31 мая
history/2026-06-03.md Лог сессии 3 июня
history/2026-06-05.md Лог сессии 5 июня
history/2026-06-06.md Лог сессии 6 июня
history/2026-06-07.md Лог сессии 7 июня
history/2026-06-07-plans.md Планы на 7 июня
history/2026-06-10.md Лог сессии 10 июня
history/opus-recheck-analysis-2026-06-28.md Анализ перепроверки Opus
history/opus-sonnet-comparison-2026-06-29.md Сравнение Opus vs Sonnet
history/session-summary-2026-06-28.md Сводка сессии 28 июня
history/sonnet-response-post-tests-2026-06-29.md Ответ Sonnet после тестов
history/test-results-2026-06-28.md Результаты тестов 28 июня
history/test-results-2026-07-04.md Результаты тестов 4 июля