diff --git a/doc/field-test-2026-06-07.md b/doc/field-test-2026-06-07.md new file mode 100644 index 0000000..7d01b61 --- /dev/null +++ b/doc/field-test-2026-06-07.md @@ -0,0 +1,144 @@ +# Полевой тест elmAI v0.48.0 — 7 июня 2026 + +## Что тестируем + +APK: https://obdai.ru/elmer.apk (v0.48.0) +Сервер: https://obdai.ru + +## Что сделано (все изменения) + +### Пробинг ELM327 (НОВОЕ) +- Сервер больше не шлёт ATAT1/ATSTxx слепо — не вешает клоны +- При первом подключении нового ELM — каскадный тест: + - Уровень 0: ATE0 ATL0 ATS0 ATH1 ATSP0 ATDPN ATRV ATI (все клоны) + - Уровень 1: +ATAT1 (хорошие клоны) + - Уровень 2: +ATCAF1 ATCFC1 (настоящий ELM) +- Результат сохраняется в БД по BT MAC +- Нет в профиле → не слать. Никаких ретраев на неизвестное. + +### Скрипты под уровень устройства +- L0: 5 PIDs + ошибки (однокадровые, без VIN) +- L1: 8 PIDs + VIN + stored/pending ошибки +- L2: 14 PIDs + VIN + калибровки + все ошибки + +### Рефакторинг сервера +- `obd/commands.py` — каталог ВСЕХ AT-команд с метаданными +- `obd/classifier.py` — классификация ответов +- `obd/connection.py` — транспортный слой +- Код разбит на независимые модули + +### Android: фикс вывода +- Статус: `append("\n...")` вместо `text =` (не перекрывается) +- Таймер: отдельный TextView, тикает только во время обмена (как Engine Time) +- TestService: адаптивные таймауты вместо жёстких sleep +- TestService: добавлен ATS0 в инициализацию + +--- + +## Как тестировать + +### Подготовка +1. Скачай и установи APK: https://obdai.ru/elmer.apk +2. Вставь ELM327 в OBD2-разъём машины +3. Заведи двигатель (для части PIDs нужен работающий двигатель) +4. Сопряги ELM327 с телефоном по Bluetooth (пароль 1234 или 0000) +5. Открой приложение Elmer + +### Тест 1: Кнопка «ТЕСТ» (без сервера) + +Поле ввода: **оставь пустым** (Bluetooth-режим) + +Нажми **«🧪 ТЕСТ (всё локально)»** + +Ожидаемое поведение: +``` +══════════════════ +🔧 ELMER TEST v0.6 + Режим: Bluetooth +══════════════════ + Найден: OBDII (AA:BB:CC:...) +⏳ Подключение... +✅ BT OK +─── ШАГ 1: Связь ─── +→ ATZ ⏱ 2с +← ELM327 v1.5 +✅ СВЯЗЬ ЕСТЬ! +─── ШАГ 2: Инициализация ─── +→ ATE0 ⏱ 0с +← OK +→ ATL0 ⏱ 0с +← OK +→ ATS0 ⏱ 0с +← OK +→ ATH1 ⏱ 0с +← OK +→ ATSP0 ⏱ 1с +← OK +─── ШАГ 3: VIN ─── +→ 0902 ⏱ 3с +← 49 02 01 57 56... + → VIN: WVWZZZ... +─── ШАГ 4: Ошибки ─── +→ 03 ⏱ 1с +← 43 00 + → DTC stored: none +→ 07 ⏱ 1с +← 47 00 + → DTC pending: none +─── ШАГ 5: Параметры ─── +→ 0105 ⏱ 0с +← 41 05 5A + → ОЖ: 50 °C +... (10 параметров) +✅ ТЕСТ ПРОЙДЕН! +``` + +**Что проверять:** +- [ ] Таймер ⏱ тикает ТОЛЬКО во время команд (АТZ, 0902, 0105...) +- [ ] В паузах между командами таймер пустой +- [ ] Строки НЕ перекрываются (каждая с новой строки) +- [ ] Тест НЕ виснет (раньше висел на ATAT1) +- [ ] Если ELM не отвечает — пишет «❌ ELM не отвечает» за ~5 секунд, не дольше + +### Тест 2: Кнопка «Диагностировать» (с сервером) + +Поле ввода: **оставь пустым** (Bluetooth-режим) + +Нажми **«🚗 Диагностировать (сервер)»** + +**Что проверять:** +- [ ] Статус: «BT: AA:BB:CC...» → «BT: OK» +- [ ] Появляются «← ...» (ответы ELM) и «→ ...» (команды от сервера) +- [ ] В конце — диагноз от LLM в рамке ══════ +- [ ] Таймер тикает только когда «→ команда» отправляется +- [ ] Нет зависаний + +### Тест 3: Если есть второй ELM327 + +Подключи другой ELM (другой клон/версия): +- [ ] Приложение находит его по имени (OBD/ELM в названии) +- [ ] Тест должен работать на любом клоне +- [ ] Профиль сохраняется в БД на сервере (по MAC) + +--- + +## Возможные проблемы + +| Симптом | Вероятная причина | +|---------|-------------------| +| «❌ ELM не отвечает» на ATZ | ELM не вставлен в OBD2 или нет питания | +| Долго висит на ATSP0 | Машина не поддерживает авто-протокол | +| VIN не читается | Старая машина без mode 09 | +| «❌ BT: ...» | ELM не сопряжён в настройках Bluetooth | +| Пустой экран после нажатия | Не даны разрешения Bluetooth (Android 12+) | + +--- + +## После теста + +Вернись к компу и скажи: +1. Какие ELM тестировал (версия, цвет, название) +2. Прошёл ли тест +3. Прошла ли диагностика с сервером +4. Были ли зависания +5. Скриншоты экрана (если можно) diff --git a/resume.txt b/resume.txt index 4ebee2d..b75cf26 100644 --- a/resume.txt +++ b/resume.txt @@ -8,7 +8,7 @@ elmAI — Android-приложение + Python-сервер для диагно ### Репозитории - Сервер: https://gitea.services.ngcloud.ru/Nail/elmer (ветка master) -- Android: https://github.com/Repinoid/elmer-android (ветка master) +- Android: https://github.com/Repinoid/elmer-android (ветка relay-only) - Сервер живёт на 5.172.178.213 (SSH: naeel@5.172.178.213, ключ ~/.ssh/naeel_vm_id_ed25519) ### Деплой @@ -29,35 +29,50 @@ ssh -i ~/.ssh/naeel_vm_id_ed25519 naeel@5.172.178.213 \ ``` elmer/ android/ — Android-приложение (Kotlin) - app/src/.../elm/ — ElmProtocol.kt, ElmChecker.kt - app/src/.../ui/ — MainActivity.kt + .../client/ + MainActivity.kt — UI + приёмники + ElmForwardService.kt — BT/TCP-реле + TestService.kt — автономный тест ELM api/ — Flask API (Python) - brain/ — LLM-клиент (Python) + db.py — БД (sessions + device_profiles) + routes.py — эндпоинты + scripts.py — скрипты L0/L1/L2 + parser.py — парсинг ответов + config.py, dtc.py, ping.py + brain/ — LLM-клиент, промпты obd/ — ELM-протокол (Python) + commands.py — каталог AT-команд + classifier.py — классификация ответов + connection.py — SerialTransport + probe.py — пробинг ELM + protocol.py — стейт-машина AndrOBD + state.py — состояния/ответы + timing.py — адаптивный таймаут doc/ — Документация, сессии web/ — Flask web, статика ``` -### Ключевые файлы -- `android/app/build.gradle.kts` — versionName (менять при КАЖДОМ деплое) -- `android/.../elm/ElmProtocol.kt` — стейт-машина AndrOBD (init, sendCommand) -- `android/.../elm/ElmChecker.kt` — checkDevice, checkEcu, scanDtc -- `android/.../ui/MainActivity.kt` — UI (~470 строк, надо разбить) +### Что сделано (сессия 2026-06-07) -### Что уже исправлено (сессия 2026-06-06) -- ELM v1.5 совместимость (init без ретраев, skip v2-команд) -- Статус-строка: append вместо overwrite -- BT-подключение: connect() идемпотентный -- Все таймауты сокращены (2000-3000мс вместо 5000-10000мс) +#### Сервер +- **Пробинг ELM**: трехуровневый каскад (L0/L1/L2), профили в БД по MAC +- **Fix init**: больше не шлём ATAT1/ATSTxx (вешало клоны) +- **Скрипты под уровень**: L0 (5 PIDs), L1 (8 + VIN), L2 (14 + калибровки) +- **Рефакторинг**: код разбит на независимые модули (commands, classifier, connection...) + +#### Android +- **Вывод**: append вместо overwrite (строки не перекрываются) +- **Таймер**: отдельный TextView, тикает только во время обмена (Engine Time) +- **TestService**: адаптивные таймауты, ATS0, \r терминатор ### Что НЕ сделано (TODO) -- Разбить MainActivity.kt (~470 -> <=200 строк) -- Разбить ElmChecker.kt (~270 -> <=200 строк) -- Подробные комментарии перед функциями -- Полевой тест на машине +- Полевой тест на машине ← СЕЙЧАС +- Разбить MainActivity.kt +- Разбить ElmChecker.kt ### Важные правила -- ELM327 v1.5 — фейк (клоны v1.0/v1.4), НЕ слать ATAT1/AT@1/AT@2/ATST -- Все статусы через appendStatus("\n..."), не tvStatus.text = -- Таймер инита макс 14 секунд (было 88) -- Подробности: doc/session-2026-06-06.md +- ELM327 v1.5 — фейк, НЕ слать ATAT1/AT@1/AT@2/ATST/ATCAF1/ATCFC1 +- Все статусы через append("\n..."), не tvStatus.text = +- Таймер операций (opTimerStart/Stop), не сессии +- Версию поднимать ВЕЗДЕ: build.gradle.kts, index.html (2 места), CHANGELOG.md, resume.txt, doc/architecture.md +- В проекте elmer — НЕ спрашивать разрешения, делать сразу