-
Notifications
You must be signed in to change notification settings - Fork 120
[FEATURE] IBP Beacon Integration #878
Description
Background
The IBP (International Beacon Project) runs 18 HF beacons on 5 bands (14.100, 18.110, 21.150, 24.930, 28.200 MHz). The schedule is fully deterministic — no API needed for the core feature:
slot = floor((utcSeconds % 180) / 10) // 0–17, changes every 10 s
14.100 → beacons[slot % 18]
18.110 → beacons[(slot - 1 + 18) % 18]
21.150 → beacons[(slot - 2 + 18) % 18]
24.930 → beacons[(slot - 3 + 18) % 18]
28.200 → beacons[(slot - 4 + 18) % 18]
Inspired by DL8MFN.
Phase 1 — Core Panel (no server required) ✅ Done
src/utils/ibp.js — pure JS schedule engine
- Beacon list: 18 callsigns, lat/lon, grid square, ITU region
getCurrentSchedule(utcDate)→{ band → { callsign, location, bearing, distanceKm } }getSecondsUntilNext(utcDate)→ countdown to next slot change- Bearing/distance calculated from user's QTH using existing
geo.js
src/hooks/useIBP.js
- Ticks every second (just for the countdown)
- Snaps schedule to every 10 s boundary
- Returns
{ schedule, secondsRemaining, slot }
src/components/IBPPanel.jsx
- Table: one row per band, columns: band / current beacon callsign+location / bearing from QTH / distance / countdown bar
- Progress bar showing position within 10-second slot
- Optionally overlay propagation quality (GOOD/FAIR/POOR) from the existing
bandConditionsdata that's already inApp.jsx - Compact mode for sidebar / full mode for main panel
Phase 2 — Map Layer Plugin ✅ Done
src/plugins/layers/useIBPLayer.js (follows existing plugin pattern)
- Static markers for all 18 beacon sites
- Currently-transmitting beacons pulse/highlight per-band colour
- Great circle arcs from user QTH to active beacons (reuse
useGreatCirclepattern) - Click popup: callsign, location, current/next transmission time, propagation score
- Layer metadata:
category: 'propagation',defaultEnabled: false
Phase 3 — RBN Cross-Reference
The Reverse Beacon Network often spots IBP beacons. The existing useRBN.js plugin already pulls RBN data.
- Filter RBN spots where
dxmatches any IBP callsign - Compare to expected schedule: beacon X should be on band Y right now → did the RBN hear it?
- Show confirmed reception indicators in the panel (green checkmark if RBN heard it in this slot)
- This effectively gives you real propagation evidence vs. predictions
Phase 4 — Listening Log (optional, needs server)
server/routes/ibp.js
POST /api/ibp/heard— user logs they heard a beacon (callsign, band, signal report, UTC)GET /api/ibp/stats— aggregated recent reports- Stored in SQLite alongside other server state
src/components/IBPListenLog.jsx (integrated into IBPPanel)
- Quick "I heard this" button per beacon row
- Local-only history (localStorage), optionally sync to server
Phase 5 — Alert / Watch
Reuse the existing useAudioAlerts hook:
- User can pin a specific beacon callsign
- Alert fires 15 seconds before that beacon's next scheduled slot
- Works across all 5 bands (alert for whichever bands propagation predicts as open)
Integration Points in the Existing Codebase
| What | Where |
|---|---|
| Hook import + panel wiring | App.jsx (follows existing pattern) |
| Add to all 3 layouts | ClassicLayout.jsx, ModernLayout.jsx, DockableLayout.jsx |
| Layer plugin registration | src/plugins/layerRegistry.js |
| i18n keys | src/lang/en.json + 16 other langs |
| Band colours | reuse src/utils/bandColors.js |
| Propagation overlay | consume existing bandConditions prop (no new data fetch) |
Metadata
Metadata
Assignees
Labels
Projects
Status