mirror of
https://github.com/smittix/intercept.git
synced 2026-06-11 23:43:30 -07:00
4a149525bd
Sync with upstream main and fix required items from review: - updateTimelineLabels() now uses InterceptTime API (getTimezone/getIANA) instead of the stale selectedTimezone/TZ_MAP globals that were removed during the earlier InterceptTime refactor — fixes ReferenceError on TZ change and pass refresh. - Remove profiles: [basic] from the intercept service in docker-compose.yml so bare `docker compose up -d` still starts the main service. Profile-gated services (intercept-history, adsb_db) stay as-is.
331 lines
24 KiB
HTML
331 lines
24 KiB
HTML
<!-- WEATHER SATELLITE MODE -->
|
|
<div id="weatherSatMode" class="mode-content">
|
|
<div class="section">
|
|
<h3>Weather Satellite Decoder</h3>
|
|
<div class="alpha-mode-notice">
|
|
ALPHA: Weather Satellite capture is experimental and may fail depending on SatDump version, SDR driver support, and pass conditions.
|
|
</div>
|
|
<p class="info-text" style="font-size: 11px; color: var(--text-dim); margin-bottom: 12px;">
|
|
Receive and decode Meteor LRPT weather imagery.
|
|
Uses SatDump for live SDR capture and image processing, and also shows Meteor imagery produced by the ground-station scheduler.
|
|
</p>
|
|
</div>
|
|
|
|
<!-- Getting Started Guide -->
|
|
<div class="section">
|
|
<h3>Getting Started</h3>
|
|
<div style="font-size: 11px; color: var(--text-dim); line-height: 1.6;">
|
|
|
|
<div style="background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: 4px; padding: 10px; margin-bottom: 10px;">
|
|
<strong style="color: var(--accent-cyan); font-size: 12px;">What are Meteor satellites?</strong>
|
|
<p style="margin-top: 6px;">
|
|
Russia's <strong style="color: var(--text-primary);">Meteor-M2-3</strong> and <strong style="color: var(--text-primary);">Meteor-M2-4</strong>
|
|
are polar-orbiting weather satellites that continuously transmit real-time color imagery (clouds, land, sea) at <strong style="color: var(--text-primary);">137.900 MHz</strong>
|
|
using the LRPT digital format. Unlike old analog NOAA APT, LRPT produces sharp, full-color images.
|
|
</p>
|
|
<p style="margin-top: 6px;">
|
|
They orbit ~830 km high, circling the Earth every ~100 minutes in a near-polar sun-synchronous orbit.
|
|
From any location, you'll typically get <strong style="color: var(--text-primary);">4–8 usable passes per day</strong>,
|
|
each lasting 8–15 minutes as the satellite crosses your sky.
|
|
</p>
|
|
</div>
|
|
|
|
<div style="background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: 4px; padding: 10px; margin-bottom: 10px;">
|
|
<strong style="color: var(--accent-cyan); font-size: 12px;">Step-by-step</strong>
|
|
<ol style="margin: 6px 0 0 16px; padding: 0;">
|
|
<li style="margin-bottom: 4px;"><strong style="color: var(--text-primary);">Set your location</strong> — Enter your lat/lon in the strip bar above (or click GPS). This is required for pass predictions.</li>
|
|
<li style="margin-bottom: 4px;"><strong style="color: var(--text-primary);">Check upcoming passes</strong> — The pass list shows when each satellite will be overhead. Higher max elevation = better signal. Passes above 30° are "good", above 60° are "excellent".</li>
|
|
<li style="margin-bottom: 4px;"><strong style="color: var(--text-primary);">Prepare your antenna</strong> — You need a 137 MHz antenna outdoors with clear sky (see Antenna Guide below). A $5 V-dipole works for high passes.</li>
|
|
<li style="margin-bottom: 4px;"><strong style="color: var(--text-primary);">Click Capture</strong> on a pass card when it's about to start, or enable <strong style="color: var(--text-primary);">AUTO</strong> to let the scheduler capture automatically.</li>
|
|
<li style="margin-bottom: 4px;"><strong style="color: var(--text-primary);">Wait for images</strong> — SatDump will tune, lock the signal, and decode. Decoded images appear in the gallery after the pass completes.</li>
|
|
</ol>
|
|
</div>
|
|
|
|
<div style="background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: 4px; padding: 10px; margin-bottom: 10px;">
|
|
<strong style="color: var(--accent-cyan); font-size: 12px;">When to look</strong>
|
|
<ul style="margin: 6px 0 0 14px; padding: 0;">
|
|
<li><strong style="color: var(--text-primary);">Best passes:</strong> When the satellite is high overhead (>30° elevation). The countdown timer shows the next one.</li>
|
|
<li><strong style="color: var(--text-primary);">Day vs night:</strong> Daytime passes produce visible-light imagery. Night passes still work but only produce infrared/thermal images.</li>
|
|
<li><strong style="color: var(--text-primary);">Both satellites share 137.9 MHz</strong> so they won't transmit at the same time. You'll see separate pass predictions for each.</li>
|
|
<li><strong style="color: var(--text-primary);">Pass direction:</strong> Meteor satellites travel roughly north→south or south→north. The pass cards show the exact rise/set direction.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div style="background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: 4px; padding: 10px;">
|
|
<strong style="color: var(--accent-cyan); font-size: 12px;">What you need</strong>
|
|
<table style="width: 100%; margin-top: 6px; font-size: 10px; border-collapse: collapse;">
|
|
<tr style="border-bottom: 1px solid var(--border-color);">
|
|
<td style="padding: 3px 4px; color: var(--text-dim);">SDR receiver</td>
|
|
<td style="padding: 3px 4px; color: var(--text-primary); text-align: right;">RTL-SDR V3/V4 ($25-35)</td>
|
|
</tr>
|
|
<tr style="border-bottom: 1px solid var(--border-color);">
|
|
<td style="padding: 3px 4px; color: var(--text-dim);">Antenna</td>
|
|
<td style="padding: 3px 4px; color: var(--text-primary); text-align: right;">137 MHz V-dipole ($5 DIY) or QFH ($20-30)</td>
|
|
</tr>
|
|
<tr style="border-bottom: 1px solid var(--border-color);">
|
|
<td style="padding: 3px 4px; color: var(--text-dim);">LNA (optional)</td>
|
|
<td style="padding: 3px 4px; color: var(--text-primary); text-align: right;">137 MHz filtered, at antenna ($15-25)</td>
|
|
</tr>
|
|
<tr style="border-bottom: 1px solid var(--border-color);">
|
|
<td style="padding: 3px 4px; color: var(--text-dim);">Location</td>
|
|
<td style="padding: 3px 4px; color: var(--text-primary); text-align: right;">Outdoors, clear sky view</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding: 3px 4px; color: var(--text-dim);">No hardware?</td>
|
|
<td style="padding: 3px 4px; color: var(--text-primary); text-align: right;">Use <em>Load Demo Data</em> below to explore the UI</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="section">
|
|
<h3>Satellite</h3>
|
|
<div class="form-group">
|
|
<label>Select Satellite</label>
|
|
<select id="weatherSatSelect" class="mode-select">
|
|
<option value="" selected>All Meteor Satellites</option>
|
|
<option value="METEOR-M2-3">Meteor-M2-3 (137.900 MHz LRPT)</option>
|
|
<option value="METEOR-M2-4">Meteor-M2-4 (137.900 MHz LRPT)</option>
|
|
<option value="METEOR-M2-4-80K">Meteor-M2-4 80k baud (fallback)</option>
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Gain (dB)</label>
|
|
<input type="number" id="weatherSatGain" value="30" step="0.1" min="0" max="50">
|
|
<p class="info-text" style="font-size: 10px; color: var(--text-dim); margin-top: 3px;">Reduce if decoding fails on strong passes (ADC saturation).</p>
|
|
</div>
|
|
<div class="form-group">
|
|
<label style="display: flex; align-items: center; gap: 6px;">
|
|
<input type="checkbox" id="weatherSatBiasT" style="width: auto;">
|
|
Bias-T (power LNA)
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Antenna Guide - detailed (collapsed by default) -->
|
|
<div class="section">
|
|
<h3 onclick="this.parentElement.querySelector('.wxsat-antenna-body').classList.toggle('collapsed'); this.querySelector('.wxsat-collapse-icon').classList.toggle('collapsed')" style="cursor: pointer; display: flex; align-items: center; justify-content: space-between; user-select: none;">
|
|
Antenna Guide
|
|
<span class="wxsat-collapse-icon collapsed" style="font-size: 10px; transition: transform 0.2s; display: inline-block;">▼</span>
|
|
</h3>
|
|
<div class="wxsat-antenna-body wxsat-test-decode-body collapsed" style="font-size: 11px; color: var(--text-dim); line-height: 1.5;">
|
|
|
|
<p style="margin-bottom: 10px; color: var(--accent-cyan); font-weight: 600;">
|
|
137 MHz band — your stock SDR antenna will NOT work.
|
|
</p>
|
|
<p style="margin-bottom: 10px;">
|
|
Weather satellites transmit at 137.1–137.9 MHz. The quarter-wave
|
|
at this frequency is <strong style="color: var(--text-primary);">~53 cm</strong>,
|
|
far longer than the small telescopic antenna shipped with most SDRs
|
|
(tuned for ~1 GHz). You need a purpose-built antenna.
|
|
</p>
|
|
|
|
<!-- V-Dipole -->
|
|
<div style="background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: 4px; padding: 10px; margin-bottom: 10px;">
|
|
<strong style="color: var(--accent-cyan); font-size: 12px;">V-Dipole (Easiest — ~$5)</strong>
|
|
|
|
<div style="margin: 8px 0; padding: 8px; background: var(--bg-tertiary); border-radius: 3px; font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif; font-size: 10px; color: var(--text-secondary); white-space: pre; line-height: 1.3; text-align: center;"> coax to SDR
|
|
|
|
|
===+=== feed point
|
|
/ \
|
|
/ 120 \
|
|
/ \
|
|
/ deg \
|
|
53.4cm 53.4cm</div>
|
|
|
|
<ul style="margin: 6px 0 0 14px; padding: 0;">
|
|
<li><strong style="color: var(--text-primary);">Element length:</strong> 53.4 cm each (quarter wavelength at 137 MHz)</li>
|
|
<li><strong style="color: var(--text-primary);">Angle:</strong> 120° between elements (not 180°)</li>
|
|
<li><strong style="color: var(--text-primary);">Material:</strong> Any stiff wire, coat hanger, or copper rod</li>
|
|
<li><strong style="color: var(--text-primary);">Orientation:</strong> Lay flat or tilt 30° toward expected pass direction</li>
|
|
<li><strong style="color: var(--text-primary);">Polarization:</strong> The 120° angle gives partial RHCP match to satellite signal</li>
|
|
<li><strong style="color: var(--text-primary);">Connection:</strong> Solder elements to coax center + shield, connect to SDR via SMA</li>
|
|
</ul>
|
|
<p style="margin-top: 6px; color: var(--text-dim); font-style: italic;">
|
|
Best starter antenna. Good enough for a clean Meteor LRPT pass when the satellite gets high overhead.
|
|
</p>
|
|
</div>
|
|
|
|
<!-- Turnstile -->
|
|
<div style="background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: 4px; padding: 10px; margin-bottom: 10px;">
|
|
<strong style="color: var(--accent-cyan); font-size: 12px;">Turnstile / Crossed Dipole (~$10-15)</strong>
|
|
|
|
<div style="margin: 8px 0; padding: 8px; background: var(--bg-tertiary); border-radius: 3px; font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif; font-size: 10px; color: var(--text-secondary); white-space: pre; line-height: 1.3; text-align: center;"> 53.4cm
|
|
<--------->
|
|
====+==== dipole 1
|
|
|
|
|
====+==== dipole 2
|
|
<--------->
|
|
90 deg rotated
|
|
+ reflector below</div>
|
|
|
|
<ul style="margin: 6px 0 0 14px; padding: 0;">
|
|
<li><strong style="color: var(--text-primary);">Elements:</strong> Two crossed dipoles, each 53.4 cm per side (4 elements total)</li>
|
|
<li><strong style="color: var(--text-primary);">Angle:</strong> 90° between the two dipole pairs</li>
|
|
<li><strong style="color: var(--text-primary);">Phasing:</strong> Feed dipole 2 with a 90° delay (quarter-wave coax section ~37 cm of RG-58)</li>
|
|
<li><strong style="color: var(--text-primary);">Reflector:</strong> Place ~52 cm below elements (ground plane or wire grid)</li>
|
|
<li><strong style="color: var(--text-primary);">Polarization:</strong> Circular (RHCP) — matches satellite transmission</li>
|
|
</ul>
|
|
<p style="margin-top: 6px; color: var(--text-dim); font-style: italic;">
|
|
Better than V-dipole. The reflector rejects ground noise and the RHCP phasing matches the satellite signal.
|
|
</p>
|
|
</div>
|
|
|
|
<!-- QFH -->
|
|
<div style="background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: 4px; padding: 10px; margin-bottom: 10px;">
|
|
<strong style="color: #00ff88; font-size: 12px;">QFH — Quadrifilar Helix (Best — ~$20-30)</strong>
|
|
|
|
<div style="margin: 8px 0; padding: 8px; background: var(--bg-tertiary); border-radius: 3px; font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif; font-size: 10px; color: var(--text-secondary); white-space: pre; line-height: 1.3; text-align: center;"> ___
|
|
/ \ two helix loops
|
|
| | | twisted 90 deg
|
|
| | | around a mast
|
|
\___/
|
|
|
|
|
coax</div>
|
|
|
|
<ul style="margin: 6px 0 0 14px; padding: 0;">
|
|
<li><strong style="color: var(--text-primary);">Design:</strong> Two bifilar helical loops, offset 90°</li>
|
|
<li><strong style="color: var(--text-primary);">Material:</strong> Copper pipe (10mm), copper wire, or coax outer shield</li>
|
|
<li><strong style="color: var(--text-primary);">Total height:</strong> ~46 cm (for 137 MHz)</li>
|
|
<li><strong style="color: var(--text-primary);">Loop dimensions:</strong> Use a QFH calculator for exact bending measurements</li>
|
|
<li><strong style="color: var(--text-primary);">Polarization:</strong> True RHCP omnidirectional — ideal for overhead satellite passes</li>
|
|
<li><strong style="color: var(--text-primary);">Gain pattern:</strong> Hemispherical upward coverage, rejects ground interference</li>
|
|
</ul>
|
|
<p style="margin-top: 6px; color: var(--text-dim); font-style: italic;">
|
|
Gold standard for weather satellite reception. No tracking needed — covers the whole sky.
|
|
</p>
|
|
</div>
|
|
|
|
<!-- Placement & LNA -->
|
|
<div style="background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: 4px; padding: 10px; margin-bottom: 10px;">
|
|
<strong style="color: var(--accent-cyan); font-size: 12px;">Placement & LNA</strong>
|
|
<ul style="margin: 6px 0 0 14px; padding: 0;">
|
|
<li><strong style="color: var(--text-primary);">Location:</strong> OUTDOORS with clear sky view is critical. Roof/balcony/open field.</li>
|
|
<li><strong style="color: var(--text-primary);">Height:</strong> Higher is better but not critical — clear horizon line matters more</li>
|
|
<li><strong style="color: var(--text-primary);">Antenna up:</strong> Point the antenna straight UP (zenith) for best overhead coverage</li>
|
|
<li><strong style="color: var(--text-primary);">Avoid:</strong> Metal roofs, power lines, buildings blocking the sky</li>
|
|
<li><strong style="color: var(--text-primary);">Coax length:</strong> Keep short (<10m). Signal loss at 137 MHz is ~3 dB per 10m of RG-58</li>
|
|
<li><strong style="color: var(--text-primary);">LNA:</strong> Mount at the antenna feed point, NOT at the SDR end.
|
|
Recommended: a low-noise 137 MHz filtered LNA near the antenna feed point</li>
|
|
<li><strong style="color: var(--text-primary);">Bias-T:</strong> Enable the Bias-T checkbox above if your LNA is powered via the coax from the SDR</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Quick reference -->
|
|
<div style="background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: 4px; padding: 10px;">
|
|
<strong style="color: var(--accent-cyan); font-size: 12px;">Quick Reference</strong>
|
|
<table style="width: 100%; margin-top: 6px; font-size: 10px; border-collapse: collapse;">
|
|
<tr style="border-bottom: 1px solid var(--border-color);">
|
|
<td style="padding: 3px 4px; color: var(--text-dim);">Wavelength (137 MHz)</td>
|
|
<td style="padding: 3px 4px; color: var(--text-primary); text-align: right;">218.8 cm</td>
|
|
</tr>
|
|
<tr style="border-bottom: 1px solid var(--border-color);">
|
|
<td style="padding: 3px 4px; color: var(--text-dim);">Quarter wave (element length)</td>
|
|
<td style="padding: 3px 4px; color: var(--text-primary); text-align: right;">53.4 cm</td>
|
|
</tr>
|
|
<tr style="border-bottom: 1px solid var(--border-color);">
|
|
<td style="padding: 3px 4px; color: var(--text-dim);">Best pass elevation</td>
|
|
<td style="padding: 3px 4px; color: var(--text-primary); text-align: right;">> 30°</td>
|
|
</tr>
|
|
<tr style="border-bottom: 1px solid var(--border-color);">
|
|
<td style="padding: 3px 4px; color: var(--text-dim);">Typical pass duration</td>
|
|
<td style="padding: 3px 4px; color: var(--text-primary); text-align: right;">10-15 min</td>
|
|
</tr>
|
|
<tr style="border-bottom: 1px solid var(--border-color);">
|
|
<td style="padding: 3px 4px; color: var(--text-dim);">Polarization</td>
|
|
<td style="padding: 3px 4px; color: var(--text-primary); text-align: right;">RHCP</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding: 3px 4px; color: var(--text-dim);">Meteor (LRPT) bandwidth</td>
|
|
<td style="padding: 3px 4px; color: var(--text-primary); text-align: right;">~140 kHz</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="section">
|
|
<h3 onclick="this.parentElement.querySelector('.wxsat-test-decode-body').classList.toggle('collapsed'); this.querySelector('.wxsat-collapse-icon').classList.toggle('collapsed')" style="cursor: pointer; display: flex; align-items: center; justify-content: space-between; user-select: none;">
|
|
Offline Decode (IQ File)
|
|
<span class="wxsat-collapse-icon collapsed" style="font-size: 10px; transition: transform 0.2s; display: inline-block;">▼</span>
|
|
</h3>
|
|
<div class="wxsat-test-decode-body collapsed" style="overflow: hidden;">
|
|
<p class="info-text" style="font-size: 11px; color: var(--text-dim); margin-bottom: 8px;">
|
|
Decode a pre-recorded Meteor IQ baseband file without SDR hardware.
|
|
You need an actual <code>.raw</code>, <code>.sigmf-data</code>, or <code>.wav</code> recording of a Meteor pass.
|
|
</p>
|
|
<div style="background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: 4px; padding: 8px; margin-bottom: 10px; font-size: 10px; color: var(--text-dim); line-height: 1.5;">
|
|
<strong style="color: var(--text-secondary);">Where to get a test file:</strong>
|
|
<ul style="margin: 4px 0 0 14px; padding: 0;">
|
|
<li>Record one yourself with <code>rtl_sdr -f 137900000 -s 2400000 meteor.raw</code> during a pass</li>
|
|
<li>Download samples from <a href="https://www.sigidwiki.com/wiki/Meteor-M_LRPT" target="_blank" rel="noopener" style="color: var(--accent-cyan);">SigID Wiki</a> or <a href="https://www.sondehub.org/" target="_blank" rel="noopener" style="color: var(--accent-cyan);">community forums</a></li>
|
|
<li>Place the file in <code>data/weather_sat/</code> on the server</li>
|
|
</ul>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Satellite</label>
|
|
<select id="wxsatTestSatSelect" class="mode-select">
|
|
<option value="METEOR-M2-3" selected>Meteor-M2-3 (LRPT)</option>
|
|
<option value="METEOR-M2-4">Meteor-M2-4 (LRPT)</option>
|
|
<option value="METEOR-M2-4-80K">Meteor-M2-4 80k baud</option>
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>File Path (server-side, relative to app root)</label>
|
|
<input type="text" id="wxsatTestFilePath" placeholder="data/weather_sat/my_recording.raw" style="font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif; font-size: 11px;">
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Sample Rate</label>
|
|
<select id="wxsatTestSampleRate" class="mode-select">
|
|
<option value="500000">500 kHz (IQ LRPT)</option>
|
|
<option value="1000000">1 MHz (IQ narrow)</option>
|
|
<option value="2400000" selected>2.4 MHz (INTERCEPT default)</option>
|
|
</select>
|
|
</div>
|
|
<button class="mode-btn" onclick="WeatherSat.testDecode()" style="width: 100%; margin-top: 4px;">
|
|
Decode File
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="section">
|
|
<h3>Auto-Scheduler</h3>
|
|
<p class="info-text" style="font-size: 11px; color: var(--text-dim); margin-bottom: 8px;">
|
|
Automatically capture satellite passes based on predictions.
|
|
Set your location above and toggle AUTO in the strip bar.
|
|
</p>
|
|
<div class="form-group">
|
|
<label style="display: flex; align-items: center; gap: 6px;">
|
|
<input type="checkbox" id="wxsatSidebarAutoSchedule" onchange="WeatherSat.toggleScheduler(this)" style="width: auto;">
|
|
Enable Auto-Capture
|
|
</label>
|
|
</div>
|
|
<div id="wxsatSchedulerStatus" style="font-size: 11px; color: var(--text-dim); font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif; margin-top: 4px;">
|
|
Disabled
|
|
</div>
|
|
</div>
|
|
|
|
<div class="section">
|
|
<h3>Debug / Test</h3>
|
|
<p class="info-text" style="font-size: 11px; color: var(--text-dim); margin-bottom: 8px;">
|
|
Load sample pass data and console output to test the UI without an SDR or live satellite pass.
|
|
</p>
|
|
<button class="mode-btn" onclick="WeatherSat.loadDemoData()" style="width: 100%;">
|
|
Load Demo Data
|
|
</button>
|
|
</div>
|
|
|
|
<div class="section">
|
|
<h3>Resources</h3>
|
|
<div style="display: flex; flex-direction: column; gap: 6px;">
|
|
<a href="https://github.com/SatDump/SatDump" target="_blank" rel="noopener" class="preset-btn" style="text-decoration: none; text-align: center;">
|
|
SatDump Documentation
|
|
</a>
|
|
<a href="https://www.rtl-sdr.com/rtl-sdr-tutorial-receiving-meteor-m2-weather-satellite-images/" target="_blank" rel="noopener" class="preset-btn" style="text-decoration: none; text-align: center;">
|
|
Meteor Reception Guide
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|