# 2026-03-22

## Обсуждение Flightradar24 и техстека

### Flightradar24 Explorer подписка
- Слава сообщил, что у него оформлена подписка на тарифный план Explorer в Flightradar24
- Попросил проверить возможности этой подписки и ответить на второй вопрос
- Проведён анализ API подписок Flightradar24:
  - Три уровня подписки API: Explorer (entry-level), Essential, Advanced
  - Explorer предоставляет 60,000 data credits в месяц (по промоции до 120,000 до 31 мая 2026)
  - Доступные endpoints:
    - Статические данные: аэропорты (light), авиакомпании (light)
    - Live данные: позиции самолетов (light и full)
    - Исторические данные: события полетов (light и full), позиции (light и full)
    - Сводки полетов (light и full)
    - Треки полетов
    - Отчет об использовании API
  - Ограничения: нет доступа к airports full, live/historic flight positions count, flight summary count

### Техстек
- Слава согласен с моим предложением по техстеку (контекст предыдущего обсуждения)
- 22 марта 13:24 - Слава подтвердил согласование подхода и предложил приступать к работе

### Голосовые сообщения
- Успешно протестирована отправка голосовых сообщений через скилл voice-tts
- Получено тестовое голосовое сообщение от Славы, отправлен ответ голосом
- Получено подтверждение согласования подхода (голосовое сообщение)
- Представлено ТЗ по интеграции Flightradar24 API (голосовое + файл)

### Flightradar24 API - Карта шумового загрязнения
- 22 марта 13:44 - Получена детальная постановка задачи от Славы: веб-страница с картой шумового загрязнения от самолётов на основе исторических данных Flightradar24
- 22 марта 13:45 - Получены ответы на уточняющие вопросы:
  - География: Московская область
  - Период: до одного года (начать с 6 или 12 месяцев в зависимости от доступности данных)
  - Типы самолётов: все доступные в Flightradar24
  - Модель шума: на первом этапе учитывать только высоту (тип самолёта, время суток, ветер - в бэклог)
  - Визуализация: траектория полёта + шумовая граница (зависит от высоты) на карте
  - Интерактивность: зум, фильтры по времени, при наведении показывать рейс, высоту, скорость, аэропорты
  - Точность: без привязки к реальным замерам шума, санитарные нормы - в бэклог
  - Технологии: простые, доступные, без жёстких предпочтений
  - Доступ к данным: ключ и подписка Explorer уже есть
- 22 марта 14:06 - Создано новое ТЗ: `tasks/flightradar24/reports/ТЗ_Карта_шумового_загрязнения_Flightradar24.md`
- 22 марта 14:10 - Произведена очистка проекта: удалены все файлы, не относящиеся к новой задаче, оставлены только:
  - `config.json` (обновлён под новую задачу)
  - `README.md` (полностью переписан)
  - `scripts/check_api.py` (скрипт проверки API)
  - `scripts/flightradar24_explorer.py` (базовый клиент API)
  - `requirements.txt` (зависимости Python)
  - `reports/ТЗ_Карта_шумового_загрязнения_Flightradar24.md` (основное ТЗ)
- Создана структура проекта: папки `backend/`, `frontend/`, `data/`, `docs/`
- Создан файл `.env.example` с шаблоном конфигурации
- 22 марта 14:15 - Получен sandbox API ключ от Славы: `9d4d192b-8641-4420-b00e-09e3d935badf|fIMdnj8WixjDqyaUTHLKPlgHU9d5JiOZwJJWGiVHdcda602e`
- 22 марта 14:20 - Создано виртуальное окружение Python, установлены зависимости (requests, python-dotenv)
- 22 марта 14:21 - Обнаружено, что для sandbox нужен другой базовый URL (`https://fr24api.flightradar24.com/api`) и заголовок `Accept-Version: v1`
- 22 марта 14:22 - Успешно протестирован sandbox API:
  - Endpoint `/static/airlines/AAL/light` вернул данные American Airlines
  - Endpoint `/live/flight-positions/light` с параметром bounds вернул 2 тестовых полёта
- Sandbox возвращает статические тестовые данные, что подходит для прототипа
- Отправлено голосовое сообщение Славе о начале работы над прототипом

---

## Прототип v0.2 — Карта шумового загрязнения (22 марта 2026, вечер)

### Ключевые технические решения

**Картографическая библиотека:**
- Leaflet → отклонён (слабая производительность)
- MapLibre GL → отклонён (WebGL заблокирован в sandbox-браузере Славы: `Sandboxed = yes`)
- OpenLayers 10 (Canvas2D) → выбран ✅ работает везде без WebGL

**Геометрия шумовых зон:**
- Turf.js `buffer()` + `difference()` — реальные км на земле
- Строятся посегментно для каждого сегмента трека
- Зоны: 0–2 км, 2–5 км, 5–7 км, 7–11 км от самолёта

**Физическая модель шума (теорема Пифагора):**
- D = √(R² − H²), где R — граница зоны (сфера), H — высота, D — ширина на карте
- Чем выше самолёт — тем уже зона
- При H ≥ R зона исчезает

