# Bafang Intelligence Report v3.0

**Для:** BBS Flash v3.0 (Блок 2 — Sonnet Development)
**Статус:** Block 1 (Opus Research) — завершён
**Дата:** 2 августа 2026
**Целевое железо заказчика:** Trek Roscoe 8 (2020) + BBS02B 48V 750W, контроллер HZXT SZZ9, FW V2.0.1.1, HW V1.1, дисплей 850C (SW 3.2B-V2), 32T перед / SRAM PG-1230 11–50T зад, колесо 27.5×2.8, райдер 95 кг, ODO 5198 км

---

## ✅ 0. СКОУП ЗАФИКСИРОВАН — РЕШЕНИЯ ЗАКАЗЧИКА ПРИНЯТЫ

Принцип, заданный Антоном: **«используем только те функции, которые доступны дисплею; если что-то не стыкуется — исключаем; нужна только реально рабочая тема».** Ниже — что вошло в скоуп и что вычеркнуто.

### 0.1. ❌ ВЫЧЕРКНУТО: температура мотора

**Датчика температуры в BBS02 нет — подтверждено заказчиком и источниками.** Карл Гесслейн в своём гайде рекомендует ставить внешний термощуп (~$2) именно потому, что штатного нет; райдер на ebikesforum описывает монтаж **внешнего** датчика на корпус с термопастой по той же причине.

Косвенное подтверждение с железа заказчика: на его 850C страница Battery Information показывает температуру как `--°C`, потому что данные приходят только от smart-BMS, которого в его пакете нет.

**Следствие:** боль №1 (перегрев на апхилах) решается **не телеметрией, а Reality Check + обучением каденсу** (раздел 4, уровень 3). Это единственный работающий путь без нового железа.

### 0.2. ❌ ВЫЧЕРКНУТО: Live-телеметрия 10 Гц во время поездки

Два физических блокера, не обходимых софтом:

1. **Разъём один.** Кабель конфигуратора включается в тот же порт, где дисплей. Либо ноутбук, либо дисплей — одновременно нельзя. Ехать в лес с ноутбуком на руле нереально.
2. **Протокол конфигурации ≠ протокол дисплея.** Реализованный в v2.0 UART 1200 бод — это чтение/запись блоков настроек (0x51/0x52/0x53/0x54). Живые данные идут по протоколу дисплея, это отдельная реализация (эмуляция 850C), а не расширение существующей.

**Что взамен (раздел 0.4):** «Стендовый режим» — телеметрия только в гараже, с ноутбуком, на вывешенном колесе. Ровно для P0-верификации max RPM.

### 0.3. ❌ ВЫЧЕРКНУТО: фантомные фичи из мастер-гайда

- **AI Tuning на «данных сообщества» (TensorFlow.js)** — датасета не существует, его никто не собирал. Обучать не на чем.
- **WebXR/AR превью** — максимальная стоимость, минимальная польза для настройки мотора.

### 0.4. ✅ ЧТО РЕАЛЬНО ДОСТУПНО (инвентарь по железу заказчика)

Проверено по скриншотам его 850C — эти данные контроллер **действительно отдаёт**:

| Данные | Откуда | Статус для v3.0 |
|---|---|---|
| Скорость (тек./сред./макс.) | дисплей, протокол дисплея | 🟡 Стендовый режим |
| **Мощность, Вт** | дисплей показывает `0W` в реальном времени | 🟡 Стендовый режим |
| Напряжение пакета | `46.5V` на странице Battery Info | 🟡 Стендовый режим |
| Заряд, % | `51%` | 🟡 Стендовый режим |
| ODO / Trip / Cap-out мАч | `5198.5 km / 772.1 km / 347018 mAh` | 🟢 Ручной ввод в аналитику |
| Уровень PAS, коды ошибок | дисплей | 🟡 Стендовый режим |
| **Температура** | — | ❌ Не существует |
| **Каденс** | — | ❌ BBS02 не отдаёт каденс наружу |
| Все параметры конфигурации | UART 1200, **работает в v2.0** | ✅ Ядро продукта |

**Вывод:** мощность и напряжение технически достижимы (дисплей их получает), но упираются в блокер «один разъём». Поэтому они уходят в стендовый режим, а не в дорожный HUD.

### 0.5. 🎨 UI: тёмный неон vs светлый rally — разрешено переключателем

| Источник | Требование |
|---|---|
| MASTER_GUIDE Часть 3C / Часть 7 | Тёмная тема `#0a0e1a`, неон, glassmorphism |
| Прямой ответ Антона в /grill-me (п.1) | **Светлый**, Colin McRae Rally / F1, стрелочные приборы |

