This commit is contained in:
mikecarper
2026-08-29 01:39:56 +00:00
parent f18fc614cd
commit 7592b36628
4 changed files with 253 additions and 74 deletions
+64
View File
@@ -372,6 +372,17 @@
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#companion-framed-cli" class="md-nav__link">
<span class="md-ellipsis">
Companion framed CLI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nrf52" class="md-nav__link">
<span class="md-ellipsis">
@@ -1414,6 +1425,17 @@
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#companion-framed-cli" class="md-nav__link">
<span class="md-ellipsis">
Companion framed CLI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nrf52" class="md-nav__link">
<span class="md-ellipsis">
@@ -1647,6 +1669,38 @@ own interface, so those build roles are not represented here.</p>
<p>Runtime state can still make an included command fail. Examples include no GPS
fix, no WiFi connection, an inactive bridge, or an nRF52 bootloader without
<code>.mota</code> apply support.</p>
<h2 id="companion-framed-cli">Companion framed CLI</h2>
<p>Companion builds are not represented by the role/profile matrices below. Their
local terminal and command <code>0x42</code> (<code>CMD_RUN_CLI_COMMAND</code>) expose these settings
over the normal binary USB, BLE, or TCP connection:</p>
<table>
<thead>
<tr>
<th>Command</th>
<th>Availability</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="../cli_commands/#view-or-change-this-nodes-rx-boosted-gain-mode-sx12xx-and-lr1110-v1141"><code>get/set radio.rxgain</code></a></td>
<td>Companion with a supported radio</td>
</tr>
<tr>
<td><a href="../cli_commands/#view-or-change-the-lora-fem-receive-path-gain-state-on-supported-boards"><code>get/set radio.fem.rxgain</code></a></td>
<td>Companion on a board with controllable LoRa FEM LNA</td>
</tr>
<tr>
<td><a href="../cli_commands/#browser-configuration-portal-esp32-repeater-and-room-server"><code>get/set wifi.powersave</code></a></td>
<td>ESP32 WiFi Companion; active transport constraints still apply</td>
</tr>
<tr>
<td><a href="../cli_commands/#view-or-change-the-independent-bluetooth-name-companion"><code>get/set bluetooth.name</code></a></td>
<td>Companion firmware</td>
</tr>
</tbody>
</table>
<p>Deprecated binary aliases remain receive-only for older clients; new clients
should use command <code>0x42</code>. See <a href="../companion_protocol/">Companion radio binary protocol</a>.</p>
<h2 id="nrf52">nRF52</h2>
<table>
<thead>
@@ -3058,6 +3112,16 @@ fix, no WiFi connection, an inactive bridge, or an nRF52 bootloader without
<td>Serial</td>
</tr>
<tr>
<td>Display</td>
<td><a href="../cli_commands/#set-mqtt-observer-display-timeout-and-flip"><code>get/set display.timeout</code>; <code>get/set display.flip</code></a></td>
<td>MQTT observer with display; flip needs a supported driver</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>Feature</td>
<td>No</td>
</tr>
<tr>
<td>Information</td>
<td><a href="../cli_commands/#get-the-version"><code>ver</code></a></td>
<td>All text CLI roles</td>
+89 -4
View File
@@ -729,6 +729,17 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#set-mqtt-observer-display-timeout-and-flip" class="md-nav__link">
<span class="md-ellipsis">
Set MQTT observer display timeout and flip
</span>
</a>
</li>
<li class="md-nav__item">
@@ -1002,6 +1013,17 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#view-or-change-the-independent-bluetooth-name-companion" class="md-nav__link">
<span class="md-ellipsis">
View or change the independent Bluetooth name (Companion)
</span>
</a>
</li>
<li class="md-nav__item">
@@ -3496,6 +3518,17 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#set-mqtt-observer-display-timeout-and-flip" class="md-nav__link">
<span class="md-ellipsis">
Set MQTT observer display timeout and flip
</span>
</a>
</li>
<li class="md-nav__item">
@@ -3769,6 +3802,17 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#view-or-change-the-independent-bluetooth-name-companion" class="md-nav__link">
<span class="md-ellipsis">
View or change the independent Bluetooth name (Companion)
</span>
</a>
</li>
<li class="md-nav__item">
@@ -5332,10 +5376,11 @@ WiFi card. Every ESP32 WiFi Companion with WebConfig exposes the standalone
families through its USB text terminal. Full Companion exposes the same
role-specific terminal on TCP port 5002. Credential writes reply before
restarting the WiFi station, so a TCP client should expect to reconnect at the
new address; USB password input is masked. Binary
Companion clients can use command bytes
<code>0x7C</code> and <code>0x7D</code> over USB, BLE, or TCP port 5000 without the terminal-start
token. WiFi-only Companions accept all three modes. Full Companion rejects
new address; USB password input is masked. Binary Companion clients can use
USB, BLE, or TCP port 5000 without the terminal-start token: send command
<code>0x42</code> (<code>CMD_RUN_CLI_COMMAND</code>) followed by the same CLI text, such as
<code>get wifi.powersave</code> or <code>set wifi.powersave min</code>. WiFi-only Companions accept
all three modes. Full Companion rejects
<code>none</code> because its simultaneous BLE transport requires modem sleep. Companion
device <code>powersaving</code> and LoRa <code>radio.rxps</code> remain independent. On an ESP32 Full
Companion whose primary mesh radio is ESP-NOW, <code>max</code> is also unavailable: a
@@ -5779,6 +5824,31 @@ set display.rotation 270
<p>The values are clockwise degrees. <code>0</code> clears the override and restores the
board's compiled default. Unsupported display drivers return an error.</p>
<hr />
<h2 id="set-mqtt-observer-display-timeout-and-flip">Set MQTT observer display timeout and flip</h2>
<p>MQTT observer builds with a display support a persisted inactivity timeout:</p>
<pre><code class="language-text">get display.timeout
set display.timeout 0
set display.timeout 60
</code></pre>
<p>The value is seconds. <code>0</code> keeps the display on; <code>1</code> through <code>3600</code> blanks it
after that much inactivity. The default is <code>60</code>. A change applies immediately
and restarts the countdown. On the Heltec V4 R8 Expansion Kit V2 observer, a
panel tap or USER-button click can also blank or wake the display.</p>
<p>Supported observer displays, including the R8 OLED and ST7789 panels, can also
be turned 180 degrees relative to their compiled orientation:</p>
<pre><code class="language-text">get display.flip
set display.flip off
set display.flip on
</code></pre>
<p><code>0</code> and <code>1</code> are accepted aliases for <code>off</code> and <code>on</code>. This is intentionally
different from Full Companion <code>display.rotation</code>: observer <code>display.flip</code> is a
relative 180-degree mounting choice and cannot switch between portrait and
landscape. The value is harmless on an observer display driver that does not
support flipping.</p>
<p>Both settings survive reboot and firmware updates that preserve the filesystem;
erasing flash restores the <code>60</code>/<code>off</code> defaults. The boot log reports the saved
flip state on display-enabled observer builds.</p>
<hr />
<h2 id="logging">Logging</h2>
<p>Builds compiled with <code>MESH_PACKET_LOGGING</code> emit one <code>RAW:</code> line for every
received radio frame. Serial output uses backpressure: if a connected host
@@ -6153,6 +6223,21 @@ Station G2/G3 targets default to <code>off</code>.</p>
<p><strong>Default:</strong> Varies by board</p>
<p><strong>Note:</strong> Advertised names can use up to 23 bytes when location is included and 31 bytes otherwise. Emoji and Unicode characters may take more than one byte. Names that exceed the available advert space are truncated at a valid UTF-8 code point boundary.</p>
<hr />
<h4 id="view-or-change-the-independent-bluetooth-name-companion">View or change the independent Bluetooth name (Companion)</h4>
<p><strong>Usage:</strong></p>
<ul>
<li><code>get bluetooth.name</code></li>
<li><code>set bluetooth.name &lt;name|default&gt;</code></li>
</ul>
<p><code>get ble.name</code> and <code>set ble.name ...</code> are accepted aliases. This command is
specific to Companion firmware. The default is <code>MeshCore-&lt;advert name&gt;</code>;
<code>default</code> (or <code>clear</code>) removes a custom override. Names are limited to 31 valid
UTF-8 bytes without control characters and take effect after reboot.</p>
<p>A binary Companion client should carry the same text in command <code>0x42</code>
(<code>CMD_RUN_CLI_COMMAND</code>), which works over USB, BLE, or TCP without entering USB
terminal mode. See <a href="../companion_protocol/">Companion radio binary protocol</a> for
the frame and reply format.</p>
<hr />
<h4 id="view-or-change-this-nodes-latitude">View or change this node's latitude</h4>
<p><strong>Usage:</strong>
- <code>get lat</code>
+99 -69
View File
@@ -2878,24 +2878,9 @@ catalog; bytes <code>0x2C</code>-<code>0x31</code> are parked and <code>0x35</co
<td>Query, start, or stop an nRF52 Full Companion's Bluetooth-backed LoRa mOTA source.</td>
</tr>
<tr>
<td><code>0x78</code> / <code>0x79</code></td>
<td><code>CMD_GET_RADIO_FEM_RXGAIN</code> / <code>CMD_SET_RADIO_FEM_RXGAIN</code></td>
<td>Fork extension: read or set FEM receive gain.</td>
</tr>
<tr>
<td><code>0x7A</code> / <code>0x7B</code></td>
<td><code>CMD_GET_RADIO_RXGAIN</code> / <code>CMD_SET_RADIO_RXGAIN</code></td>
<td>Fork extension: read or set the radio chip's boosted receive-gain mode.</td>
</tr>
<tr>
<td><code>0x7C</code> / <code>0x7D</code></td>
<td><code>CMD_GET_WIFI_POWER_SAVE</code> / <code>CMD_SET_WIFI_POWER_SAVE</code></td>
<td>Fork extension: read or set ESP32 Companion WiFi modem sleep.</td>
</tr>
<tr>
<td><code>0x7E</code> / <code>0x7F</code></td>
<td><code>CMD_GET_BLUETOOTH_NAME</code> / <code>CMD_SET_BLUETOOTH_NAME</code></td>
<td>Fork extension: read or set the independent Bluetooth device name.</td>
<td><code>0x78</code>-<code>0x7F</code></td>
<td>Deprecated hardware-setting aliases</td>
<td>Receive-only compatibility for clients shipped before command <code>0x42</code> became the canonical settings path.</td>
</tr>
</tbody>
</table>
@@ -2906,37 +2891,95 @@ NUL. The device returns <code>RESP_CODE_CLI_REPLY</code> (<code>0x1D</code>) fol
text. This is separate from sending a remote on-air CLI command with
<code>CMD_SEND_TXT_MSG</code> and <code>TXT_TYPE_CLI_COMMAND</code>. The body must contain at least
one byte and must not contain an embedded NUL. An unknown command is returned
as the normal CLI reply text <code>Unknown command</code>, not as an error frame.</p>
<p>The fork-specific hardware-setting commands occupy the host-to-device range
<code>0x78</code>-<code>0x7F</code>, the highest currently unused block below the push-frame bit.
Command IDs must stay below <code>0x80</code>; IDs with bit 7 set identify asynchronous
device-to-host push frames. These commands do not change any existing frame
layout. Clients should probe the command they need and treat
<code>ERR_CODE_UNSUPPORTED_CMD</code> as feature absence.</p>
as the normal CLI reply text <code>Unknown command</code>, not as an error frame. Clients
may prefix the CLI text with any two-character correlation tag and <code>|</code> (for
example, <code>A7|get radio.rxgain</code>); the reply preserves that prefix.</p>
<p>Firmware from this fork predating the upstream <code>0x42</code> allocation used
<code>0x42</code>-<code>0x49</code> for these eight settings. This firmware accepts those values as
deprecated aliases so existing clients continue to work. A one-byte <code>0x42</code>
frame is the legacy FEM-gain GET; <code>0x42</code> followed by text is the official
<code>CMD_RUN_CLI_COMMAND</code>. New clients should use <code>0x78</code>-<code>0x7F</code> (or send the
equivalent text through <code>0x42</code>) because future upstream commands may reuse the
remaining legacy IDs.</p>
<p>Both gain-command pairs can be used over the normal binary Companion
connection; USB does not need to enter terminal mode. Inside the transport's
normal Companion frame, send a GET command as its single command byte. Send a
SET command followed by one byte (<code>0</code> for off, <code>1</code> for on). A GET reply is
<code>RESP_CODE_OK</code> followed by the saved state; a successful SET reply is
<code>RESP_CODE_OK</code>. Invalid states return <code>ERR_CODE_ILLEGAL_ARG</code>. A temporarily
busy radio returns <code>ERR_CODE_BAD_STATE</code>; unsupported boosted gain returns
<code>ERR_CODE_UNSUPPORTED_CMD</code>. The FEM pair also returns
<code>ERR_CODE_UNSUPPORTED_CMD</code> when the board cannot control its external LNA. Raw
unframed text such as <code>set radio.rxgain off</code> still requires the USB terminal
start token; the same text may instead be carried as a framed <code>0x42</code> command
over USB, BLE, or TCP.</p>
<p>The WiFi power-save pair is available on ESP32 WiFi Companion builds over the
normal binary USB, BLE, or TCP port 5000 transport. <code>CMD_GET_WIFI_POWER_SAVE</code>
has no body and replies with <code>RESP_CODE_OK</code> followed by the effective mode byte.
<code>CMD_SET_WIFI_POWER_SAVE</code> is followed by that mode byte and replies with
<code>RESP_CODE_OK</code> after saving it:</p>
deprecated inbound aliases so existing clients continue to work. A one-byte
<code>0x42</code> frame is the legacy FEM-gain GET; <code>0x42</code> followed by text is the official
<code>CMD_RUN_CLI_COMMAND</code>. New clients should use <code>CMD_RUN_CLI_COMMAND</code> for all of
these settings, rather than allocating additional command bytes. For example,
send <code>0x42</code> followed by <code>get radio.rxgain</code> or <code>set radio.rxgain on</code>. The reply is
<code>RESP_CODE_CLI_REPLY</code> followed by the normal CLI reply text.</p>
<p>Two deprecated binary alias blocks remain receive-only for compatibility:</p>
<table>
<thead>
<tr>
<th>Setting</th>
<th style="text-align: right;">Original alias</th>
<th style="text-align: right;">Later fork alias</th>
<th>GET body/reply</th>
<th>SET body/reply</th>
</tr>
</thead>
<tbody>
<tr>
<td>FEM receive gain</td>
<td style="text-align: right;"><code>0x42</code> / <code>0x43</code></td>
<td style="text-align: right;"><code>0x78</code> / <code>0x79</code></td>
<td>No body; <code>OK, state</code></td>
<td>One byte <code>0</code>/<code>1</code>; <code>OK</code></td>
</tr>
<tr>
<td>Radio receive gain</td>
<td style="text-align: right;"><code>0x44</code> / <code>0x45</code></td>
<td style="text-align: right;"><code>0x7A</code> / <code>0x7B</code></td>
<td>No body; <code>OK, state</code></td>
<td>One byte <code>0</code>/<code>1</code>; <code>OK</code></td>
</tr>
<tr>
<td>WiFi power save</td>
<td style="text-align: right;"><code>0x46</code> / <code>0x47</code></td>
<td style="text-align: right;"><code>0x7C</code> / <code>0x7D</code></td>
<td>No body; <code>OK, mode</code></td>
<td>One mode byte <code>0</code>-<code>2</code>; <code>OK</code></td>
</tr>
<tr>
<td>Bluetooth name</td>
<td style="text-align: right;"><code>0x48</code> / <code>0x49</code></td>
<td style="text-align: right;"><code>0x7E</code> / <code>0x7F</code></td>
<td>No body; <code>OK, custom, name</code></td>
<td>Zero to 31 UTF-8 bytes; <code>OK</code></td>
</tr>
</tbody>
</table>
<p>Each pair lists GET then SET. Here <code>OK</code> is <code>RESP_CODE_OK</code>; the remaining reply
bytes have the same meanings as the CLI settings below. A bare <code>0x42</code> is the
old FEM GET, while <code>0x42</code> plus at least one text byte is
<code>CMD_RUN_CLI_COMMAND</code>. New clients must use the framed CLI form; these aliases
exist only so deployed clients do not break after a firmware update.</p>
<p>The equivalent framed CLI commands are:</p>
<table>
<thead>
<tr>
<th>Setting</th>
<th>Commands</th>
</tr>
</thead>
<tbody>
<tr>
<td>Radio receive gain</td>
<td><code>get radio.rxgain</code>; <code>set radio.rxgain on|off</code></td>
</tr>
<tr>
<td>FEM receive gain</td>
<td><code>get radio.fem.rxgain</code>; <code>set radio.fem.rxgain on|off</code></td>
</tr>
<tr>
<td>WiFi power save</td>
<td><code>get wifi.powersave</code>; <code>set wifi.powersave none|min|max</code></td>
</tr>
<tr>
<td>Bluetooth name</td>
<td><code>get bluetooth.name</code>; <code>set bluetooth.name &lt;name|default&gt;</code></td>
</tr>
</tbody>
</table>
<p>The framed form works over the normal binary USB, BLE, or TCP transport and
does not need the USB terminal-start token. Unsupported settings return the
same explanatory text as the local CLI.</p>
<p>WiFi power-save modes are:</p>
<table>
<thead>
<tr>
@@ -2959,28 +3002,15 @@ has no body and replies with <code>RESP_CODE_OK</code> followed by the effective
</tr>
</tbody>
</table>
<p>An out-of-range value returns <code>ERR_CODE_ILLEGAL_ARG</code>. A non-WiFi Companion
returns <code>ERR_CODE_UNSUPPORTED_CMD</code>. Full Companion has Bluetooth enabled and
therefore returns <code>ERR_CODE_BAD_STATE</code> for <code>none</code>, because ESP32 WiFi/Bluetooth
coexistence requires modem sleep. On an ESP32 Full Companion whose primary mesh
radio is ESP-NOW, SET also returns <code>ERR_CODE_BAD_STATE</code> for <code>max</code> (value <code>2</code>): maximum
modem sleep can make the station miss ESP-NOW broadcasts, which the access point
cannot buffer. If an older image already saved <code>max</code>, GET reports <code>min</code> (value
<code>0</code>) and the running policy uses <code>min</code>. A storage failure also returns
<code>ERR_CODE_BAD_STATE</code>. If an otherwise permitted saved mode cannot be applied to
the active WiFi driver, SET still returns <code>RESP_CODE_OK</code> and the mode is applied
on the next connection. Device <code>powersaving</code> does not overwrite this setting.</p>
<p>The Bluetooth-name pair is available on Companion builds regardless of the
currently selected transport, so a host can configure a BLE-capable image over
USB or TCP before rebooting into it. <code>CMD_GET_BLUETOOTH_NAME</code> has no body and
replies with <code>RESP_CODE_OK</code>, a one-byte mode (<code>0</code> for the default name, <code>1</code> for
a custom name), then the effective UTF-8 device name without a terminator.
<code>CMD_SET_BLUETOOTH_NAME</code> is followed by zero to 31 UTF-8 bytes. A non-empty
body stores that exact complete Bluetooth name; a zero-length body clears the
override and restores <code>MeshCore-&lt;advert name&gt;</code>. A successful SET replies with
<code>RESP_CODE_OK</code>, and the new label takes effect after reboot. Embedded NULs,
control characters, malformed UTF-8, or oversized values return
<code>ERR_CODE_ILLEGAL_ARG</code>; a storage failure returns <code>ERR_CODE_BAD_STATE</code>.</p>
<p>Full Companion rejects WiFi mode <code>none</code> because simultaneous BLE transport
requires modem sleep. A Full Companion using ESP-NOW as its primary mesh radio
also rejects <code>max</code>, because maximum modem sleep can miss broadcasts that the
access point cannot buffer. If an older image saved <code>max</code>, the effective mode
is capped to and reported as <code>min</code>. Device <code>powersaving</code> remains independent.</p>
<p>The Bluetooth name can be configured over USB, BLE, or TCP. Use
<code>set bluetooth.name default</code> to restore <code>MeshCore-&lt;advert name&gt;</code>; an empty CLI
value is rejected. (<code>clear</code> is also accepted as an alias for <code>default</code>.) A
custom name is limited to 31 valid UTF-8 bytes and takes effect after reboot.</p>
<h3 id="bluetooth-lora-mota-source">Bluetooth LoRa mOTA source</h3>
<p>Protocol v14 lets a phone use an nRF52 Full Companion as the source for a
remote repeater update without a USB computer. The normal Companion service
File diff suppressed because one or more lines are too long