**Доступ к карте:**
- nginx proxy: `https://openclaw.mva154.duckdns.org/noisemap/` → Flask :5555
- location /noisemap/ → proxy_pass http://172.19.0.2:5555/

### Данные (загружено)

**Production API FR24, 4 аэропорта, 2 дня:**
- SVO 21.03: 33 рейса (вылеты + прилёты)
- DME 21.03: 15 рейсов
- VKO 21.03: 21 рейс
- ZIA 21.03: 1 рейс (WZ560 TBS→ZIA)
- SVO/DME/VKO/ZIA 20.03 +1.5ч смещение: загружены
- **Итого: 147 рейсов / 29 487 точек**

**Критически важное замечание по FR24 API:**
- bounds формат: `lat_max,lat_min,lon_min,lon_max` (НЕ lat_min,lon_min!)
- Ошибочный формат возвращал самолёты над США вместо МО
- `flight-tracks` не поддерживает фильтр по времени — весь трек ~700 точек/10сек
- Стоимость треков: ~74 кредита/запрос

### Стратегии загрузки

**Стратегия А (реализована):** снимки каждые 3ч → треки
- Охват: ~10–20%, стоимость ~3 100 кредитов/день/аэропорт
- 7 дней × 4 аэропорта ≈ 87 000 кредитов ✅

**Стратегия Б (планируется):** табло → все треки
- Охват: ~100%, стоимость ~24 500 кредитов/день/аэропорт
- Требует источник списка рейсов по дате
- Исследование источников (19:15–19:23 МСК):
  - FR24 сайт (api.flightradar24.com) — только текущие данные, исторические недоступны
  - FR24 Explorer API — нет endpoint для списка рейсов по аэропорту/дате
  - svo.aero — SPA (Angular), нет публичного JSON API
  - Яндекс.Расписания — нужен API ключ (бесплатный, требует аккаунт Яндекс)
  - OpenSky Network — нужна регистрация для исторических данных
  - **Лучший вариант: Яндекс.Расписания** — нужен ключ от Славы

### Функциональность карты (итоговая)

- Треки: градиент по высоте 🔴→🟡→🟢 (0–8500 м)
- Шумовые зоны: реальные полигоны, чекбоксы для каждой зоны
- Переключатель видимости треков (зоны остаются)
- Фильтры: аэропорт (SVO/DME/VKO/ZIA/все), тип (вылет/прилёт), высота (м), период
- Карточка рейса: тип 🛫/🛬, название города (Сочи (AER)), дата, вход/выход из МО в МСК
- Флажки: несколько, переименование (dblclick), удаление (клик), разные цвета
- Линейка: мультисегментная, Haversine, двойной клик = завершить
- Прокрутка боковой панели ✅

### Документация проекта

Создана полная документация в `tasks/flightradar24/prototype/docs/`:
- ARCHITECTURE.md — схема системы, стек, поток данных
- DATA_LOADING.md — обе стратегии с расчётом кредитов, FAQ
- NOISE_MODEL.md — физическая модель, формула, таблица зон
- FR24_API.md — endpoints, bounds gotcha, rate limits
- UI.md — слои, фильтры, флажки, линейка, nginx конфиг
- DEVLOG.md — хронология решений, технические долги

### Расход кредитов FR24 (на конец дня)
- Итого потрачено: ~16 161 из 120 000 промо (~13.5%)
- Остаток: ~103 839 кредитов

### Стратегия Б — статус (22.03.2026 вечер)
- Яндекс.Расписания ключ получен: `788c6840-5f85-4a04-bfb5-4e20c003cffc`
- Сохранён в `.env` как `YANDEX_RASP_API_KEY`, код станции SVO: `s9600213`
- Собрано табло SVO 21.03: 750 рейсов → `data/tablo_SVO_2026-03-21.json`
- После дедупликации: 66 совпадений (треки уже есть), 684 новых
- **fetch_strategy_b.py** (v1) — ПРОВАЛИЛСЯ: алгоритм искал fr24_id в снимке в момент вылета, но самолёт ещё на земле → 0 результатов
- **fetch_strategy_b_v2.py** — ИСПРАВЛЕН: ищет через +15/+30/+45 мин после вылета (или -30/-20/-10 мин до прилёта), расширенный bbox 200 км вокруг SVO
- Запуск v2 запланирован на 20:25 UTC через cron (cron job ID: 63c2c8ce) — ждём сброса rate limit
- FR24 rate limit сейчас активен из-за ~684 запросов первого запуска

### Текущие данные на карте
- 147 рейсов / 29 487 точек (стратегия А, все аэропорты, 20–21.03)
- URL: https://openclaw.mva154.duckdns.org/noisemap/
- Flask работает на порту 5555

### Следующие шаги
1. ⏳ Дождаться запуска fetch_strategy_b_v2.py в 20:25 UTC, сообщить результат
2. Фильтр по дате в UI
3. Тепловая карта накопленного шума
4. Модель шума v2 (учёт типа ВС)