Мастер-гайд сам предусматривает «Темная/светлая тема toggle» (Часть 6, задача B). **Решение: обе темы на одних CSS-переменных, светлая rally — по умолчанию** (прямой ответ заказчика приоритетнее). Стоимость второй темы близка к нулю. Спека в разделе 5 даёт обе палитры.

---

## 1. Community eMTB Presets (топ-3 для тяжёлых апхилов)

> ⚠️ Важнейшая находка исследования: **ни один авторитетный источник не рекомендует «больше ампер» как решение для апхила.** Консенсус обратный.

### Мета-правило, которое перекрывает любой пресет

Гид по крутым подъёмам на mid-drive формулирует это прямо: <cite index="22-1">крутые подъёмы решаются не «больше ампер», а передаточным отношением × каденсом: меньшая передняя звезда + большая кассета, каденс 70–100 об/мин, мягкие ramp'ы тока и управление нагревом. Мотор быстрее вращается = меньше нагрев при той же мощности.</cite> Для BBS02 там же рекомендуется 30–34T перед с кассетой 11–46/50.

Карл Гесслейн в «Programming The BBS02 Without Frying Your Controller» описывает механизм: <cite index="19-1">райдер, удерживающий каденс выше ~60 об/мин, не перегреет мотор; райдер, позволяющий оборотам упасть ниже — рискует перегревом при широком диапазоне настроек контроллера, потому что у BBS0X нет фазового ограничения тока. На подъёме нужен высокий каденс, если хочется больше мощности без сгоревшего контроллера; рекомендуется использовать курок газа на подъёмах и переключаться на достаточно низкую передачу.</cite> Там же — ключевое про сам лимит: <cite index="19-1">установка лимита тока в 25А производит существенно больше тепла, особенно на низких скоростях, независимо от выбранного режима PAS, газа, уклона или передачи.</cite>

Контр-интуитивная механика PAS, которую надо отразить в тултипах: <cite index="19-1">система PAS работает как переключатель заданного каденса и ассистирует ТЕМ БОЛЬШЕ, чем МЕНЬШЕ вы крутите — то есть чтобы получить больше мощности на подъёме, нужно переключиться на передачу ВЫШЕ, а не ниже (или наоборот понизить уровень PAS).</cite>

### Preset 1 — «Smooth Climber» (наиболее задокументированный реальный тест)

Источник: тред *BBS02B Settings/Pedal Assist/Stop Decay* на forums.electricbikereview.com (стр. 6). Райдер описывает конкретное изменение и результат замера.

| Параметр | Значение | Было |
|---|---|---|
| Start Current | **9%** | 20% |
| Slow Start Mode | **4** | 7 |
| Stop Decay | **95** (×10ms) | 0 |
| Keep Current | **90%** | 85% |

<cite index="18-1">Тест: 22.8 миль, 904 фута набора, максимальный уклон 18%, максимальная скорость 32.2 mph, средняя 13.7 mph, общий вес 300 фунтов, +80°F. Расход составил 14.29 Вт·ч/милю, что оказалось лучше ожидаемых 15–16.</cite> <cite index="18-1">Разброс мощности стал заметно меньше, пиковая мощность ниже, спад мощности меньше; общее впечатление — мощность работает существенно плавнее, скорость более стабильна, при этом разницы в разгоне не замечено.</cite>

**Почему работает:** снижение Start Current и Slow Start убирает пиковый бросок тока (= пиковый нагрев и удар по цепи), а высокий Stop Decay и Keep Current сглаживают провалы — мотор работает в более узком, более холодном диапазоне при том же среднем результате. Это ровно то, что нужно для леса.

> ⚠️ Тест проводился на **BBSHD** (2016, контроллер Luna, 52V). Перенос на BBS02B правдоподобен, но `REQUIRES_VERIFICATION` на конкретном железе.

### Preset 2 — «Tamed PAS» (для контроля на медленных технических участках)

Источник: тред *Taming the BBS02 Beast* на ebikesforum.com.

| Параметр | Значение |
|---|---|
| Current Decay | **6** (компромисс) |

<cite index="23-1">Установка Current Decay на промежуточное значение 6 вместо обычного 2 (и вместо полного 8 в «hill config») вернула пиковую силу PAS примерно к 650 Вт на уровне 9 и 50 Вт на уровне 1 — что даёт начинающему райдеру хороший рабочий диапазон.</cite>

Тот же тред содержит золотое правило, которое должно быть в UI приложения: <cite index="23-1">всегда сохраняйте копию текущей конфигурации ПЕРЕД тем, как что-либо менять.</cite>

### Preset 3 — «Gear-first» (техника вместо настроек)

Источник: тред *bbs02 steep hill best practices?* на Endless Sphere. Не набор цифр, а рабочая практика от райдера, который ездит по лесу:

