Fox Red Labs / Radio and range / Radio demos
What a 915 MHz radio does at home
One TI CC1407P radio on an MSPM0 LaunchPad development kit, and one CC1354P10-1 as the other end. Each demo ran on the bench. Listen to the voice, see the signal, read the events. Details are in the radio README, and odd results in the board page. Below, the computer is a Mac that starts each test. Wi-SUN FSK and 2-GFSK are two ways the radio turns bits into a signal. ADPCM squeezes speech into fewer bits.
Every demo here ran at +14 dBm on one channel. That is over the US limit for this kind of link (47 CFR 15.249, about -1 dBm). It is a home build of fewer than five units, run on the bench. A version for readers to build will use legal power. dBm measures signal power, and closer to zero is stronger.
Walkie-talkie
A computer voice speaks into one radio, and the other radio plays it back. Press play on both to compare.
All 122 frames arrived over the air with a passing checksum. One was clipped before it was sent, so there is a 40 ms gap about 2.4 seconds in.
How it was tested
The Mac speaks the line "Hi Mom! This is Fox Red Labs, talking over a nine hundred fifteen megahertz radio. Over." and compresses it to IMA ADPCM, 4 bits, 8 kHz (32 kbps), in 50 ms frames of 205 bytes. The CC1354P10 sends each frame over Wi-SUN FSK mode 2b, 100 kbps, 915 MHz; the CC1407P on the MSPM0 board receives it and the Mac plays it back. 0 frames were lost; 121 arrived bit for bit. The delay (99 ms typical, 135 ms worst) is measured on the Mac, from handing a frame to the sender to getting it back from the receiver, so it includes both serial cables. One way only: the MSPM0 board's microphone shares pins with the radio wires, and neither board has a speaker. Frame 47 reached the radio already cut to 123 of its 205 bytes: the CC1354P10's serial input dropped characters while it was transmitting. The radio's checksum passed on all 122 frames, so what was sent over the air arrived intact. The received recording matches the sent one sample for sample except 40 ms at 2.36 s, the frame that was cut before it was sent. Run 2026-10-11.
Fox hunt, hot and cold
Hide the beacon, then find it by following the signal: hotter as you get closer.
Left to right, the beacon was turned down in 8 steps, as if you walked away from it. Each bar is how loud the hunter heard it, in dBm. Closer to zero is louder: -34 is loud, -78 is faint. The hunter turns that into hot, warm, cool or cold.
How it was tested
Beacon: CC1407P on the MSPM0 G5187, 2-GFSK 50 kbps, 915 MHz. Hunter: CC1354P10-1. The beacon steps its power down, standing in for walking away; tested on one desk; range not measured. Each step sent 8 packets; the hunter heard 64 of 64. Scale: hot above -40 dBm, warm -60 to -40, cool -80 to -60, cold below -80. Run 2026-10-11. Tested on one desk; range not measured.
Key finder
Press find and the tag answers, then blinks its lights. The tag here is the radio board, standing in for one on a key ring.
Each circle is one press of "find". A dark circle means the tag answered, and the number is the time in milliseconds; a red one would be a miss. The two boards sat side by side.
How it was tested
The base is the CC1354P10-1, with the ring command sent from the computer. The handset, the CC1407P on the MSPM0 G5187, which blinks its LEDs, answers with how loud the base sounded, then blinks its lights. Each circle is one ring, labelled with milliseconds from the find command reaching the base to the answer coming back, from the log's timestamps. Run 2026-10-11.
Around the house
Mailbox, doorbell, panic button, kid messages and a backpack tag, all on one radio, showing up in Home Assistant.
Messages
Kid to parent (button S2 on the board, red):
Parent to kid (sent from the computer, beige):
One parent message did not reach the board; the cause is not known.
The 4-minute window closed 2 s after the panic button, so S2 presses after it were not captured; the messages were rerun in a separate 90-second window.
Timeline
How it was tested
One board does all of it: the light sensor is the mailbox (dark = closed), button S1 is the doorbell (hold 2 s for panic), button S2 sends the next canned message, and a heartbeat every second is the keep-close tag. The base posts each event to Home Assistant and sends a parent reply every 30 s, which the handset shows with a green flash. In about 4 minutes it heard 235 of the handset's 237 heartbeats. In a separate run the tag was switched off after 15 s; the base raised the out-of-range alarm in Home Assistant 3.0 s later (it waits 3.5 s from the last heartbeat). Kid messages: in a second 90-second window, 6 presses of S2 sent 6 messages, each in Home Assistant in under 20 ms. Run 2026-10-11.
Far shed sensor
A sensor at the far end of the yard. Battery life depends on how often it talks. Range was not tested; the boards sat on one desk.
Two AA batteries, by how often the sensor reports. These are computed, not measured. Batteries also drain on their own, which this does not count, so the long intervals will not reach these figures. Anything over 10 years shows as "10+ years".
How it was tested
Estimated: one 39-byte report takes about 9.3 ms to send, worked out from measured 20-byte (6.2 ms) and 200-byte (35.2 ms) send times. Assumed: CC1407P 22 mA transmitting at +14 dBm and 0.8 uA standby (TI data sheet SWRS301); MSPM0G5187 5 mA for 30 ms per report and 2 uA asleep (assumed, not measured); sensors and regulator losses not counted. A current meter would turn this into a measurement. Run 2026-10-11.