docs: field test guide + update resume for v0.48.0

This commit is contained in:
“Naeel”
2026-06-07 06:41:28 +04:00
parent 2de4bb9443
commit bb309eaccb
2 changed files with 181 additions and 22 deletions
+144
View File
@@ -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. Скриншоты экрана (если можно)
+37 -22
View File
@@ -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 — НЕ спрашивать разрешения, делать сразу