<cite index="21-1">«Много езжу по холмам, в основном лес. На супер-крутых использую PAS 5 плюс газ и педалирование. Обычно езжу на 3 из 5, педали плюс газ на плохом покрытии. Ни разу не перегрелся, даже когда до мотора было не дотронуться. Самое важное — правильно использовать передачи.»</cite>

**Вывод для приложения:** Reality Check и подсказки должны толкать пользователя к передачам и каденсу, а не к увеличению тока. Это единственная стратегия, подтверждённая всеми источниками.

### 🔴 Анти-паттерн: что НЕ делать

Найден источник с рекомендациями <cite index="24-1">включить «Overheat Protection» с порогом 85°C и выставить «Max Continuous Power» 400W</cite> — **таких параметров в конфиг-туле BBS02 не существует.** Источник — AI-сгенерированный контент на AliExpress-блоге с собственным дисклеймером о том, что материал сгенерирован ИИ. Пример ровно того типа галлюцинации, против которого написан протокол в Части 0.2 мастер-гайда. В приложение не переносить.

---

## 2. Technical Specs

### 2.1. Max RPM (каденс на кривошипе, не обороты ротора)

> Терминологическое уточнение из первоисточника: <cite index="4-1">«RPM» здесь — обороты кривошипа после редуктора, то есть каденс педалей. Сам мотор вращается обычно 2–4 тысячи об/мин и редуцируется под каденс райдера.</cite>

| Модель | Max RPM (каденс) | Уверенность | Источник |
|---|---|---|---|
| **BBS01** | ~78–100 (сильный разброс по версиям) | 🟡 Низкая | <cite index="5-1">На форуме Pedelecs обсуждается разброс «от 78 до 140» между версиями, при этом обратная ЭДС наступает выше ~85 об/мин на 36V и ближе к 100 об/мин на 44.4V</cite> |
| **BBS02 750W** | **~120** (заводское) | 🟢 Высокая | <cite index="6-1">В обзоре BBSHD прямо указано, что BBS02 750W работал около 120 RPM</cite>; <cite index="7-1">в описании тюнингованной сборки на ES: «155 RPM при 58.8V (заводская настройка — максимум 120 RPM)»</cite>; <cite index="9-1">«Throttle-only на моём новом 48V BBS02 крутит быстрее, чем я могу педалировать. Больше 120 RPM.»</cite> |
| **BBS02 (иная версия)** | ~113 | 🟡 Средняя | <cite index="5-1">упоминается вариант BBS02 с 113 об/мин</cite> |
| **BBSHD** | **130–150** (150 @48V) | 🟢 Высокая | <cite index="4-1">«BBSHD — совсем другая лига, у него верхний предел 150 RPM на 48 вольт (130 RPM на 36 вольт)»</cite>; <cite index="6-1">«RPM увеличен до 130-150RPM по сравнению с BBS02 750W»</cite> |

> ❌ **Значение «130 ±5 одинаково для всех трёх моделей» из MASTER_GUIDE Часть 8.2 — ОШИБОЧНО.** Ни один источник его не подтверждает; данные показывают существенный разброс между моделями и версиями. Также ошибочно «BBS01 = только 36V» — BBS01B существует в 48V.
>
> `REQUIRES_VERIFICATION`: точный max RPM конкретно для контроллера **HZXT SZZ9 FW V2.0.1.1** заказчика. Проверяется эмпирически: вывесить заднее колесо, дать полный газ на высшей передаче, снять показания каденса.

### 2.2. Физический предел скорости — 32T × 27.5″×2.8″

**Геометрия (расчёт):**
- Обод 27.5″ = ISO 584 мм; покрышка 2.8″ = 71.1 мм
- Диаметр = 584 + 2×71.1 = **726 мм** → длина окружности = **2.282 м**
- Передаточное 32T/11T = **2.909**

| Каденс | Скорость |
|---|---|
| 80 об/мин | 31.9 км/ч |
| 100 об/мин | 39.8 км/ч |
| **110 об/мин** | **43.8 км/ч** |
| **120 об/мин (заводской предел BBS02)** | **47.8 км/ч** |
| 130 об/мин | 51.8 км/ч |
| 150 об/мин (уровень BBSHD) | 59.7 км/ч |

**→ Честный предел моторной тяги для железа заказчика: ~44–48 км/ч** (диапазон, потому что max RPM не верифицирован точно).

**Кросс-валидация:** на дисплее 850C заказчика зафиксирован Max Speed **56.1 км/ч**. Это выше моторного предела → достигнуто накатом/на спуске, мотор в этот момент уже не тянул. Модель подтверждается реальными данными.

> ✅ Цифра «44 км/ч» из мастер-гайда попадает в нижнюю границу расчётного диапазона — принимается, но корректнее показывать **44–48 км/ч** как вилку.

