Self-Hosted Offline EAS Alerts Over Meshtastic with RTL-SDR (github.com)
from IcedRaktajino@startrek.website to selfhosted@lemmy.world on 03 Apr 00:26
https://startrek.website/post/37670838

EAS (emergency alert system) alerts are issued for various local and/or national emergencies, and are frequently issued for severe weather events. As we enter tornado season in the US, I wanted to be able to receive and relay those over Meshtastic, specifically severe weather alerts, as an extra precaution since cell service often goes out after big storms.

I first setup a prototype setup on my laptop, but am planning to move the setup to a PiZeroW2 or a Banana Pi if the Raspi isn’t up to the task. In addition to monitoring/relaying EAS alerts, I’m also going to pipe the audio to an Icecast source and then to an Icecast server so anyone on the local network can listen to it.

Got lucky in that today was the day they did the weekly EAS alert test and that I happened to have this running during the test. Everything surprisingly worked, which was nice. However, I wanted to tweak some things and needed a way to run my own tests. So I grabbed the audio sample from the Wikipedia page for SAME and piped that in which worked beautifully.

Requirements

Sending Test Alerts

If you want to test the setup without having to wait for a weekly test, you can download a sample SAME audio clip from Wikipedia (en.wikipedia.org/wiki/File:Same.wav). You’ll need to convert the sample rate before you can use it, though.

$ ffmpeg -i Same.wav -ar 48000 same48.wav
$ cat same48.wav | Meshtastic-SAME-EAS-Alerter --test-channel 0
2026-04-02T15:32:31.172Z INFO  [Meshtastic_SAME_EAS_Alerter] Successfully connected to the node.
2026-04-02T15:32:31.175Z INFO  [Meshtastic_SAME_EAS_Alerter] Loaded locations CSV
2026-04-02T15:32:31.175Z INFO  [Meshtastic_SAME_EAS_Alerter] Monitoring for alerts
2026-04-02T15:32:31.175Z INFO  [Meshtastic_SAME_EAS_Alerter] Alerts will be sent to channel: 0
2026-04-02T15:32:31.175Z INFO  [Meshtastic_SAME_EAS_Alerter] Test alerts will be sent to channel: 0
2026-04-02T15:32:31.201Z INFO  [Meshtastic_SAME_EAS_Alerter] Begin SAME voice message: MessageHeader { message: "ZCZC-EAS-RWT-012057-012081-012101-012103-012115+0030-2780415-WTSP/TV-", offset_time: 47, parity_error_count: 0, voting_byte_count: 69 }
2026-04-02T15:32:31.201Z INFO  [Meshtastic_SAME_EAS_Alerter] No location filter applied (locations empty) or no locations in alert
2026-04-02T15:32:31.201Z INFO  [Meshtastic_SAME_EAS_Alerter] Attempting to send message over the mesh: 📖Received Required Weekly Test from WTSP/TV, Issued By: Broadcast station or cable system, Locations: Hillsborough, Manatee, Pasco, Pinellas, Sarasota
Connected to radio
Sending text message 📖Received Required Weekly Test from WTSP/TV, Issued By: Broadcast to ^all on channelIndex:0 
Waiting for an acknowledgment from remote node (this could take a while)
Received an implicit ACK. Packet will likely arrive, but cannot be guaranteed.
Connected to radio
Sending text message  station or cable system, Locations: Hillsborough, Manatee, Pasco, to ^all on channelIndex:0 
Waiting for an acknowledgment from remote node (this could take a while)
Received an implicit ACK. Packet will likely arrive, but cannot be guaranteed.
2026-04-02T15:33:11.227Z INFO  [Meshtastic_SAME_EAS_Alerter] End SAME voice message
2026-04-02T15:33:11.251Z WARN  [Meshtastic_SAME_EAS_Alerter] Program stopped, no longer monitoring

Working Prototype

This is the bash one-liner to start rtl_fm, tune it to the local NOAA frequency, and set the rate. That gets piped to tee which does 2 things currently:

  1. The audio is piped to play so that I can listen to the broadcast on the laptop’s speakers. This will eventually be piped to an Icecast source
  2. Pipes the audio to the Meshtastic SAME EAS Alerter program (the project linked in this post) and configures its settings

