# ELM327 Relay — хронология ошибок (АРХИВ) > **Устарело**. Актуальный документ: `doc/failures-journal.md` ## Дата: 2026-07-04 | Версия на момент написания: v0.3.7-dev --- ## Текущая версия **v0.3.7-dev** (commit `3e4eba7`, ветка `opus-fixes`) --- ## Что работает (v0.3.5-dev, тест 13/15) - AndrOBD-совместимый init: `ATSP0 → ATI → ATS0 → ATL0 → ATE0` - Клон v1.5: ATAT1 и ATST пропускаются - `handle()` **без AT-команд** — только state tracking (как AndrOBD) - `recover()` — только сброс state в READY - 87% успешных PID-команд после прогрева ## Что НЕ работает - **Буферный сдвиг после init**: первые 1-2 команды возвращают мусор/пустоту - **STOPPED от ELM**: протокол останавливается, нужен перезапуск - **Двигатель заглушен**: PID не работают, только ATRV --- ## ВСЕ ошибки (хронология) ### Ошибка 1: Freeze detection через ATRV (v0.3.0-dev) **Что сделано**: каждые 10 команд слали ATRV для проверки залипания клона. **Почему ошибка**: ATRV ломает синхронизацию команд. Ответ "12.6V" попадает в буфер и читается как ответ на следующий PID. **Исправлено**: удалено в v0.3.2-dev. ### Ошибка 2: AT-команды в handle() (v0.1.x–v0.3.3-dev) **Что сделано**: handle() при STOPPED/UNABLE/BUS_ERROR слал ATPC→ATWS→ATSP0. **Почему ошибка**: AT-команды отправляются внутри обработки ответа текущей команды. Их ответы загрязняют буфер для следующей команды. **Исправлено**: удалено в v0.3.5-dev. handle() теперь только меняет state. ### Ошибка 3: AT-команды в recover() (v0.1.x–v0.3.3-dev) **Что сделано**: recover() слал ATPC→ATWS→ATSP0→ATE0 при state=ERROR/DISCONNECTED. **Почему ошибка**: recover() вызывается из sendCommand() перед отправкой команды. AT-ответы могут не успеть полностью прийти до отправки PID. **Исправлено**: упрощён в v0.3.3-dev. Только сброс state и timeout. ### Ошибка 4: Дренаж 0100 после init (v0.3.6-dev) **Что сделано**: попытка поглотить буферный сдвиг отправкой 0100 сразу после init. **Почему ошибка**: дренаж сам вызывает сдвиг буфера и дезориентирует клон. **Исправлено**: удалено в v0.3.7-dev. ### Ошибка 5: Recovery ATSP0 в relayLoop (v0.3.5-dev–v0.3.7-dev) **Что сделано**: после STOPPED или пустого ответа — ATSP0 для перезапуска протокола. **Почему ошибка**: ATSP0 через sendBlocking блокирует single-thread executor. Последующие команды ждут в очереди, тест видит таймауты. **Текущий статус**: всё ещё в коде v0.3.7-dev. ### Ошибка 6: Тест без device_id в /response **Что сделано**: тестовый скрипт вызывал `/response?wait=3` без device_id. **Почему ошибка**: сервер возвращал ответы от чужих устройств/сессий. **Исправлено**: сервер (raw_elm.py) обновлён — `/response` принимает `device_id` параметр. Тест обновлён. ### Ошибка 7: Тест без обновления seq **Что сделано**: тест всегда слал `seq=0` в `/response`. **Почему ошибка**: сервер возвращал один и тот же ответ многократно. **Исправлено**: тест обновляет seq после каждого ответа. ### Ошибка 8: Версия на сайте не обновлялась **Что сделано**: деплой менял HTML только в `/opt/elmer/web/templates/`. **Почему ошибка**: Flask использует `/opt/elmer/templates/index.html`. **Исправлено**: деплой теперь обновляет оба файла. --- ## Отличия от AndrOBD | | AndrOBD | Наш код | |---|---|---| | Архитектура | Асинхронный (поток читает → handleTelegram) | Синхронный (sendCommand → ждать ответ) | | write() | Не дренирует перед отправкой | drainInput() перед каждым write() | | Init | ATSP0→ATAT1→ATS0→ATL0→ATE0 | ATSP0→ATI→ATS0→ATL0→ATE0 | | ATI | Не используется | Для детекта клона v1.5 | | handle() | Только state tracking | Только state tracking ✅ | | Ошибки | Не шлёт AT-команд из handle() | Не шлёт AT-команд ✅ | --- ## Ключевые файлы | Файл | Состояние | |------|-----------| | `ElmProtocol.kt` | handle() без AT-команд, recover() пустой | | `RawRelayService.kt` | relayLoop с recovery ATSP0 | | `ElmActor.kt` | Single-thread executor | | `api/raw_elm.py` | /response с device_id фильтром |