**Кросс-проверка на живом железе (ES, BBS02, 26″):** <cite index="7-1">райдер сообщает 55 км/ч на плоскости с шипованной резиной 26″ и связкой 46T перед / 11T зад; при вывешенном заднем колесе мотор выкручивается до 73 км/ч, на спуске 70.</cite> Пересчёт на 46T/26″ даёт близкий порядок — модель консистентна.

**Реальность для подъёмов (granny 32T/50T, ratio 0.640):**

| Скорость на подъёме | Требуемый каденс |
|---|---|
| 6 км/ч | 68 об/мин |
| 8 км/ч | 91 об/мин |
| 10 км/ч | 114 об/мин |

→ **У заказчика механики хватает с огромным запасом.** На 8 км/ч в гору он держит 91 об/мин — идеально внутри «холодной» зоны 70–100 об/мин. Это подтверждает главную рекомендацию: ему не нужен высокий ток, ему нужно пользоваться 50T.

### 2.3. Токовые лимиты BBS02 vs BBSHD

| Модель | Заводской max | Аппаратный потолок | Примечание |
|---|---|---|---|
| BBS02 | **25 A** | 25 A (софт не даёт больше) | <cite index="6-1">Подтверждено: старый контроллер BBS02 упирался в 25 ампер</cite> |
| BBSHD | 30 A | ~40 A (12-FET) | <cite index="6-1">Есть подтверждение, что новый 12-FET контроллер BBSHD спроектирован под максимум 40 ампер против 25 у BBS02, но с завода ограничен 30 А и программно выше не поднимается</cite> |

**Требование к BMS:** <cite index="8-1">для полной отдачи BBS02 требуется батарея с достаточным током разряда — минимум 30 A BMS.</cite> У заказчика 30–40 A → запас есть.

**Крутящий момент:** <cite index="8-1">BBS02 выдаёт до 120 Н·м против 80 Н·м у BBS01</cite>; <cite index="6-1">BBSHD — 160 Н·м, редукция 1:21.9.</cite>

**Тепловой профиль (важно для eMTB-фокуса):** <cite index="10-1">На пологом и умеренном рельефе (≤8%) BBS02 справляется, 120 Н·м достаточно. На крутых подъёмах (≥10%) или длинных горных перевалах BBSHD с его 160 Н·м и лучшим отводом тепла держит температуру ниже — BBS02 начнёт троттлиться раньше из-за накопления тепла.</cite>

### 2.4. Практический тепловой контроль (без штатного датчика)

Из отчёта v2.0 (Карл Гесслейн, температурный щуп): 140°F+ (60°C) — прекратить движение и остыть; 130°F+ (54°C) — только полгаза; 120°F+ (49°C) — ехать спокойно; ≤110°F (43°C) — полная нагрузка допустима.

Полевой тест без прибора: <cite index="13-1">если не получается удержать руку на корпусе мотора 10 секунд — слишком горячо, немедленно остановиться. Тепловое повреждение накопительно: даже если мотор выжил, ресурс уже сокращён.</cite>

---

## 3. Physics Formulas

### 3.1. Базовая модель баланса мощности

```
P_total = P_drag + P_rolling + P_grade  (+ P_accel для динамики)

P_drag    = 0.5 × ρ × CdA × v³
P_rolling = Crr × m × g × cos(θ) × v
P_grade   = m × g × sin(θ) × v
P_accel   = m × a × v          (только для расчёта разгона)

θ = atan(grade_percent / 100)
ρ = 1.225 кг/м³ (уровень моря, 15°C)
g = 9.81 м/с²
```

**v_max** решается итеративно (бисекция, 60 итераций, диапазон 0–40 м/с) из:
```
P_motor × η = P_total(v)
где P_motor = V_под_нагрузкой × I_фактический
```

### 3.2. Константы (по требованию — MTB-профиль)

| Параметр | Значение | Комментарий |
|---|---|---|
| **Crr** | **0.012** | грунт/лес (задано в ТЗ). Асфальт 0.004, гравий 0.008, грязь 0.018 |
| **CdA** | **0.65** | MTB-aggressive (задано в ТЗ). Road 0.40, upright 0.55 |
| η (КПД трансмиссии) | 0.85 | `REQUIRES_VERIFICATION` для BBS02 + цепь |
| ρ | 1.225 кг/м³ | |

> ⚠️ **Смена констант с 0.006/0.55 (v2.0) на 0.012/0.65 существенно меняет все цифры.** Пример при 1080 Вт: было 48.6 км/ч на плоскости → станет **44.5 км/ч**. На 8% уклоне: было 28.2 → станет **26.4 км/ч**. Новые значения физически честнее для леса. Sonnet должен сделать Crr/CdA **переключаемыми пресетами покрытия**, а не константами — заказчик ездит и по городу (асфальт), и по лесу.

### 3.3. Референсная таблица (m=115 кг, Crr=0.012, CdA=0.65, η=0.85)