When a SANE message is detected, the program decodes it and broadcasts it to the configured channel. Fun fact: the Screech. Screech. Screech you hear before a severe weather alert is actually the encoded version of the emergency alert and what this program decodes.

When I move this all to whatever flavor of Pi I end up using, that’ll be wrapped in a systemd unit file so it can run headless and unattended.

$ rtl_fm -f 162.400M -s 48000 -r 48000 | tee >(play -q -r 48000 -t raw -e s -b 16 -c 1 -V1 -v 4 - sinc 125-3.2k) >(Meshtastic-SAME-EAS-Alerter --host 192.168.1.236 --test-channel 0) > /dev/null

Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Tuner gain set to automatic.
Tuned to 162652000 Hz.
Oversampling input by: 21x.
Oversampling output by: 1x.
Buffer size: 8.13ms
Exact sample rate is: 1008000.009613 Hz
Sampling at 1008000 S/s.
Output at 48000 Hz.
2026-04-02T14:20:49.702Z INFO  [Meshtastic_SAME_EAS_Alerter] Successfully connected to the node.
2026-04-02T14:20:49.704Z INFO  [Meshtastic_SAME_EAS_Alerter] Loaded locations CSV
2026-04-02T14:20:49.704Z INFO  [Meshtastic_SAME_EAS_Alerter] Monitoring for alerts
2026-04-02T14:20:49.704Z INFO  [Meshtastic_SAME_EAS_Alerter] Alerts will be sent to channel: 0
2026-04-02T14:20:49.704Z INFO  [Meshtastic_SAME_EAS_Alerter] Test alerts will be sent to channel: 0

#selfhosted

threaded - newest

litchralee@sh.itjust.works on 03 Apr 01:21 next collapse

TIL the EAS broadcast on WX band doesn’t include a digital sub carrier with a text version of the audio warning. That’s an amazing omission, since even the nationwide timekeeping signal out of Colorado has both an audio and digital mode.

IcedRaktajino@startrek.website on 03 Apr 01:27 next collapse

I was surprised by that, too. When I went looking for a way to decode them with RTL-SDR, I assumed it wouldn’t be parsing the audio but a narrowband data stream. TIL also.

Edit: It does kind of make sense with it being AFSK encoded in-band, though, or maybe I’m just so used to it being that way. I always thought the screeches were there to demand attention (and also be something that headend equipment can pick up and respond to). So it’s interesting they’re doing double duty as both an unmistakable audio cue to pay attention as well as containing the actual alert data.

Plus there are NOAA stations all over the country rather than centralized like the time signal transmitters. It was probably cheaper to do it in band at that scale.

non_burglar@lemmy.world on 03 Apr 15:22 collapse

These are different altogether.

The digital code in a time signal isn’t meant for humans to hear, it’s meant to sync devices.

The EAS is designed to be replayed on various radio systems with a simple and low-tech floor to get out there where it will be received. EAS that qualify (severe weather alerts) broadcast on NOAA’s various LF, VH, and VHF frequencies are transmitted on equipment that not only doesn’t carry digital side-channel, but isn’t even duplex.

Source: I am the radio person for my local Air Search and Rescue.

mrnobody@reddthat.com on 03 Apr 02:04 next collapse

I’m very green when it comes to meshtastic. I do want to learn and set all this up.

Even more so I’d like to do about 5 of these for immediate family. Would be nice to have some sort of preconfigured bundle.

calmluck9349@infosec.pub on 03 Apr 02:55 next collapse

Hmm. Might have something to play with this weekend!

artyom@piefed.social on 03 Apr 06:05 next collapse

That’s nice. Unfortunately I disabled these alerts due to abuse.

Decronym@lemmy.decronym.xyz on 03 Apr 06:10 next collapse

Acronyms, initialisms, abbreviations, contractions, and other phrases which expand to something larger, that I’ve seen in this thread:

Fewer Letters More Letters
AP WiFi Access Point
DNS Domain Name Service/System
IoT Internet of Things for device controllers
PoE Power over Ethernet
Unifi Ubiquiti WiFi hardware brand
VPN Virtual Private Network

6 acronyms in this thread; the most compressed thread commented on today has 12 acronyms.

[Thread #208 for this comm, first seen 3rd Apr 2026, 06:10] [FAQ] [Full list] [Contact] [Source code]

[deleted] on 03 Apr 06:28 collapse

.