diff --git a/doc/diagnostic-logic.md b/doc/diagnostic-logic.md new file mode 100644 index 0000000..7e8ea54 --- /dev/null +++ b/doc/diagnostic-logic.md @@ -0,0 +1,85 @@ +# Логика диагностики — два режима + +## Архитектура + +Три слоя: +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 получает: сырые данные + вопрос пользователя → ответ с диагнозом.