| Мощность | Плоско | 5% | 8% | 12% | 15% |
|---|---|---|---|---|---|
| 200 Вт | 21.8 | 8.5 | 5.9 | 4.1 | 3.4 |
| 300 Вт | 26.3 | 12.3 | 8.7 | 6.2 | 5.1 |
| 400 Вт | 29.9 | 15.8 | 11.4 | 8.2 | 6.7 |
| 500 Вт | 32.8 | 18.9 | 14.0 | 10.1 | 8.4 |
| 600 Вт | 35.4 | 21.8 | 16.4 | 12.1 | 10.0 |
| 750 Вт | 38.6 | 25.5 | 19.9 | 14.8 | 12.4 |
| 900 Вт | 41.5 | 28.9 | 23.0 | 17.5 | 14.7 |
| 1080 Вт (24A×45V) | 44.5 | 32.4 | 26.4 | 20.5 | 17.4 |

*(км/ч; это использованная мощность на валу, до ограничения по каденсу)*

### 3.4. Каденс мотора

```
cadence_rpm = (v_kmh / 3.6) / (gear_ratio × wheel_circumference) × 60

где gear_ratio = chainring_teeth / cog_teeth
    wheel_circumference = π × (ISO_rim_mm + 2 × tire_width_mm) / 1000
```

Таблица ISO диаметров ободов для калькулятора:
| Обозначение | ISO (мм) |
|---|---|
| 26″ | 559 |
| 27.5″ / 650B | 584 |
| 29″ / 700C | 622 |

### 3.5. Просадка напряжения (voltage sag)

```
V_под_нагрузкой = V_разомкнутой_цепи − (I × R_внутреннее)
```
> `REQUIRES_VERIFICATION`: R_внутреннее для конкретного пакета неизвестно. Для 13S4P на LG-ячейках порядок ~60–120 мОм, но это оценка. **Практический путь калибровки для заказчика:** у него есть точка 46.5 В при 51% заряда с дисплея — по нескольким таким замерам под известной нагрузкой можно вычислить R эмпирически. До калибровки использовать ползунок «эффективное напряжение под нагрузкой» (как в v2.0), а не считать sag «точно».

---

## 4. Reality Check Logic

Двухуровневая проверка. Это ключевая фича для честности приложения.

### Уровень 1 — Жёсткий предел по передаче (детерминированный)

```
v_gear_limit = max_cadence_rpm × (chainring/smallest_cog) × circumference × 60 / 1000
```

Если пользователь задаёт цель или Speed Limit выше `v_gear_limit`:

> 🔴 **«Недостижимо на вашей трансмиссии»**
> «С 32T спереди, 11T сзади и колесом 27.5×2.8 мотор упирается в предел каденса при **~47.8 км/ч** (при 120 об/мин). Выше — только накатом под уклон. Чтобы реально ехать быстрее, нужна бо́льшая передняя звезда, а не другие настройки контроллера.»

Расчёт даёт конкретный совет вместо просто запрета:
```
required_chainring = target_kmh × 1000 / (60 × max_rpm × circumference) × smallest_cog
```

### Уровень 2 — Мягкий предел по мощности (вероятностный)

Если цель ниже передаточного предела, но выше того, что даёт доступная мощность (по таблице 3.3) — это **предупреждение, не блокировка**:

> 🟡 «При 20 A на 48 В (≈900 Вт) на 8% уклоне модель даёт ~23 км/ч. Ваша цель 30 км/ч потребует ~1400 Вт — выше возможностей контроллера BBS02.»

### Уровень 3 — Тепловое предупреждение (эвристика, не измерение)

Триггер по комбинации, а не по одному параметру:
```
IF (Current Limit ≥ 22A) AND (расчётный каденс на целевом уклоне < 60 об/мин)
   → 🔴 «Зона перегрева»
```
Обоснование в тексте предупреждения — цитата Карла о том, что 25 А производят существенно больше тепла на низких скоростях, и что каденс ниже ~60 об/мин это главный фактор риска.

### Правило подачи: Reality Check предупреждает, но не запрещает

Исключение — только реальные аппаратные пределы (ток > потолка контроллера, напряжение вне диапазона). Всё остальное — предупреждение с объяснением. Заказчик — опытный пользователь с 5000 км, блокировки будут раздражать.

---

## 5. UI/UX Spec — «Rally Instrument Cluster» (светлая тема)

> Основано на прямом ответе заказчика: Colin McRae Rally / F1, светлый, стрелочные приборы, шкала тока как гоночная.

### 5.1. Палитра (светлая, rally-pace-note)

