Files
HaloKeymind/terminal_chat_cli/index.html
T
2026-08-26 03:51:43 +00:00

1709 lines
39 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Documentation for the open source MeshCore firmware">
<link rel="canonical" href="https://mikecarper.github.io/MeshCore/terminal_chat_cli/">
<link rel="prev" href="../telemetry_decoder/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
<title>Terminal Chat CLI - MeshCore Docs</title>
<link rel="stylesheet" href="../assets/stylesheets/main.ec1eaa64.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#terminal-chat-cli" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="MeshCore Docs" class="md-header__button md-logo" aria-label="MeshCore Docs" data-md-component="logo">
<img src="../_assets/meshcore.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
MeshCore Docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Terminal Chat CLI
</span>
</div>
</div>
</div>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/mikecarper/MeshCore/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
mikecarper/MeshCore
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="MeshCore Docs" class="md-nav__button md-logo" aria-label="MeshCore Docs" data-md-component="logo">
<img src="../_assets/meshcore.svg" alt="logo">
</a>
MeshCore Docs
</label>
<div class="md-nav__source">
<a href="https://github.com/mikecarper/MeshCore/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
mikecarper/MeshCore
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../WiFi/" class="md-nav__link">
<span class="md-ellipsis">
WiFi and MQTT by Firmware Type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli_build_matrix/" class="md-nav__link">
<span class="md-ellipsis">
CLI Availability by Firmware Build
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli_command_availability/" class="md-nav__link">
<span class="md-ellipsis">
CLI Command Availability Matrix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli_commands/" class="md-nav__link">
<span class="md-ellipsis">
CLI Commands
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_offline_queue/" class="md-nav__link">
<span class="md-ellipsis">
Companion Offline Message Queue
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Companion Protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_radio_full/" class="md-nav__link">
<span class="md-ellipsis">
Full Companion
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../docs/" class="md-nav__link">
<span class="md-ellipsis">
Local Documentation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../faq/" class="md-nav__link">
<span class="md-ellipsis">
Frequently Asked Questions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../filter_tool/" class="md-nav__link">
<span class="md-ellipsis">
Filter policy playground
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
<span class="md-ellipsis">
Flood Filtering and Moderation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../gps_tracking/" class="md-nav__link">
<span class="md-ellipsis">
GPS Tracking
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../halo_keymind_settings/" class="md-nav__link">
<span class="md-ellipsis">
Halo and Keymind Branch Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../host_cli_service/" class="md-nav__link">
<span class="md-ellipsis">
LoRa CLI Host Service
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../kiss_modem_protocol/" class="md-nav__link">
<span class="md-ellipsis">
MeshCore KISS Modem Protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../lora_ota_automation/" class="md-nav__link">
<span class="md-ellipsis">
Scripted LoRa OTA from start to finish
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mbedtls-tls-footprint/" class="md-nav__link">
<span class="md-ellipsis">
Shrinking the per-connection TLS footprint on non-PSRAM observers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nrf52_power_management/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 Power Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../number_allocations/" class="md-nav__link">
<span class="md-ellipsis">
Number Allocations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_easy/" class="md-nav__link">
<span class="md-ellipsis">
Easy firmware updates over LoRa
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_meshtower_v2_sdcard/" class="md-nav__link">
<span class="md-ellipsis">
MeshTower V2 microSD LoRa OTA
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_nrf52_bootloader_update/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 bootloader updates over LoRa
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_nrf52_qspi/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 repeater LoRa OTA with external QSPI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_protocol/" class="md-nav__link">
<span class="md-ellipsis">
MeshCore OTA - .mota container &amp; LoRa protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_user_guide/" class="md-nav__link">
<span class="md-ellipsis">
Updating your node over the air (OTA) - user guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../packet_format/" class="md-nav__link">
<span class="md-ellipsis">
Packet Format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../payloads/" class="md-nav__link">
<span class="md-ellipsis">
Payload Format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../qr_codes/" class="md-nav__link">
<span class="md-ellipsis">
QR Codes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../rak3401_mota_chain/" class="md-nav__link">
<span class="md-ellipsis">
RAK3401 1W repeater compact LoRa update chain
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../stats_binary_frames/" class="md-nav__link">
<span class="md-ellipsis">
Stats Binary Frame Structures
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../telemetry_decoder/" class="md-nav__link">
<span class="md-ellipsis">
Telemetry decoder
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Terminal Chat CLI
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Terminal Chat CLI
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#companion-usb-mode" class="md-nav__link">
<span class="md-ellipsis">
Companion USB mode
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#commands" class="md-nav__link">
<span class="md-ellipsis">
Commands
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#companion-usb-mode" class="md-nav__link">
<span class="md-ellipsis">
Companion USB mode
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#commands" class="md-nav__link">
<span class="md-ellipsis">
Commands
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/mikecarper/MeshCore/edit/keymindCascade/docs/terminal_chat_cli.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
</a>
<h1 id="terminal-chat-cli">Terminal Chat CLI</h1>
<p>Below are the commands you can enter into the Terminal Chat clients:</p>
<h2 id="companion-usb-mode">Companion USB mode</h2>
<p>A Companion USB build starts in the normal binary Companion protocol at
115200 baud. Use this command to switch the same USB connection into terminal
mode as soon as <code>picocom</code> opens it:</p>
<pre><code class="language-sh">picocom --baud 115200 \
--imap spchex \
--initstring '+++MESHCORE-TERM-START' \
/dev/ttyACM0
</code></pre>
<p><code>--initstring</code> sends this exact terminal-start sequence automatically:</p>
<pre><code>+++MESHCORE-TERM-START
</code></pre>
<p>Binary Companion frames can contain terminal control bytes. The <code>spchex</code> input
map renders those bytes as bracketed hexadecimal during the short transition
instead of allowing them to change the local terminal's character set or
display state. It leaves high-bit bytes unchanged so a UTF-8 terminal displays
emoji and non-ASCII text normally. Do not add <code>8bithex</code> unless you explicitly
want UTF-8 bytes displayed as sequences such as <code>[f0][9f][91][8b]</code>. Once the
terminal banner appears, the start sequence has already succeeded; do not
enter it again as a terminal command.</p>
<p>Send the following exact sequence to return to the binary protocol:</p>
<pre><code>+++MESHCORE-TERM-STOP
</code></pre>
<p>Closing the serial connection also returns native-USB devices to binary mode.
Boards whose USB connector is implemented by a USB-to-UART bridge cannot
observe the host closing the port; on those boards, use the stop sequence or
reboot the device.</p>
<p>Both modes use the same port at 115200. Selecting 57600 is not a portable mode
switch: native USB CDC devices ignore the requested baud, while USB-to-UART
devices really change the UART timing and receive corrupt data. Binary mode is
the framed Companion API used by apps and <code>meshcli</code>; close the terminal before
opening that port from an app.</p>
<h2 id="commands">Commands</h2>
<pre><code>set freq {frequency}
</code></pre>
<p>Set the LoRa frequency. Example: set freq 915.8</p>
<pre><code>set tx {tx-power-dbm}
</code></pre>
<p>Sets LoRa-chip transmit power in dBm. The firmware rejects values outside the
radio/board limit; external-PA boards can have a lower input-power ceiling than
the radio chip itself.</p>
<pre><code>set name {name}
</code></pre>
<p>Sets your advertisement name.</p>
<pre><code>get bluetooth.name
set bluetooth.name {name|default}
</code></pre>
<p>Shows or changes the complete Bluetooth device name without changing the mesh
advertisement identity. A custom name may contain spaces and is limited to 31
valid UTF-8 bytes. <code>default</code> restores <code>MeshCore-&lt;node name&gt;</code>. The saved change
takes effect after reboot. <code>get ble.name</code> and <code>set ble.name</code> are short aliases.</p>
<pre><code>set lat {latitude}
</code></pre>
<p>Sets your advertisement map latitude. (decimal degrees)</p>
<pre><code>set lon {longitude}
</code></pre>
<p>Sets your advertisement map longitude. (decimal degrees)</p>
<pre><code>set dutycycle {percent}
</code></pre>
<p>Sets the transmit duty cycle limit (1-100%). Example: <code>set dutycycle 10</code> for 10%.</p>
<pre><code>set af {air-time-factor}
</code></pre>
<p>Sets the transmit air-time-factor. Deprecated - use <code>set dutycycle</code> instead.</p>
<pre><code>powersaving
powersaving {on|off}
set powersaving {on|off}
</code></pre>
<p>Shows or changes Companion device power saving. On ESP32 this controls CPU and
GPS idle behavior; it does not change LoRa RXPS or WiFi modem sleep.</p>
<pre><code>get usb.logging
set usb.logging {on|off} [reboot]
</code></pre>
<p>Shows or changes live USB debug and packet output in a Companion logging
artifact. The setting is persistent. Dual-CDC Full Companion defaults off;
changing its USB interface count requires a reboot, and the optional exact
<code>reboot</code> argument performs that reboot after sending the reply. Companion
protocol frames and terminal replies remain enabled on interface <code>00</code>.</p>
<pre><code>get radio.rxps
get radio.rxps.config
set radio.rxps {off|on|level 1-10 [preamble 16|32]|rx_us sleep_us}
</code></pre>
<p>Shows or changes LoRa receive duty cycling on supported radios.
<code>get radio.rxps.config</code> also reports the saved level and preamble assumption so
automation can restore a level-based preference exactly. Fresh Cascade
builds select level 8 with a 16-symbol timing assumption. The <code>preamble</code>
argument controls the RXPS calculation; it does not change the physical wire
preamble. A configured level is the minimum: when faster SF/BW settings shorten
the timing window, firmware raises the effective level only as far as needed,
up to level 10. Starting with v1.17.1.5, SF5-SF8 packets normally use a
32-symbol physical preamble. Firmware selects 64, then 128, only when every
shorter choice fails to enable RXPS at any level. The configured values remain
unchanged, so every radio change recalculates from the saved minimum. A slower
tuple returns to that exact level and the shortest viable wire preamble.</p>
<p>If neither adjustment leaves enough time for the radio to wake, RXPS stays
logically enabled but receives continuously instead of rejecting the radio
setting or starting an invalid duty cycle. The Companion terminal's
<code>get radio.rxps</code> reports this as <code>mode=continuous-fast</code> and reports any
<code>effective-level</code> or <code>effective-preamble</code> adjustment;
<code>get radio.rxps.config</code> reports the persisted preference. A later compatible
SF/BW change resumes duty cycling without another RXPS command.</p>
<p>For the SX1262+TCXO boards tested here, these fast combinations are the useful
RXPS boundary profiles (CR does not change the RXPS preamble timing):</p>
<table>
<thead>
<tr>
<th style="text-align: right;">SF</th>
<th style="text-align: right;">BW (kHz)</th>
<th style="text-align: right;">Wire preamble</th>
<th style="text-align: right;">Effective preamble</th>
<th style="text-align: right;">Minimum effective level</th>
<th style="text-align: right;">RX / sleep</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: right;">7</td>
<td style="text-align: right;">500</td>
<td style="text-align: right;">32</td>
<td style="text-align: right;">32</td>
<td style="text-align: right;">7</td>
<td style="text-align: right;">2731 / 6101 us</td>
</tr>
<tr>
<td style="text-align: right;">6</td>
<td style="text-align: right;">250</td>
<td style="text-align: right;">32</td>
<td style="text-align: right;">32</td>
<td style="text-align: right;">7</td>
<td style="text-align: right;">2731 / 6101 us</td>
</tr>
<tr>
<td style="text-align: right;">5</td>
<td style="text-align: right;">125</td>
<td style="text-align: right;">32</td>
<td style="text-align: right;">32</td>
<td style="text-align: right;">7</td>
<td style="text-align: right;">2731 / 6101 us</td>
</tr>
<tr>
<td style="text-align: right;">5</td>
<td style="text-align: right;">250</td>
<td style="text-align: right;">64</td>
<td style="text-align: right;">64</td>
<td style="text-align: right;">8</td>
<td style="text-align: right;">1252 / 6424 us</td>
</tr>
<tr>
<td style="text-align: right;">6</td>
<td style="text-align: right;">500</td>
<td style="text-align: right;">64</td>
<td style="text-align: right;">64</td>
<td style="text-align: right;">8</td>
<td style="text-align: right;">1252 / 6424 us</td>
</tr>
<tr>
<td style="text-align: right;">5</td>
<td style="text-align: right;">500</td>
<td style="text-align: right;">128</td>
<td style="text-align: right;">128</td>
<td style="text-align: right;">8</td>
<td style="text-align: right;">626 / 6398 us</td>
</tr>
<tr>
<td style="text-align: right;">5</td>
<td style="text-align: right;">62.5</td>
<td style="text-align: right;">32</td>
<td style="text-align: right;">16</td>
<td style="text-align: right;">10</td>
<td style="text-align: right;">4096 / 6272 us</td>
</tr>
</tbody>
</table>
<p>The 64- and 128-symbol rows require the v1.17.1.5-or-newer adaptive-preamble
contract on every sender that may reach the RXPS receiver. Cascade/USA builds
on a Heltec V4 and WisMesh Tag (RAK4631 target) passed 16/16 packets in each
direction at both SF5/BW250/64 and SF5/BW500/128, CR5, 909.950 MHz. An older
sender makes a long-preamble timing window unsafe, so use continuous RX for a
mixed deployment. Retry packets use the same physical preamble as other
packets.</p>
<pre><code>get wifi.powersave
set wifi.powersave {none|min|max}
</code></pre>
<p>Shows or changes the persisted WiFi modem-sleep policy on ESP32 WiFi Companion
builds. Full Companion requires at least <code>min</code> while BLE is present and rejects
<code>none</code>. The WebConfig WiFi card and the normal binary Companion protocol expose
the same setting; binary clients do not need the terminal-start token.</p>
<pre><code>get radio.rxgain
set radio.rxgain {on|off}
get radio.fem.rxgain
set radio.fem.rxgain {on|off}
get radio.fem.txgain
set radio.fem.txgain {on|off}
</code></pre>
<p><code>radio.rxgain</code> changes the radio chip's boosted receive-gain mode. The FEM
settings control the external receive-path LNA or transmit-path gain on
supported boards. Changes are applied immediately and saved across reboots;
changing either receive-gain path also recalibrates the radio noise floor.
Boards without the respective control report it as unsupported.</p>
<pre><code>time {epoch-secs}
</code></pre>
<p>Set the device clock using UNIX epoch seconds. Example: time 1738242833</p>
<pre><code>advert
</code></pre>
<p>Sends an advertisement packet</p>
<pre><code>clock
</code></pre>
<p>Displays current time per device's clock.</p>
<pre><code>ver
</code></pre>
<p>Shows the device version and firmware build date.</p>
<pre><code>card
</code></pre>
<p>Displays <em>your</em> 'business card', for others to manually <em>import</em></p>
<pre><code>import {card}
</code></pre>
<p>Imports the given card to your contacts.</p>
<pre><code>list {n}
</code></pre>
<p>Lists favorite contacts first, then all remaining contacts. Each group is
ordered by the most recent advertisement. Optional <code>{n}</code> limits the displayed
contacts after applying that order.</p>
<pre><code>show
show adverts {on|off}
show channels {on|off}
show emergency {on|off}
</code></pre>
<p>Controls unsolicited receive output in the USB terminal. Plain <code>show</code> reports
the current settings, and <code>show {category}</code> reports one category. At boot,
advertisements and ordinary channel messages are hidden while <code>#emergency</code>
messages are shown. The three controls are independent, so <code>show channels on</code>
does not override <code>show emergency off</code>.</p>
<p>These filters affect terminal printing only. Messages still enter the offline
queue and are delivered through the binary Companion protocol. Changes remain
active when switching between terminal and binary mode and reset to their
defaults after reboot.</p>
<pre><code>to
</code></pre>
<p>Shows the name of current recipient contact. (for subsequent 'send' commands)</p>
<pre><code>to {name-prefix}
</code></pre>
<p>Sets the recipient to the <em>first</em> matching contact (in 'list') by the name prefix. (ie. you don't have to type whole name)</p>
<pre><code>path
</code></pre>
<p>Shows the saved outgoing path for the current <code>to</code> recipient. This command and
all path changes require a recipient to be selected first.</p>
<pre><code>path direct
path clear
path {hop-hash...}
</code></pre>
<p>Sets the outgoing path used by subsequent <code>login</code>, <code>send</code>, and <code>cmd</code> commands.
<code>direct</code> selects a zero-hop route. <code>clear</code> forgets the saved route, causing the
next operation to use flood routing and allowing normal path discovery to
learn a replacement.</p>
<p>Explicit paths use spaces, commas, or a mixture of both between hop hashes.
Each hop must contain exactly 2, 4, or 6 hexadecimal digits, and every hop in
one path must use the same width. Whitespace and hexadecimal letter case do
not matter. The setting is saved with the selected contact.</p>
<p>For example:</p>
<pre><code class="language-text">to Hilltop Repeater
path A1B2C3,D4E5F6
path 7773D0 7E7662
path
login my-admin-password
</code></pre>
<pre><code>login {admin-password}
</code></pre>
<p>Sends a remote login request to the current recipient. Select a repeater,
room, or other remotely managed node with <code>to {name-prefix}</code> first. The
password is masked with <code>*</code> while it is entered and must be 1-15 UTF-8 bytes;
longer passwords are rejected instead of truncated. Login uses the route shown
by <code>path</code>: a known or explicitly set route is direct, while an unknown route is
flooded.</p>
<p>Login results arrive asynchronously. A successful modern response displays
the remote ACL permissions byte and server protocol level. A wrong password,
an unreachable target, or a server that does not support remote login normally
produces a timeout because those nodes do not send a rejection packet.</p>
<pre><code>cmd {remote-command}
</code></pre>
<p>Sends CLI data to the current recipient. Wait for the login result before
sending the first command. The remote node applies its own ACL permissions,
and any reply appears asynchronously as <code>CLI -&gt; from {name}</code>. The response
window is 300% of the route estimate. A routed send is displayed as
<code>DIRECT via path {hop,...}</code> with the exact prefixes copied into the packet; in
MeshCore, <code>DIRECT</code> is the route class for an explicit path, not a synonym for
zero hops. A matched reply also shows its local round-trip time, measured from
queueing the command through receiving the result. This includes both radio
directions and remote execution; it is not execution-only CPU time. Only one
terminal <code>cmd</code> can be pending at a time.</p>
<p>For example:</p>
<pre><code class="language-text">to Hilltop Repeater
login my-admin-password
LOGIN -&gt; Hilltop Repeater accepted (ACL permissions 0x03, server v13)
cmd ver
cmd get radio
</code></pre>
<p>The exact commands and permissions depend on the target firmware. <code>cmd</code> does
not run a command on the local Companion; it sends the text over LoRa to the
selected node.</p>
<p>Incoming direct-route messages are labeled <code>ROUTED</code>, not <code>DIRECT</code>. Forwarders
consume direct-route prefixes as the packet travels, so the destination cannot
recover the reply's actual hop history from the received packet. Use <code>trace</code>
when the return route itself must be verified.</p>
<pre><code>send {text}
</code></pre>
<p>Sends the text message (as DM) to current recipient.</p>
<pre><code>trace
</code></pre>
<p>Traces the saved round-trip route to the current recipient and displays the
SNR at each hop. Select the recipient first with <code>to {name-prefix}</code>.</p>
<pre><code>trace {name-prefix}
</code></pre>
<p>Traces a recipient directly without changing the current <code>to</code> selection. A
trace requires a known direct path; use normal messaging or path discovery
first if the terminal reports that no valid path is available. Only one
terminal trace can be pending at a time, and a missing response is reported as
a timeout.</p>
<p>For example:</p>
<pre><code class="language-text">to Hilltop Repeater
trace
trace Downtown
</code></pre>
<p>The displayed route uses one- or two-byte node hashes and per-hop SNR values.
Saved three-byte paths are traced with two-byte prefixes because the trace
packet format has no three-byte hash-size mode.</p>
<p>To trace an explicit route instead of a saved contact path, provide the prefix
size followed by the complete ordered route:</p>
<pre><code class="language-text">trace path 1 12 34 56 34 12
trace path 2 1234,ABCD,5678,ABCD,1234
trace path 4 12345678, ABCDEF01 89ABCDEF, ABCDEF01,12345678
</code></pre>
<p>Prefix separators may be spaces, commas, or any mixture of them. Each prefix
must contain exactly 2, 4, or 8 hexadecimal digits for a 1-, 2-, or 4-byte
trace respectively. Three-byte traces are not supported.</p>
<p>The prefixes are used exactly in the order entered. To receive the trace
result, enter the complete outward route followed by its return route, as in
the mirrored examples above. A route that does not return to this node will
eventually report a timeout.</p>
<pre><code>reset path
</code></pre>
<p>Resets the path to current recipient, for new path discovery. This is retained
as an alias for <code>path clear</code>.</p>
<pre><code>public {text}
</code></pre>
<p>Sends the text message to the built-in <code>Public</code> group channel.</p>
<pre><code>channels
</code></pre>
<p>Lists the configured channel slots and names without exposing their secrets.</p>
<pre><code>channel {name-or-slot} {text}
</code></pre>
<p>Sends a message to any configured channel by its exact name or numeric slot.
Use the slot shown by <code>channels</code> when a channel name contains spaces.</p>
<p>For example:</p>
<pre><code class="language-text">channels
channel #rgdata Hello from Eugene
channel 2 Another message
show channels on
</code></pre>
<p>Messages are UTF-8. Emoji use multiple bytes toward the available message
length, which also includes the sender-name prefix added over the air.</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["content.action.edit", "content.code.copy", "search.highlight", "search.suggest"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
</body>
</html>