# Проект: FR24 / noisemap + RTL-SDR ingest

## 1. Назначение
Проект строит карту шумового загрязнения авиации для Московской области и развивает её в сторону локального ADS-B контура на RTL-SDR.

Сейчас проект состоит из двух связанных частей:
- **noisemap / FR24-прототип** — визуализация и расчёт шумовой плотности на базе исторических данных Flightradar24
- **RTL-SDR ingest-контур** — приём ADS-B с локального приёмника, хранение в PostgreSQL/PostGIS и восстановление данных после сбоев

## 2. Статус
- **Старт проекта:** 22 марта 2026
- **Текущий статус:** активен
- **Текущий фокус:** переход от FR24-only к локальному RTL-SDR контуру с PostgreSQL/PostGIS
- **Последнее обновление:** 25 апреля 2026

## 3. Текущая часть: noisemap / FR24-прототип
### URL
- https://openclaw.mva154.duckdns.org/noisemap/

### Расположение
- `tasks/flightradar24/prototype/`

### Стек
- Flask
- OpenLayers 10
- Turf.js
- Canvas2D
- flask-compress

### Что уже реализовано
- слой "Плотность пролётов"
- метрика рейсов/час
- радиусы влияния по высоте
- кэш плотности
- слайдер по дням
- легенда и попап по рейсам
- `/api/dates` и `/api/density`
- загрузка табло через Яндекс.Расписания

### Ограничения текущей части
- FR24 кредиты закончились
- охват данных неполный
- ночные рейсы и часть траекторий не покрываются

## 4. Новая часть: RTL-SDR ingest-контур
### Цель
Построить локальный контур приёма ADS-B с RTL-SDR, который:
- принимает поток в real time
- сохраняет сырьё с retention 3 дня
- догоняет пропуски после сбоя
- хранит данные в PostgreSQL/PostGIS
- отдаёт данные для визуализации на карте

### Архитектурные рамки
- 1 VM в PVE
- USB RTL-SDR пробрасывается в VM
- Docker Compose
- отдельные контейнеры для компонентов
- PostgreSQL + PostGIS
- сырьё и core-данные в одной БД, но логически разделены

### Согласованные ограничения VM
- CPU: до 6 vCPU
- RAM: 10–12 GB
- SSD: 80–100 GB max

### Режимы работы
- live
- recovery
- overlap recovery

### Базовые сущности хранения
- `captures`
- `raw_packets`
- `aircraft`
- `flights`
- `track_points`
- `tracks`
- `processing_state`
- `noise_results`

## 5. Данные и источники
### FR24
- исторические данные использовались для прототипа noisemap
- FR24 API ключ хранится в `~/.openclaw/.env`
- ключи и секреты не хранятся в проектных файлах

### ADS-B / RTL-SDR
- локальный источник для ingest-контура
- основной переходной источник после исчерпания FR24-only подхода

## 6. Бэклог

### ✅ Выполнено (апрель 2026)
- [x] RTL-SDR ingest контур (capture + preprocess + api + monitoring + backup)
- [x] PostgreSQL/PostGIS схема fr24
- [x] Leaflet карта с треками и фильтром периода
- [x] Мониторинг дашборд
- [x] Батчевая запись, фильтр onground, кеш скорости с TTL
- [x] Callsign из MSG1

### ✅ Фаза 2, Шаг 1: Внешние источники данных (выполнено 20.04.2026)
- [x] Контейнер `fr24-schedule` запущен
- [x] Схема `fr24_ext` (таблицы `schedule`, `load_state`)
- [x] Яндекс.Расписания API: SVO, DME, VKO, ZIA
- [x] Backfill 01.04–19.04.2026: **28 690 рейсов**
- [x] Cron T-1 в 02:00 UTC
- [x] UI табло: `http://192.168.2.67:8080/schedule`
- [x] Экспорт CSV
- [ ] OpenSky отключён (исторические данные платные)

### ✅ Фаза 2, Шаг 2: Витрина данных (выполнено 21.04.2026)
- [x] Схема `fr24_mart` (flights, track_points, noise_grid, source_coverage)
- [x] Контейнеры fr24-mart, fr24-tracks-fr24, fr24-tracks-fa
- [x] build_mart.py: мэтчинг по приоритету RTL-SDR > FR24 > FA
- [x] Шумовая сетка noise_grid (ячейки 0.01°×0.01°)
- [x] Метрики source_coverage
- [x] FR24 API: 1 трек загружен и проверен (FV6807)
- [x] FA API: 5 треков загружено (тест)
- [x] Мэтчинг RTL-SDR/FA в витрине исправлен (ICAO vs IATA фикс, 21.04.2026)
- [x] DDL fix: VARCHAR(5) → VARCHAR(20) в flight_tracks_fa (21.04.2026)
- [ ] ⚠️ Яндекс backfill 06–19.04 не завершён (rate limit)
- [ ] Bulk rebuild витрины за 02–19.04

### ✅ UI enrichment (выполнено 24.04.2026)
- [x] Таблица `fr24_ext.flight_actual` (FR24 summary/full данные)
- [x] UI расписания: 13 колонок (fr24_id, actual_takeoff, actual_landed, delay_*, flight_category, registration)
- [x] `aircraft_type` через `COALESCE(mf.aircraft_type, s.aircraft_type)` — fallback на расписание (25.04.2026)

### 🔜 Фаза 2, Шаг 3: Перенос noisemap на VM-FR24
- [ ] Адаптация прототипа под fr24_mart
- [ ] Live режим из RTL-SDR
- [ ] Фильтр по источнику данных
- [ ] ТЗ: `docs/PHASE2_STEP3_NOISEMAP_MIGRATION.md`

## 7. Документация
- **`tasks/flightradar24/docs/SYSTEM_OVERVIEW.md`** — полное актуальное описание системы (читать первым)
- `tasks/flightradar24/PROJECT.md` — статус и бэклог
- `tasks/flightradar24/docs/INDEX.md` — индекс всех документов
- `tasks/flightradar24/docs/ARCHITECTURE.md` — контейнерная архитектура (базовая)
- `tasks/flightradar24/docs/PHASE2_STEP2_DATA_MART.md` — ТЗ витрины fr24_mart
- `tasks/flightradar24/docs/VM_SETUP.md` — инструкция по VM
- `tasks/flightradar24/prototype/docs/NOISE_MODEL.md` — шумовая модель

## 8. Критерий направления
Проект считается развивающимся правильно, если:
- noisemap остаётся рабочим и полезным
- ingest-контур получает данные без дырок
- recovery умеет догонять сырьё автоматически
- БД не раздувается сверх лимитов VM
- карта продолжает получать данные для визуализации