```css
--paper:       #f4f2ed;  /* фон — цвет пейс-нот, не чистый белый */
--card:        #ffffff;
--ink:         #16181c;  /* основной текст */
--ink-dim:     #5d6470;
--rule:        #d8d4cb;  /* линии разметки */
--rally-red:   #d92b1f;  /* акцент/опасность — цвет гоночной ливреи */
--rally-blue:  #1f4fd9;  /* профиль A */
--rally-green: #1f8a52;  /* профиль B / безопасно */
--rally-amber: #e08a00;  /* предупреждение */
--carbon:      #2a2d33;  /* корпуса приборов */
```

Шрифты: заголовки/цифры — узкий гротеск с моноширинными цифрами (tabular-nums обязательно, иначе стрелки и цифры «прыгают»). Тело — нейтральный гротеск.

### 5.1b. Палитра «Night Stage» (тёмная, по переключателю — из мастер-гайда)

```css
--paper:       #0a0e1a;  /* фон из MASTER_GUIDE */
--card:        #1a1f3a;
--ink:         #e8ecf5;
--ink-dim:     #8b93a7;
--rule:        #2a3050;
--rally-red:   #ff3b5c;  /* неон-акцент/опасность */
--rally-blue:  #4a90e2;  /* профиль A */
--rally-green: #00d9a3;  /* профиль B / безопасно */
--rally-amber: #ff6a13;  /* предупреждение */
--carbon:      #05070f;
```

**Требование:** обе палитры живут на **одном и том же наборе имён переменных**, переключение = смена `data-theme` на `<html>`. Никакой дублирующей вёрстки. Светлая — по умолчанию, выбор запоминается в IndexedDB (не localStorage).

### 5.2. Приборы (SVG, не canvas — нужна доступность и лёгкий DOM)

1. **Спидометр** — стрелочный, красная зона начинается на `v_gear_limit` (динамическая, вычисляется из передач!). Это визуально показывает Reality Check без единого слова.
2. **Шкала тока (A)** — горизонтальная линейная, как датчик boost на ралли-карах. Зоны: зелёная ≤18 A, жёлтая 18–22 A, красная >22 A. Подписи зон — прямо на шкале.
3. **Тахометр каденса** — с явно размеченной «холодной зоной» 70–100 об/мин зелёным и «зоной перегрева» <60 об/мин красным. Это главный обучающий элемент всего приложения.
4. **Мощность (Вт)** — цифровая, крупная, tabular-nums.

### 5.3. Comparative Bars (A/B)

Формат строки: `метрика | бар A | бар B | дельта с цветом и знаком`

| Метрика | Хорошо, если |
|---|---|
| Разгон / launch feel | выше |
| Скорость на уклоне X% | выше |
| Пиковый ток | **ниже** (инверсия цвета!) |
| Расчётный запас хода | выше |
| Тепловая нагрузка | **ниже** (инверсия) |

Критично: для «пикового тока» и «тепловой нагрузки» рост = красный, а не зелёный. Иначе UI будет подталкивать к перегреву.

### 5.4. Анимация байка (по ответу заказчика: «декорации И данные»)

- SVG-профиль байка сбоку, наклон рамы = угол уклона с ползунка
- Скорость вращения колёс привязана к расчётной скорости
- Каденс педалей привязан к расчётному каденсу — **и меняет цвет** при выходе из зоны 70–100 (это тот же обучающий сигнал, что и тахометр)
- Выбор «трассы»: город (плоско, старт-стоп) / лес (переменный уклон) — профиль высоты прокручивается под байком
- `prefers-reduced-motion` — обязательная поддержка

### 5.5. Тултипы

Паттерн: `<details>` или кнопка-«i» рядом с каждым полем. Содержание — 3 блока:
1. **Что делает** (1 строка)
2. **При увеличении →** / **При уменьшении →** (по строке, как просил заказчик)
3. **⚠️ Риск** (только там, где он реален)

---

## 6. Russian Localization

