Files
elmer/doc/diagnostic-logic.md
T

2.9 KiB

Логика диагностики — два режима

Архитектура

Три слоя:

  1. Relay (Android) — тупой ретранслятор: получил команду → отправил в ELM → вернул ответ
  2. Script Engine (сервер) — отправляет команды по расписанию, собирает ответы
  3. LLM (сервер) — анализирует собранные данные

Режим 1: Прогрев на месте (3 минуты)

Цель: снять показания на холостых, погазовать, оценить прогрев

Скрипт:

Каждые 2 секунды — 3 PID: 010C (RPM), 0105 (темп), 0111 (дроссель)
Итого: 90 циклов × 3 PID = 270 запросов
При 70% успехе: ~190 ответов (~63 на каждый PID)

Метрики:

  • RPM: мин/макс/среднее на холостых, отклик на газ
  • Температура: скорость прогрева (°C/мин), выход на рабочую
  • Дроссель: положение на холостых, реакция на педаль

Режим 2: В движении (5 минут)

Цель: нагрузочный тест, динамика разгона, поведение под нагрузкой

Скрипт:

Каждые 2 секунды — 3 PID: 010C (RPM), 0105 (темп), 0111 (дроссель)
Итого: 150 циклов × 3 PID = 450 запросов
При 70% успехе: ~315 ответов (~105 на каждый PID)

Метрики:

  • RPM: разгон/торможение, переключение передач
  • Температура: стабильность под нагрузкой
  • Дроссель: соответствие нагрузке

Обработка ошибок

Ответ Действие
41xx... (hex данные) Сохранить, декодировать
STOPPED Пропустить, relay сам восстановит
Пусто / таймаут Пропустить, следующий запрос
3 таймаута подряд Пауза 2с (клон перегрелся)

Выходные данные для LLM

{
  "mode": "warmup",
  "duration_s": 180,
  "total_requests": 270,
  "successful": 190,
  "pids": {
    "010C": {
      "min": 680, "max": 3200, "avg": 1250,
      "samples": [680, 720, 750, ...]
    },
    "0105": {
      "start_temp": 25, "end_temp": 87,
      "warmup_rate": 0.34,
      "samples": [25, 27, 30, ...]
    },
    "0111": {
      "min": 0, "max": 45,
      "samples": [0, 0, 1.5, ...]
    }
  }
}

LLM получает: сырые данные + вопрос пользователя → ответ с диагнозом.