2.9 KiB
2.9 KiB
Логика диагностики — два режима
Архитектура
Три слоя:
- Relay (Android) — тупой ретранслятор: получил команду → отправил в ELM → вернул ответ
- Script Engine (сервер) — отправляет команды по расписанию, собирает ответы
- 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 получает: сырые данные + вопрос пользователя → ответ с диагнозом.