| Параметр (EN) | Название (RU) | Что делает | ↑ Увеличение | ↓ Уменьшение | ⚠️ Риск |
|---|---|---|---|---|---|
| Low Battery Protection | Защита от разряда | Напряжение, ниже которого контроллер отключает мотор | Батарея меньше разряжается, ресурс дольше | Больше пробег, глубже разряд | Слишком низко = деградация ячеек |
| Current Limit | Лимит тока | Максимальный ток контроллера — общий потолок мощности | Больше мощности и тяги | Меньше нагрев, больше пробег | **>22 A на BBS02 = существенно больше тепла на низких скоростях** |
| Assist N Current % | Ток уровня N | Доля общего тока на уровне PAS N | Мощнее на этом уровне | Мягче, экономичнее | На 1-2 уровне высокий % = рывок при старте |
| Assist N Speed % | Скорость уровня N | Потолок скорости на уровне N | Выше разрешённая скорость | Уровень «упирается» раньше | При 100% везде уровни различаются только тягой |
| Wheel Diameter | Диаметр колеса | Калибровка спидометра и всех лимитов по скорости | Спидометр занижает | Спидометр завышает | Неверное значение ломает все скоростные лимиты |
| Speed Meter Signals | Импульсов на оборот | Число магнитов на датчике скорости | — | — | Не соответствует железу = неверная скорость |
| Pedal Sensor Type | Тип датчика педалей | Модель датчика каденса (у BBS02 обычно DoubleSignal-24) | — | — | Неверный тип = PAS не работает |
| Start Current | Стартовый ток | Ток при трогании с места | Резче старт, быстрее срыв с места | Плавнее, мягче к цепи | **Высокий + вес >100 кг + старт в гору = риск для цепи и нейлоновой шестерни** |
| Slow-start Mode | Плавность старта | Скорость нарастания мощности (1–8) | Агрессивнее подхват | Плавнее, комфортнее в городе | 8 + высокий Start Current = удар по трансмиссии |
| Start Degree | Угол включения | Сколько импульсов педалей до включения мотора | Мотор включается позже | Мотор подхватывает раньше | Слишком мало = мотор дёргает при парковке |
| Work Mode | Режим работы | Режим отслеживания каденса | — | — | На BBS02 эффект незначителен, можно оставить Undetermined |
| **Time of Stop** | **Задержка отключения** | Через сколько мотор перестаёт тянуть после остановки педалей | Мотор «догоняет» дольше | **Мгновенное снятие тяги — защита цепи при переключении** | На BBS02B значения <20 часто не принимаются |
| Current Decay | Спад тока | Как быстро падает ток при росте каденса | Резче спад | Мощность держится дольше | Значение 6 — проверенный компромисс |
| Stop Decay | Плавность отпускания | Как плавно гаснет тяга | Мягче отпускание (до 95 в «smooth climber») | Резче обрыв | — |
| Keep Current | Удерживаемый ток | Какая доля тока сохраняется на высоком каденсе | Меньше «провал» тяги при разгоне | Сильнее спад | — |
| Throttle Start/End Voltage | Диапазон газа | Границы срабатывания ручки газа | — | — | Не соответствует ручке = газ не работает или залипает |
| Throttle Mode | Режим газа | Speed = по скорости, Current = по току | — | — | Current даёт более линейный отклик |
| Throttle Start Current | Стартовый ток газа | Резкость отклика газа с нуля | Резче подхват газа | Точнее дозировка на скользком | Высокий = срыв колеса на грунте |

**Термины интерфейса:** Каденс (об/мин), Крутящий момент (Н·м), PAS — уровень помощи, Профиль — сохранённый набор настроек (.el), Прошивка ≠ Настройки (важно: приложение **не** трогает прошивку).

---

## 7. UART Protocol

### 7.1. Протокол конфигурации — ✅ ВЕРИФИЦИРОВАН

Разобран построчно из исходников Пенова (Delphi, `Communication.pas`), реализован и работает в v2.0. 1200 бод, 8N1.

| Блок | ID | Read | Write | Payload |
|---|---|---|---|---|
| General | 0x51 | `11 51 04 B0 <chk>` | — | 16 байт (производитель, модель, HW, FW, ном. напряжение, max ток) |
| Basic | 0x52 | `11 52` | `16 52 18 <24 байта> <chk>` | 24 байта |
| Pedal Assist | 0x53 | `11 53` | `16 53 0B <11 байт> <chk>` | 11 байт |
| Throttle | 0x54 | `11 54` | `16 54 06 <6 байт> <chk>` | 6 байт |

- Контрольная сумма: сумма байт от [1] до предпоследнего, mod 256
- Wheel Diameter кодируется как `дюймы × 2`; 700C = спецзначение 55
- Speed Meter байт: `тип × 64 + количество_сигналов` (тип 2 «By Motor Phase» пишется как 3)
- **Ответ на запись:** код = длине payload при успехе (24/11/6); иное значение = индекс поля, отклонённого по диапазону. Контроллер валидирует ДО записи — некорректное значение просто отвергается, конфигурация не меняется. **Это и есть причина, по которой «окирпичить» контроллер этим протоколом невозможно.**

### 7.2. Протокол телеметрии — `REQUIRES_VERIFICATION`

Отдельный протокол (эмуляция дисплея), в исходниках Пенова отсутствует. Плейсхолдер до верификации на железе. См. раздел 0.2 — рекомендуется не включать в v3.0.

### 7.3. Коды ошибок

> ⚠️ Важнейшая оговорка от первоисточника: <cite index="11-1">номера кодов Bafang не универсально согласованы между всеми дисплеями и моторами.</cite> Приложение должно показывать коды как «вероятное значение», а не как факт.

