# Логика диагностики — два режима ## Архитектура Три слоя: 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 ```json { "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 получает: сырые данные + вопрос пользователя → ответ с диагнозом.