A standalone dual-band firmware project for an ESP32-S3, one or two nRF24L01+ modules, an optional CC1101 Sub-GHz transceiver, microSD storage, and a 1.8-inch ST7735 TFT. Version 2.1 introduces a standardized 3-chip UI/UX, header safety boundaries, font rendering fixes, robust persistence validation, and expanded native testing. The default build remains receive-only; active RF testing is isolated in a separate controlled-lab build profile.
The interface is designed for a 160 × 128 landscape display. It uses partial/dirty rendering: the complete screen is cleared only during page transitions, while graphs, status values, and menu cards are redrawn only where their content changes. This reduces flicker and keeps the UI responsive.
Caution
RF Test can transmit traffic that disrupts 2.4 GHz communications. Use it only on equipment you own or are explicitly authorized to test, inside an RF shield box or Faraday enclosure. Never operate it against public networks, third-party devices, safety-critical services, or outside local radio regulations. You are responsible for using this project lawfully and safely.
- One- or two-radio operation with automatic degraded-mode fallback.
- Optional CC1101 support with OOK/2-FSK presets, RSSI analysis, packet inspection, and raw GDO0 capture.
- Sub-GHz library on
/RFSuite/SubGHzwith clean, favorite, rename, delete,.rfrreplay, Flipper RAW.subimport/export, live replay progress, and a persistent replay result screen. - Global simulation fallback when nRF24 or CC1101 hardware is missing. Every
simulated screen is marked
SIM; simulated data never enables RF output. - FreeRTOS mutex protection and contention metrics for the shared nRF24 SPI bus.
- 126-channel RF24 spectrum analyzer (
0–125, or2400–2525 MHz). - Four receive modes:
FAST,DIV,R1, andR2. ALL,Wi-Fi, andBluetoothscan ranges.- Modern spectrum graph with
LIVE,AVG,MAX, and baseline-relativeDELTAtraces. - Freeze, 1×/2×/4× zoom, cursor, persistent watch markers, and sampling confidence.
- 24-sweep waterfall with the newest data at the top.
- Single-channel inspector with live activity and peak readings.
- Channel survey showing the five channels with the highest average occupancy.
- RF-environment toolkit with occupancy, heatmap history, burst detection, channel comparison, relative interference scoring, before/after snapshots, and protocol-band hints.
- RF event detector with configurable threshold, hysteresis, duration, and multi-channel criteria.
- Buffered SD/LittleFS session recorder (256 KiB cap), two-session archive/comparison, USB CSV export, and last-sweep replay.
- Rotating persistent diagnostic event log and SD write-health fallback.
- Experimental passive nRF24 raw-payload sniffer with selectable channel and 1/2 Mbps rate, live hexadecimal preview, and Serial dump.
FAST,BALANCED,DEEP, andCUSTOManalyzer profiles.- Independent connectivity diagnostics for both radios.
- Six-page System Status with live ESP32, nRF24, CC1101/Sub-GHz, build-profile, storage, UI, scan, and SPI timing data.
- Ten complete UI themes controlling palette, Grid/List layout, header/footer geometry, and animation: Cyber, Ocean, Amber, Matrix, Violet, Ice, mascot-free Flipper, Retro, Terminal, and Neon.
- Versioned NVS configuration with validation, delayed writes, migration, and confirmed factory reset.
- Native analyzer unit tests and GitHub Actions CI for both firmware profiles.
- Software restart and low-power shutdown using ESP32 deep sleep.
- Three-second watchdog for automatic recovery from an unresponsive main loop.
The nRF24L01+ does not provide continuous RSSI measurements. Values displayed as 0–100% are the percentage of samples in which carrier/RPD activity was detected during an observation window. They are not calibrated dBm readings.
The results are useful for comparing relative activity, finding busy areas, and observing changes over time, but they do not replace a calibrated spectrum analyzer.
Channels shown by the UI are nRF24 RF channels:
frequency_MHz = 2400 + RF24_channel
These numbers are not Wi-Fi channel numbers. For example, the center of Wi-Fi channel 1 is near RF24 channel 12 (2412 MHz), Wi-Fi channel 6 near RF24 channel 37, and Wi-Fi channel 11 near RF24 channel 62.
- ESP32-S3 DevKitC-1 or a compatible board.
- 1–2 × nRF24L01+ modules.
- Optional CC1101 module with an antenna matched to the intended Sub-GHz band.
- 1.8-inch 128 × 160 ST7735 TFT.
- 4 × normally-open push buttons.
- One 10–100 µF decoupling capacitor for each nRF24L01+.
- A stable 3.3 V supply and a USB data cable.
Power the nRF24L01+ modules from 3.3 V, never 5 V. Connect the grounds of the ESP32, both radios, the display, and all buttons. External PA/LNA radio modules may require a dedicated 3.3 V regulator capable of supplying sufficient current.
| Signal | Radio 1 | Radio 2 | ESP32-S3 GPIO |
|---|---|---|---|
| VCC | VCC | VCC | 3.3 V |
| GND | GND | GND | GND |
| SCK | SCK | SCK | 12 |
| MOSI | MOSI | MOSI | 11 |
| MISO | MISO | MISO | 13 |
| CE | CE | — | 7 |
| CSN | CSN | — | 6 |
| CE | — | CE | 4 |
| CSN | — | CSN | 2 |
| IRQ | Not used | Not used | — |
Place each decoupling capacitor as close as possible to the corresponding radio's VCC and GND pins. Keep SPI wiring short to reduce communication errors.
| Module signal | ESP32-S3 GPIO |
|---|---|
| SCK/CLK | 18 |
| SDA/MOSI | 17 |
| A0/DC | 16 |
| RST/RES | 15 |
| CS | 14 |
| VCC | Match the module, typically 3.3 V |
| GND | GND |
For a TFT module with a microSD slot, connect the slot's SD_CS to GPIO 1 and
SD_MISO to GPIO 21. The slot shares SCK (GPIO 18) and MOSI (GPIO 17) with
the display. Override SD_CS_PIN and SD_MISO_PIN in build_flags if your
board uses different wiring. GPIO 3 is intentionally avoided because it is
used by boot/JTAG-related board functions. Use a FAT16/FAT32-formatted card.
After an upload/software reset the card remains powered, so firmware performs
an SD SPI bus recovery and extended mount retry automatically. Mount attempts
and MISO state are reported on Serial at 115200 baud. A manual retry is also
available from DATA -> Storage Health with a short A press.
The firmware initializes the display with INITR_BLACKTAB and rotation 3. If colors, offsets, or orientation are incorrect, check the panel variant in DisplayManager::init().
All buttons use INPUT_PULLUP and are active-low. Connect one side of each button to its GPIO and the other side to GND.
| Button | ESP32-S3 GPIO | General purpose |
|---|---|---|
| UP | 10 | Previous item or change analyzer band |
| A | 9 | Open, confirm, or perform an action |
| DOWN | 8 | Next item or change analyzer mode |
| B | 5 | Back or switch main-menu page |
On Tools → PKT SNIFF, UP/DOWN selects nRF24 channel 0–125, A
switches between 1 and 2 Mbps, and B stops capture. The screen shows the most
recent 32-byte raw payload as hexadecimal; complete payloads are also written
to the Serial Monitor. This experimental mode uses radio 1 only and leaves
radio 2's configuration untouched.
Enable Settings → SAVE SNIFF → SD CARD to append captured packets to
/RFSuite/log/packet_sniffer.csv. The option can only be enabled when an SD
card was detected at boot. Records contain uptime milliseconds, RF channel,
data rate, and the 32-byte hexadecimal payload; writes are buffered to avoid a
filesystem operation for every received packet.
The project uses PlatformIO with the Arduino framework.
-
Install Visual Studio Code and the PlatformIO IDE extension, or install PlatformIO Core.
-
Open this directory as a PlatformIO project.
-
Connect the ESP32-S3 using a USB data cable.
-
Build the default receive-only firmware:
pio run
-
Upload it to the board:
pio run --target upload
-
Open the Serial Monitor at 115200 baud:
pio device monitor --baud 115200
The default environment is intentionally receive-only:
[platformio]
default_envs = analyzerThe current firmware version is stored in VERSION and exposed in the device's
System Status → Radio / SW page. The current release is v2.1.0.
To publish a release, first update VERSION and APP_VERSION to the same
semantic version, commit the change, then push its matching tag:
git tag v2.1.0
git push origin v2.1.0The release workflow validates the tag, runs native tests, builds the safe
receive-only analyzer profile, uploads its .bin file and SHA-256 checksum,
and generates release notes from commits and merged pull requests since the
previous release.
Available environments:
| Environment | Purpose | Build command |
|---|---|---|
analyzer |
Default receive-only analyzer; active RF Test is not compiled | pio run -e analyzer |
authorized_rf_lab |
Enables RF Test for shielded, explicitly authorized lab work | pio run -e authorized_rf_lab |
native |
Host-side unit tests for dependency-free analyzer logic | pio test -e native |
Upload a specific profile with pio run -e analyzer -t upload or, only for an isolated authorized setup, pio run -e authorized_rf_lab -t upload.
The current configuration selects a 4 MB upload flash size, the default.csv partition table, DIO flash mode, and USB CDC on boot. Adjust board_upload.flash_size if the physical board has a different flash capacity.
PlatformIO installs these dependencies automatically:
- RF24
^1.6.2 - Adafruit ST7735 and ST7789 Library
^1.11.0 - Adafruit GFX Library
^1.12.6 PreferencesandSPIfrom the Arduino ESP32 frameworkLittleFSfrom the Arduino ESP32 framework
After the splash screen, the Main Menu selects 2.4 GHz, Sub-GHz, Settings,
System Info, Lua, SD Files, Data, or Power. Data is a band-independent hub for
session management/comparison, storage health, and the persistent event log.
The 2.4 GHz catalog retains its paged
feature menu. Choose the GRID or LIST layout in Settings; the choice applies
to the global, 2.4 GHz, and Sub-GHz menus.
The first boot includes a three-page guide covering measurement limitations, the four-button controls, and RX/SIM/lab states. Headers provide breadcrumbs and compact radio/storage/recording/mode indicators. Actions use typed toast messages and storage failures provide an actionable detail dialog.
For CC1101 analyzer/record screens, modulation presets, TX-region policy, raw file format, replay progress controls, and remote compatibility, see the Sub-GHz guide.
| Control | Main-menu action |
|---|---|
UP / DOWN |
Move between feature cards |
A |
Open the selected feature |
B |
Advance to the next menu page |
UP at the first item |
Move to the previous page and select its last item |
DOWN at the last item |
Move to the next page and select its first item |
| Feature | Purpose |
|---|---|
| Sessions | Start/stop, inspect current/previous, compare, export, or delete the current session |
| Storage Health | Show active backend/free space, retry SD, or hold A for a write/read benchmark |
| Event Log | Browse persistent diagnostics; hold A to export or hold B to clear |
Spectrum includes confidence badges, threshold/baseline markers, contextual
controls, watched-channel emphasis, and selectable fixed 0–100 or adaptive
graph scaling under Settings → Graph Scale. Held navigation accelerates from
single steps to 5× and 10× on supported channel/value/list controls.
| Feature | Purpose | Controls |
|---|---|---|
| Spectrum | Live/average/max/delta graph, cursor, zoom, confidence, and hold | Live: tap UP: band, tap DOWN: radio mode. Frozen: tap UP/DOWN: cursor. Tap A: freeze/resume; hold UP: trace, hold DOWN: zoom, hold A: baseline, hold B: watch marker |
| Waterfall | Last 24 sweeps, newest at the top | UP: band, DOWN: radio mode, A: clear history |
| Inspect | Deeper observation of one RF channel | UP/DOWN: channel ±1, A: channel +10 |
| Survey | Top five average channel occupancies | UP/DOWN: change band and reset, A: reset survey |
| Events | Events that satisfy threshold, hysteresis, duration, and channel-count rules | Tap UP/DOWN: threshold/hysteresis; hold UP/DOWN: duration/channel count; A: clear |
| Logging | Record complete sweeps to LittleFS and summaries to USB Serial | A: start or stop a new session |
| Feature | Purpose | Controls |
|---|---|---|
| RX Only / RF Test | RX-only notice in the default profile; controlled transmission screen in the lab profile | Lab profile: UP/DOWN: target, A: start or stop |
| Radio Diag | Check Radio 1 and Radio 2 connectivity | A: refresh |
| Profiles | Select analyzer sampling depth | UP/DOWN: profile, A: change CUSTOM value |
| Settings | Configure RF power, dwell time, UI theme, packet saving, and orientation | UP/DOWN: select field, A: next value |
| Status | Hardware, memory, radio/software, and performance data | UP/DOWN: page, A: refresh |
| Power | Restart or enter deep sleep | UP/DOWN: option, A: confirm |
Press B to return to the main menu from any feature screen.
| Feature | Purpose | Controls |
|---|---|---|
| Occupancy | Per-channel carrier-hit occupancy and top channels | A: start/stop sampling |
| Heatmap | Circular time history across channel groups | A: start/stop sampling |
| Bursts | Recent activity increases relative to the moving baseline | A: start/stop; UP/DOWN: browse events |
| Compare | Compare 2–4 configured RF channels | A: start/stop sampling |
| RF Status | Overall relative score, sample rate, cycles, and strongest channel | A: start/stop sampling |
| BEF/AFT | Capture two in-RAM snapshots and display their difference | A: capture Before, then After; UP/DOWN: channel |
| Feature | Purpose | Controls |
|---|---|---|
| Band Info | Show possible Wi-Fi, BLE/Bluetooth, and Zigbee overlap at a frequency | UP/DOWN: RF channel |
| RX Only / Auth Probe | RX-only notice, or bounded probe controls in the lab build | Lab build: UP/DOWN: field, A: change/action |
The environment labels are frequency-region hints, not protocol detection, and all percentages and scores are relative carrier-detection metrics rather than calibrated RF power. See RF Environment.
| Range | RF24 channels | Approximate frequency |
|---|---|---|
| ALL | 0–125 | 2400–2525 MHz |
| Wi-Fi | 1–73 | 2401–2473 MHz |
| Bluetooth | 2–80 | 2402–2480 MHz |
| Mode | Behavior |
|---|---|
| FAST | Both radios scan adjacent channels in parallel |
| DIV | Both radios observe the same channel and their results are combined |
| R1 | Use Radio 1 only |
| R2 | Use Radio 2 only |
If only one module is detected, requests that require the missing receiver transparently use the available module. With no radios detected, the firmware still boots into its UI and Serial diagnostics instead of entering a reboot loop.
| Trace | Meaning |
|---|---|
LIVE |
Carrier-hit percentage from the latest sweep |
AVG |
Exponentially smoothed activity |
MAX |
Highest activity observed since boot or a clear |
DELTA |
Positive change relative to a RAM-only captured baseline |
Q on the spectrum screen is observation confidence derived from samples per channel, available receiver count, and baseline availability. It describes acquisition depth, not RF accuracy and not a dBm calibration. Baselines are intentionally not restored after reboot because the RF environment may have changed.
| Profile | Spectrum | Channel Inspector | Characteristics |
|---|---|---|---|
| FAST | 12 samples/channel | 50 samples | Fastest refresh |
| BALANCED | 30 samples/channel | 100 samples | Default |
| DEEP | 60 samples/channel | 200 samples | More stable, slower sweeps |
| CUSTOM | 10–100 samples/channel | 2× spectrum value, capped at 200 | Adjustable with A |
The selected profile and CUSTOM sample count are stored in NVS.
At boot, the firmware mounts the TFT microSD slot and creates /RFSuite/log/
and /RFSuite/scripts/. Open Analyze → Logging to start a new session. On SD,
the current /RFSuite/log/rf_session.csv is archived as
rf_session_previous.csv. If no writable card is present, recording
transparently falls back to LittleFS /rf_session.csv.
Lua 5.1 scripts (maximum 32 KiB) can be placed in /RFSuite/scripts/, listed
with lua list, and executed with lua run NAME. The sandbox exposes 2.4 GHz
analysis/control, custom TFT drawing, button input, and integrated Sub-GHz
status, analyzer, raw record, Library, and guarded replay APIs. Sub-GHz Lua
replay uses the native progress/result UI and remains unavailable outside the
authorized_rf_lab build. rf.log(message) appends to
/RFSuite/log/lua.log. File/OS/package loading is disabled and each run has an
instruction limit. See examples/lua/ for ready-to-copy examples and
self-tests.
The complete API and TFT loading workflow are documented in
docs/LUA_SCRIPTING.md.
RFLOG,<timestamp_ms>,<sweep>,<peak_channel>,<peak_percent>,<band>,<radio_mode>,<trace>,<confidence>
Example:
RFLOG,18240,57,37,73,Wi-Fi (1-73),FAST,LIVE,65
The recorder flushes in batches to reduce flash churn and stops at approximately 256 KiB. Use session export to stream the stored CSV, session replay to load its most recent complete sweep, or session compare to compare it with the archived session. Recording state is not restored after reboot.
The Status screen reads live runtime values instead of displaying hard-coded hardware information:
- Device Info — chip model, revision and core count, CPU frequency, flash size and clock, and uptime.
- Memory Info — total, free, and minimum heap, largest allocation block, sketch size, and PSRAM status.
- Radio / Software — each nRF24 connection or simulation state, scan mode, receive-only/lab build, ESP-IDF, and firmware version.
- Sub-GHz Status — CC1101 connection, frequency, modulation, TX Region, raw recorder, and analyzer state.
- Performance — average/maximum sweep time, UI render time, loop rate, SPI mutex wait, and recorder state.
A radio status of CONNECTED confirms SPI communication with the chip. It does not prove that the antenna, RF matching, or receiver sensitivity is working correctly.
The current settings use schema version 8, validation, migration, and a 1.5-second deferred write. It also stores menu layout, packet-sniffer SD logging, CC1101 preset, TX-region policy, Sub-GHz trigger configuration, and replay count.
- RF power.
- Dwell time.
- Last RF Test target.
- Analyzer profile.
- CUSTOM profile sample count.
- Display theme.
- Analyzer trace (except
DELTA, because its environmental baseline is RAM-only). - Event detector configuration.
- Channel watch markers.
Use the exact Serial command factory reset confirm to clear the namespace, write validated defaults, and reboot. The explicit confirmation suffix prevents accidental resets.
Waterfall history, survey results, RF events, receive mode, analyzer range, and logging state exist only in RAM and are cleared by a restart or shutdown.
Select Tools → Power → Shutdown. The firmware will:
- Stop both radios.
- Disable the TFT and place its controller into sleep mode.
- Put the ESP32-S3 into deep sleep.
To wake the device, hold A for approximately 1.5 seconds. A short press returns the device to deep sleep, preventing accidental boots caused by contact noise.
Deep sleep is a very-low-power software shutdown, not physical power disconnection. The board regulator, power LED, and external peripherals may still draw current. A hardware power latch or load switch is required to disconnect the supply completely.
The command interface runs at 115200 baud.
| Command | Description |
|---|---|
help |
Show the available commands |
status |
Show system and radio status |
config / settings |
Show the current RF configuration |
scan / spectrum |
Run one sweep and print an ASCII graph |
inspect <0-125> |
Measure activity on one RF channel |
trace <live|avg|max|delta> |
Select the spectrum trace |
freeze / resume |
Hold or resume acquisition |
zoom <1|2|4> |
Set graph zoom around the cursor |
cursor <0-125> |
Place the cursor and disable peak-follow |
watch <0-125> |
Toggle a persistent channel marker |
baseline |
Capture the current average as baseline and select DELTA |
max clear |
Clear maximum and peak history |
event threshold <5-100> |
Set event trigger percentage |
event hysteresis <0-threshold> |
Set the release margin |
event duration <1-20> |
Set minimum consecutive sweeps |
event channels <1-16> |
Require simultaneous qualifying channels |
session start|stop|info |
Control or inspect SD/LittleFS recording |
session export |
Stream the stored full-sweep CSV |
session replay |
Load and freeze the last stored sweep |
session compare |
Compare current and previous session summaries |
events export |
Stream the persistent diagnostic event log |
perf |
Print scan, UI, loop, and SPI mutex timings |
factory reset confirm |
Restore NVS defaults and reboot |
power / pwr |
Show the current RF power |
power <min|low|high|max> |
Change RF power |
dwell |
Show the current dwell time |
dwell <10-10000> |
Set dwell time in microseconds |
jam <wifi|bt|ble|bledata|all|zigbee> |
Select a target and start RF Test; shielded lab use only |
start |
Start RF Test with the active target |
stop |
Stop all transmission |
The scan and inspect commands stop RF Test first so that available radios enter the correct receive mode. Transmit commands print an unavailable message in the default analyzer build.
Core 0 Core 1 / Arduino loop
┌─────────────────────┐ ┌────────────────────────────┐
│ RF Test FreeRTOS │ │ Buttons + Serial CLI │
│ task (when active) │ │ Analyzer dispatcher │
│ │ │ Partial display renderer │
└──────────┬──────────┘ └─────────────┬──────────────┘
└──── mutex-protected nRF24 SPI ───┘
AppStateowns UI, analyzer, event, survey, and NVS state.RadioManagercontrols RX/TX transitions and access to both nRF24 modules.SessionRecorderbuffers full sweeps to LittleFS and supports export/replay.PerformanceMonitorcaptures sweep, UI, loop, and SPI wait behavior.DisplayManagerimplements the menu grid and dirty-region rendering.MenuCatalogis the single source of truth for menu labels, destination modes, icons, and open actions.AppModePolicycentralizes which screens run continuous spectrum acquisition.ButtonManagerprovides 50 ms debouncing and long-press detection.SerialCommanderhandles the CLI and logging output.Watchdogmonitors the main loop with a three-second timeout.
See docs/ARCHITECTURE.md for module boundaries and the feature-extension checklist.
The complete manual is indexed in docs/README.md. It includes getting started, hardware, every display control, analyzer interpretation, session formats, Serial commands, persistence, development rules, testing, troubleshooting, and RF-lab safety.
| Path | Purpose |
|---|---|
platformio.ini |
Board environment, dependencies, flash, and USB CDC settings |
include/config, src/config |
Pin assignments, constants, channel tables, and static assets |
include/core, src/core |
Shared types, application state, analyzer aggregation, policies, and NVS |
include/drivers, src/drivers |
Buttons, dual-radio lifecycle, RF acquisition, and RF Test task |
include/services, src/services |
Serial CLI, watchdog, session recording, and performance metrics |
include/ui, src/ui |
Display API, theme, menu catalog, controller, and screen modules |
src/ui/screens |
Renderers grouped into menu, analyzer, and system domains |
src/main.cpp |
Setup, main loop, shutdown, and wake validation |
docs/ARCHITECTURE.md |
Dependency rules and guide for adding features |
- Confirm that VCC is 3.3 V and all grounds are connected.
- Verify the separate CE/CSN pins and the shared SCK/MOSI/MISO lines.
- Install a 10–100 µF capacitor close to each module.
- Use short wires and a supply that does not sag when both radios are active.
- The firmware makes up to five initialization attempts. It runs with either radio, and stays in diagnostics-only mode if neither responds.
- Do not power high-current PA/LNA modules from an undersized on-board regulator.
- Use a dedicated 3.3 V regulator with a common ground.
- Add rail decoupling and shorten the power wiring.
- Verify every TFT pin and the common ground.
- Confirm that the panel controller is an ST7735.
- Adjust
INITR_BLACKTABandsetRotation(3)for a different panel variant.
- Use a USB data cable and select the correct port.
- Set the monitor to 115200 baud.
- This project enables
ARDUINO_USB_MODE=1andARDUINO_USB_CDC_ON_BOOT=1; pressing reset after opening the monitor may help on some hosts.
- Hold
A/GPIO 9 for at least approximately 1.5 seconds. - Confirm that the button connects GPIO 9 to GND and has no external pull-down.
- Deep-sleep wake depends on an RTC-capable GPIO, so preserve this pin assignment when changing the wiring.
- The analyzer measures carrier-detection probability, not absolute RSSI or protocol identity.
- It does not decode Wi-Fi, Bluetooth, BLE, or Zigbee packets.
- Waterfall, survey, event history, and environmental baselines are RAM-only; recorded sweeps use LittleFS.
- The ST7735 renderer does not use a full framebuffer; partial rendering is used to save RAM.
- Software shutdown does not physically disconnect board power.
- Native tests cover dependency-free analyzer math, but radio timing, display offsets, wake behavior, and RF behavior still require hardware-in-the-loop verification.
Before submitting changes, run:
pio run --target clean
pio test -e native
pio run -e analyzer
pio run -e authorized_rf_labKeep pin definitions in include/config/Config.h, avoid full-screen redraws for dynamic updates, and document changes to Serial or NVS formats to preserve user compatibility.
This repository currently has no separate license file. Add a LICENSE before distributing it under specific license terms.
Firmware now includes a passive RF Environment Test subsystem: full/ranged nRF24 carrier-hit occupancy, 32-bucket heatmap, burst events, relative interference scoring, 2–4 channel comparison, before/after snapshots, and frequency-band overlap hints. Results are relative activity observations, not RSSI, dBm, calibrated RF power, or protocol detection.
Use the analyzer profile for the default RX-only firmware. The optional authorized_rf_lab profile compiles a single-channel, bounded, low-duty probe (LOW power, 100 ms interval, 8-byte payload, 10-second default limit). It never uses continuous carrier or retransmit reuse.