| Код | Значение | Практика |
|---|---|---|
| 02 | Ошибка газа (сигнал замкнут/залип) | <cite index="14-1">Дисплей показывает 02, когда контроллер обнаруживает, что сигнальная линия газа замкнута на землю или залипла в ненулевом положении при старте</cite> |
| 04 | Датчик Холла мотора | Проверить кабель мотора |
| 07/08 | Неисправность контроллера/мотора | <cite index="14-1">Если код 08 сохраняется при подключённых только батарее и дисплее — контроллер, скорее всего, мёртв. Не ездить с этой ошибкой: закороченный контроллер может быстро разрядить батарею или вызвать возгорание</cite> |
| 09 | Нет связи с BMS батареи | <cite index="14-1">Контроллеры Bafang используют последовательную линию Tx/Rx для связи с BMS; код 09 означает, что данные от батареи не приходят</cite> |
| 10 | Перегрев | <cite index="16-1">Высокая нагрузка на мотор из-за плохой линии цепи может привести к ошибке 10 (перегрев)</cite> |
| **21** | **Датчик скорости** | <cite index="13-1">Прежде чем менять «неисправный» датчик, проверьте, не сместился ли магнит на спице — смещение на 2 мм вызывает эту ошибку и чинится бесплатно</cite> |
| 25 | Тормоз | Проверить датчики тормозных ручек |
| **30** | **Ошибка связи** | Самая частая. <cite index="13-1">У Bafang была известная серия отказов дисплеев C965 начиная с 2016 года — обрывы внутреннего кабеля имитируют проблему контроллера; замена дисплея решает проблему в 95% случаев</cite>. <cite index="16-1">Диагностика «bypass test»: отключить датчики тормозов и газ, оставив только дисплей и мотор — если ошибка ушла, замыкала периферия</cite> |
| 42 | Слишком низкое напряжение батареи | <cite index="11-1">Разрядное напряжение батарейного пакета слишком низкое</cite> |

**Универсальный первый шаг (в UI как подсказка):** <cite index="17-1">выключить и включить батарею, затем переподключить кабель дисплея — это устраняет примерно половину всех кодов ошибок с первой попытки.</cite>

---

## 8. TODO / REQUIRES_VERIFICATION

Список для проверки на реальном железе заказчика перед релизом:

| # | Что проверить | Как | Приоритет |
|---|---|---|---|
| 1 | Max RPM контроллера HZXT SZZ9 FW V2.0.1.1 | Вывесить заднее колесо, полный газ на высшей передаче, снять каденс | 🔴 P0 — от этого зависит весь Reality Check |
| 2 | Минимально принимаемое Time of Stop | Записать 10, прочитать обратно; если отвергнуто — 15, 20 | 🔴 P0 |
| 3 | Реальный BMS-лимит пакета Chamrider | Наклейка на корпусе батареи | 🟡 P1 |
| 4 | Внутреннее сопротивление пакета (для sag) | Несколько замеров V под известной нагрузкой | 🟡 P1 |
| 5 | Работает ли газ во время педалирования (баг BBS02B) | Проверить в PAS 0 и в PAS 3 | 🟡 P1 |
| 6 | Реальный КПД трансмиссии η | Косвенно: сравнить расчёт с GPS-скоростью при известной мощности | 🟢 P2 |
| 7 | Структура телеметрических фреймов | Логический анализатор на линии дисплея | 🟢 P3 (если вообще делаем) |
| 8 | Точность кодов ошибок для 850C | Эмпирически при возникновении | 🟢 P3 |

---

## 9. Передача в Блок 2 (Sonnet)

**Что готово:** физическая модель, пресеты с источниками, Reality Check логика, UI-спека, русский словарь, верифицированный конфиг-протокол.

**Что Sonnet НЕ должен делать:**
- ❌ Рисовать поле «температура мотора» в любом виде (см. 0.1 — датчика не существует)
- ❌ Рисовать поле «каденс» как telemetry-данные (см. 0.4 — контроллер не отдаёт; каденс только **расчётный** в симуляторе)
- ❌ Реализовывать дорожную live-телеметрию 10 Гц (см. 0.2 — один разъём). Только «стендовый режим»
- ❌ Реализовывать AI Tuning / WebXR (см. 0.3 — фантомные фичи)
- ❌ Хардкодить Crr/CdA — это переключаемые пресеты покрытия
- ❌ Использовать localStorage (не работает в среде артефактов; только IndexedDB)

**Приоритет модулей для v3.0:**
1. `RealityCheck.js` — главная ценность, отличает приложение от оригинала
2. `PhysicsSimulator.js` — с переключаемыми покрытиями
3. UI rally-приборка + анимация байка с привязкой к данным
4. Тултипы (все 20+ параметров из раздела 6)
5. Comparative Bars с инверсией цвета для «плохих» метрик
6. PWA/offline — последним

---

**Конец отчёта. Блок 1 завершён.**
