mirror of
https://github.com/mikecarper/MeshCore.git
synced 2026-09-26 21:07:56 +00:00
396 lines
18 KiB
Markdown
396 lines
18 KiB
Markdown
# <span data-role="preset-test-page-title">Default temporary radio test · 910.1 MHz · September 21–23, 2026</span>
|
||
|
||
Use this page to join the shared temporary radio test without overwriting the
|
||
node's saved primary radio settings. <span data-role="preset-test-page-summary">The
|
||
default window is <strong>Monday, September 21, 2026 at 5:00 PM through
|
||
Wednesday, September 23 at 5:00 PM Pacific time</strong> (48 hours), using
|
||
<strong>910.1 MHz, 500 kHz, SF8, CR7</strong>.</span>
|
||
|
||
The page reads the complete test definition from its URL. Change the query
|
||
parameters to reuse it for a different window, display time zone, or radio
|
||
tuple; no source edit is required.
|
||
|
||
<div class="preset-test" data-preset-test>
|
||
<div class="preset-test-error" data-role="config-error" role="alert" hidden></div>
|
||
|
||
<div data-role="content">
|
||
<section class="preset-test-hero" aria-labelledby="preset-test-title">
|
||
<p class="preset-test-eyebrow" data-role="preset-test-eyebrow">MeshCore · default 48-hour temporary preset test</p>
|
||
<div class="preset-test-hero-row">
|
||
<div>
|
||
<h2 id="preset-test-title">
|
||
<span data-field="freq-display">910.100</span> MHz /
|
||
<span data-field="bw-display">500</span> kHz /
|
||
SF<span data-field="sf">8</span> /
|
||
CR<span data-field="cr">7</span>
|
||
</h2>
|
||
<p data-role="window-summary"></p>
|
||
</div>
|
||
<span class="preset-test-status" data-role="status" data-state="before">Scheduled</span>
|
||
</div>
|
||
|
||
<div class="preset-test-clock" aria-live="polite">
|
||
<span class="preset-test-clock-label" data-role="countdown-label">Starts in</span>
|
||
<strong data-role="countdown">—</strong>
|
||
<span data-role="countdown-detail">—</span>
|
||
</div>
|
||
|
||
<dl class="preset-test-window">
|
||
<div><dt>Start</dt><dd data-role="start-zoned"></dd></div>
|
||
<div><dt>End</dt><dd data-role="end-zoned"></dd></div>
|
||
<div><dt>Display time zone</dt><dd data-role="display-zone"></dd></div>
|
||
<div><dt>Firmware epochs</dt><dd><code data-role="epoch-range"></code></dd></div>
|
||
</dl>
|
||
</section>
|
||
|
||
<section class="preset-test-warning" aria-labelledby="continuity-plan-title">
|
||
<h2 id="continuity-plan-title">Bridges and early-revert plan</h2>
|
||
<p>
|
||
The test will include bridges. If the Puget Sound area experiences a
|
||
widespread power outage or loss of cellular service, we will end the
|
||
test early. A stock node's one-minute temporary test profile then ends
|
||
on that node's own saved radio settings.
|
||
</p>
|
||
</section>
|
||
|
||
<section class="preset-test-warning" aria-labelledby="save-settings-title">
|
||
<h2 id="save-settings-title">Before changing a radio</h2>
|
||
<p>
|
||
Run <code>get radio</code> and record the saved primary tuple. Both
|
||
primary TempRadio methods return to that saved tuple; they do not store
|
||
a return tuple inside the temporary command. On a Companion, also run
|
||
<code>get radio2</code> and <code>get radio2.cross</code> so you can restore
|
||
any non-default secondary-profile setup.
|
||
</p>
|
||
</section>
|
||
|
||
<section aria-labelledby="clock-check-title">
|
||
<h2 id="clock-check-title">Check the node clock before scheduling</h2>
|
||
<p>
|
||
The Companion <code>tempradioat2</code> scheduler uses UTC Unix time.
|
||
Run <code>clock</code> on every Companion and compare it with the browser
|
||
UTC time below. It should agree to within about a minute. A wrong clock
|
||
can start late, start immediately, or cause the schedule to be rejected.
|
||
</p>
|
||
|
||
<div class="preset-test-clock-check">
|
||
<div>
|
||
<span>Browser UTC now</span>
|
||
<strong data-role="browser-utc">—</strong>
|
||
</div>
|
||
<div>
|
||
<span>Browser Unix time</span>
|
||
<strong data-role="browser-epoch">—</strong>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="preset-test-grid preset-test-grid--clock">
|
||
<article class="preset-test-card">
|
||
<h3>Remote admin session</h3>
|
||
<p>
|
||
In a MeshCore client that supplies the sender timestamp, sync and
|
||
then verify:
|
||
</p>
|
||
<pre><code>clock sync
|
||
clock</code></pre>
|
||
</article>
|
||
|
||
<article class="preset-test-card">
|
||
<h3>Local USB or browser console</h3>
|
||
<p>Copy this fresh, run it immediately, and then verify with <code>clock</code>:</p>
|
||
<pre><code data-command="set-clock">time 0
|
||
clock</code></pre>
|
||
<button type="button" data-copy-command="set-clock">Copy current clock command</button>
|
||
</article>
|
||
|
||
<article class="preset-test-card preset-test-card--wide">
|
||
<h3>If the clock is ahead and cannot move backward</h3>
|
||
<p>
|
||
If setting the correct time returns <code>ERR: clock cannot go backwards</code>,
|
||
run the command below. It resets the clock to an older fallback date and
|
||
reboots the node immediately, so it sends no reply. After the node reconnects,
|
||
copy and run the fresh local clock command above, verify with <code>clock</code>,
|
||
and then add the Companion <code>tempradioat2</code> schedule again. The
|
||
reboot clears any pending scheduled entries.
|
||
</p>
|
||
<pre><code data-command="reset-clock">clkreboot</code></pre>
|
||
<button type="button" data-copy-command="reset-clock">Copy clock reset command</button>
|
||
</article>
|
||
</div>
|
||
|
||
<p class="preset-test-note">
|
||
The Companion schedule must be queued while both its start and end are
|
||
in the future and within the firmware's roughly 24-day scheduling
|
||
horizon. Scheduled entries are held in RAM and disappear if the node
|
||
reboots.
|
||
</p>
|
||
</section>
|
||
|
||
<section aria-labelledby="join-now-title">
|
||
<h2 id="join-now-title">Option 1: switch during the setup window</h2>
|
||
<p>
|
||
The immediate commands become available one hour before the official
|
||
start. Their timeout shrinks so every node still returns at the same end
|
||
time. Before that setup window, the command text and copy controls stay
|
||
unavailable.
|
||
</p>
|
||
|
||
<div class="preset-test-grid">
|
||
<article class="preset-test-card">
|
||
<div class="preset-test-card-heading">
|
||
<h3>Stock repeater, room server, or sensor</h3>
|
||
<span>Primary radio</span>
|
||
</div>
|
||
<pre><code data-command="stock-now"></code></pre>
|
||
<button type="button" data-copy-command="stock-now">Copy command</button>
|
||
<p class="preset-test-note" data-role="stock-now-note"></p>
|
||
</article>
|
||
|
||
<article class="preset-test-card">
|
||
<div class="preset-test-card-heading">
|
||
<h3>Companion using both frequencies</h3>
|
||
<span>Dual profile</span>
|
||
</div>
|
||
<pre><code data-command="companion-now"></code></pre>
|
||
<button type="button" data-copy-command="companion-now">Copy commands</button>
|
||
<p class="preset-test-note">
|
||
<code>rxtx</code> permits transmission on the second profile;
|
||
<code>radio2.cross on</code> copies ordinary Companion traffic across
|
||
the primary and temporary profiles.
|
||
</p>
|
||
</article>
|
||
</div>
|
||
</section>
|
||
|
||
<section aria-labelledby="schedule-title">
|
||
<h2 id="schedule-title">Option 2: schedule a Companion in advance</h2>
|
||
<p>
|
||
Stock firmware has no <code>tempradioat</code> command, so a stock node
|
||
cannot be queued in advance. Return during the one-hour setup window and
|
||
use Option 1. A Companion can use the exact UTC epochs below to switch at
|
||
the common start and restore its saved configuration at the common end.
|
||
</p>
|
||
|
||
<div class="preset-test-grid">
|
||
<article class="preset-test-card">
|
||
<div class="preset-test-card-heading">
|
||
<h3>Stock repeater, room server, or sensor</h3>
|
||
<span>No advance schedule</span>
|
||
</div>
|
||
<p class="preset-test-note">
|
||
Stock firmware provides <code>tempradio</code>, but not
|
||
<code>tempradioat</code>. Use the immediate stock command in Option 1
|
||
after its setup window opens.
|
||
</p>
|
||
</article>
|
||
|
||
<article class="preset-test-card">
|
||
<div class="preset-test-card-heading">
|
||
<h3>Companion using both frequencies</h3>
|
||
<span>Dual-profile schedule</span>
|
||
</div>
|
||
<pre><code data-command="companion-scheduled"></code></pre>
|
||
<button type="button" data-copy-command="companion-scheduled">Copy schedule commands</button>
|
||
<p class="preset-test-note">
|
||
Crossing is saved independently and remains <code>on</code> after the
|
||
temporary second profile ends. Restore its previous value after the
|
||
test; <code>auto</code> is the normal default.
|
||
</p>
|
||
</article>
|
||
</div>
|
||
</section>
|
||
|
||
<section aria-labelledby="cancel-title">
|
||
<h2 id="cancel-title">Cancel or leave the test</h2>
|
||
<p>
|
||
A stock node can leave an active test as shown below. For a Companion
|
||
schedule, the <code>all</code> form removes every temporary schedule in
|
||
that family. To preserve another schedule, first run the corresponding
|
||
<code>get</code> command and replace <code>all</code> with its displayed
|
||
entry number.
|
||
</p>
|
||
|
||
<div class="preset-test-cancel-grid">
|
||
<article class="preset-test-card">
|
||
<h3>Stock · while it is running</h3>
|
||
<h4>Leave now · stock compatible</h4>
|
||
<pre><code data-command="stock-cancel-during"></code></pre>
|
||
<button type="button" data-copy-command="stock-cancel-during">Copy stock leave command</button>
|
||
<p class="preset-test-note">
|
||
Stock MeshCore has no <code>normalradio</code> command. This starts a
|
||
one-minute temporary session on this page's test profile without
|
||
saving over the node's configuration. When that minute ends, the node
|
||
restores whatever primary radio settings it had saved.
|
||
</p>
|
||
<h4>Leave in 30 minutes</h4>
|
||
<pre><code data-command="stock-leave-30"></code></pre>
|
||
<button type="button" data-copy-command="stock-leave-30">Copy 30-minute command</button>
|
||
<p class="preset-test-note">
|
||
This replaces the current temporary timeout with 30 minutes, then
|
||
restores the saved primary tuple automatically.
|
||
</p>
|
||
</article>
|
||
|
||
<article class="preset-test-card">
|
||
<h3>Companion · before it starts</h3>
|
||
<pre><code data-command="companion-cancel-before"></code></pre>
|
||
<button type="button" data-copy-command="companion-cancel-before">Copy cancel commands</button>
|
||
</article>
|
||
|
||
<article class="preset-test-card">
|
||
<h3>Companion · while it is running</h3>
|
||
<h4>Leave now</h4>
|
||
<pre><code data-command="companion-cancel-during"></code></pre>
|
||
<button type="button" data-copy-command="companion-cancel-during">Copy restore commands</button>
|
||
<p class="preset-test-note">
|
||
If <code>get radio2.cross</code> was not <code>auto</code> before the
|
||
test, restore that recorded value instead.
|
||
</p>
|
||
<h4>Leave in 30 minutes</h4>
|
||
<pre><code data-command="companion-leave-30"></code></pre>
|
||
<button type="button" data-copy-command="companion-leave-30">Copy 30-minute commands</button>
|
||
<p class="preset-test-note">
|
||
These commands clear any absolute second-profile schedule and give
|
||
the test profile a fresh 30-minute lease. The saved second profile
|
||
returns at expiry, but crossing remains <code>on</code>; afterward,
|
||
restore the value you recorded before the test (<code>auto</code> is
|
||
the normal default).
|
||
</p>
|
||
</article>
|
||
</div>
|
||
</section>
|
||
|
||
<section aria-labelledby="share-title">
|
||
<details class="preset-test-generator-disclosure">
|
||
<summary>
|
||
<h2 id="share-title">Build a link for another test</h2>
|
||
</summary>
|
||
<div class="preset-test-generator-disclosure-body">
|
||
<p>
|
||
Enter the test times in the selected time zone and choose the radio
|
||
tuple. The generated URL converts the times to exact UTC instants, keeps
|
||
the date punctuation readable, and keeps <code>tz</code> so the page
|
||
displays them in the organizer's local time zone.
|
||
</p>
|
||
|
||
<div class="preset-test-generator-layout">
|
||
<form class="preset-test-generator" data-role="url-generator">
|
||
<div class="preset-test-generator-fields">
|
||
<label>
|
||
<span>Start date and time</span>
|
||
<input type="datetime-local" name="start" step="60" required>
|
||
</label>
|
||
<label>
|
||
<span>End date and time</span>
|
||
<input type="datetime-local" name="end" step="60" required>
|
||
</label>
|
||
<div class="preset-test-timezone-picker">
|
||
<div class="preset-test-timezone-toolbar">
|
||
<div>
|
||
<span>Selected time zone</span>
|
||
<strong data-role="selected-time-zone">Detecting browser time zone…</strong>
|
||
</div>
|
||
<button type="button" data-action="use-browser-time-zone">
|
||
Use browser time zone
|
||
</button>
|
||
</div>
|
||
<input type="hidden" name="tz" required>
|
||
<div
|
||
class="preset-test-timezone-map"
|
||
data-role="timezone-map"
|
||
aria-label="Interactive world map for selecting a time zone"
|
||
></div>
|
||
<p class="preset-test-timezone-status" data-role="timezone-map-status" aria-live="polite">
|
||
Loading time zone map…
|
||
</p>
|
||
<small>
|
||
Click a region to select its IANA time zone. The initial selection
|
||
comes from <code>tz=</code> when present; otherwise it uses your
|
||
browser's time zone. Map design inspired by
|
||
<a href="https://zones.arilyn.cc/" target="_blank" rel="noopener">zones.arilyn.cc</a>;
|
||
boundaries from
|
||
<a href="https://github.com/evansiroky/timezone-boundary-builder" target="_blank" rel="noopener">Timezone Boundary Builder</a>
|
||
and © OpenStreetMap contributors.
|
||
</small>
|
||
</div>
|
||
<div class="preset-test-generator-subheading">Test radio profile</div>
|
||
<label>
|
||
<span>Frequency (MHz)</span>
|
||
<input type="number" name="freq" min="150" max="2500" step="0.001" required>
|
||
</label>
|
||
<label>
|
||
<span>Bandwidth (kHz)</span>
|
||
<select name="bw" required>
|
||
<option>7.8</option><option>10.4</option><option>15.6</option>
|
||
<option>20.8</option><option>31.25</option><option>41.7</option>
|
||
<option>62.5</option><option>125</option><option>250</option><option>500</option>
|
||
</select>
|
||
</label>
|
||
<label>
|
||
<span>Spreading factor</span>
|
||
<select name="sf" required>
|
||
<option>5</option><option>6</option><option>7</option><option>8</option>
|
||
<option>9</option><option>10</option><option>11</option><option>12</option>
|
||
</select>
|
||
</label>
|
||
<label>
|
||
<span>Coding-rate denominator</span>
|
||
<select name="cr" required>
|
||
<option>5</option><option>6</option><option>7</option><option>8</option>
|
||
</select>
|
||
</label>
|
||
<label>
|
||
<span>TX output for estimate (dBm)</span>
|
||
<input type="number" name="tx" min="-30" max="60" step="0.1" required>
|
||
<small>This estimate-only value does not change the TempRadio commands.</small>
|
||
</label>
|
||
</div>
|
||
<button type="submit">Generate test URL</button>
|
||
</form>
|
||
|
||
<aside class="preset-test-estimates" aria-labelledby="radio-estimates-title">
|
||
<h3 id="radio-estimates-title">Radio estimates</h3>
|
||
<dl>
|
||
<div><dt>Nominal LoRa bitrate</dt><dd data-role="estimate-rate">—</dd></div>
|
||
<div><dt>Estimated sensitivity</dt><dd data-role="estimate-sensitivity">—</dd></div>
|
||
<div><dt>TX output used</dt><dd data-role="estimate-tx">—</dd></div>
|
||
<div><dt>Estimated link budget</dt><dd data-role="estimate-budget">—</dd></div>
|
||
</dl>
|
||
<p class="preset-test-note">
|
||
The bitrate is the nominal LoRa physical-layer rate; usable payload
|
||
throughput is lower. Sensitivity assumes a 6 dB receiver noise figure
|
||
and the standard LoRa SNR threshold for the selected spreading factor.
|
||
Link budget is TX output minus that sensitivity, before antenna gain,
|
||
cable loss, path loss, interference, and implementation differences.
|
||
</p>
|
||
</aside>
|
||
</div>
|
||
|
||
<p class="preset-test-error preset-test-generator-error"
|
||
data-role="generator-error" role="alert" hidden></p>
|
||
<pre class="preset-test-generated-url"><code data-command="generated-url"></code></pre>
|
||
<div class="preset-test-generator-actions">
|
||
<button type="button" data-copy-command="generated-url">Copy generated URL</button>
|
||
<a data-role="open-generated-url" target="_blank" rel="noopener">Open generated page</a>
|
||
</div>
|
||
|
||
<p class="preset-test-note">
|
||
Advanced use: <code>start</code> and <code>end</code> also accept ISO-8601
|
||
timestamps with explicit UTC offsets or Unix epoch seconds. If
|
||
<code>tz</code> is omitted, the page uses the browser's time zone. The
|
||
other URL parameters are <code>freq</code>, <code>bw</code>,
|
||
<code>sf</code>, <code>cr</code>, and estimate-only <code>tx</code>.
|
||
</p>
|
||
</div>
|
||
</details>
|
||
</section>
|
||
</div>
|
||
</div>
|
||
|
||
Stock firmware does not support advance TempRadio scheduling; use its immediate
|
||
<code>tempradio</code> command during the setup window. The Companion scheduling
|
||
commands require current full-parser firmware, and
|
||
<code>tempradio2</code> and <code>tempradioat2</code> require a build with
|
||
dual-radio-profile support. If a node reports an unknown command, use only a
|
||
method that its installed firmware documents.
|