Build a Raspberry Pi Powered NOAA Weather Radio Alert Receiver with SAME Code Decoding
- Raspberry Pi 4 Model B (4GB)
- RTL-SDR Blog V4 USB dongle
- NOAA weather radio / VHF discone antenna (covers 162 MHz)
- SanDisk 32GB microSD card
- USB 3.0 active extension cable for SDR placement
- Official Raspberry Pi USB-C power supply
- Raspberry Pi 4 case with ventilation
- SMA panel-mount bulkhead connector (optional, for a clean enclosure feed-through)
NOAA Weather Radio (NWR) broadcasts continuous weather information around the clock on seven dedicated VHF frequencies between 162.400 and 162.550 MHz, and it carries a digital burst called SAME (Specific Area Message Encoding) ahead of every alert that lets a receiver filter for only the counties and event types you actually care about. A commercial weather radio does this in a sealed box with a buzzer. This build does the same decoding on a Raspberry Pi with an RTL-SDR, and because it's software, the output can go anywhere — a Home Assistant notification, an MQTT topic, a logged history of every warning issued for your area, or all three.
Step 1: Assemble the Hardware
This is a straightforward build: mount the Pi in its case, connect the RTL-SDR dongle (use the USB extension cable if you want the dongle itself positioned away from the Pi's own electrical noise, which measurably improves weak-signal reception), and attach the VHF antenna. Position the antenna with as clear a view toward your regional NWR transmitter site as you can manage — a window-mounted or attic antenna will outperform one buried inside a metal enclosure every time.
Step 2: Find Your Local Transmitter Frequency
ChannelFrequency WX1162.550 MHz WX2162.400 MHz WX3162.475 MHz WX4162.425 MHz WX5162.450 MHz WX6162.500 MHz WX7162.525 MHzCheck the National Weather Service's station listing for your area to confirm which of these seven your nearest transmitter actually uses before you start — don't assume.
Step 3: Install the Decoding Software
Install the RTL-SDR userspace tools and multimon-ng, which includes a built-in EAS/SAME decoder mode. The basic signal chain is rtl_fm tuned to your local NWR frequency, piped directly into multimon-ng running in EAS decode mode:
rtl_fm -f 162.550M -M fm -s 22050 - | multimon-ng -a EAS -t raw /dev/stdinRun this as a long-lived systemd service rather than a manual terminal session, so the decoder restarts automatically on a Pi reboot or a crashed process.
Step 4: Decode the SAME Header
Every SAME alert starts with a fixed-format header that looks like ZCZC-ORG-EEE-PSSCCC+TTTT-JJJHHMM-LLLLLLLL-. Breaking that down:
FieldMeaning ORGOriginator code (WXR for NWS, CIV for civil authorities, EAS for broadcast stations, etc.) EEEEvent code — see the table below PSSCCCOne or more FIPS location codes identifying the affected counties TTTTPurge time — how long the alert remains valid, in hours and minutes JJJHHMMIssue time as day-of-year plus UTC time LLLLLLLLOriginating station identifier Common event codeMeaning TORTornado Warning SVRSevere Thunderstorm Warning FFWFlash Flood Warning WSWWinter Storm Warning HWWHigh Wind Warning CFWCoastal Flood Warning RWTRequired Weekly Test (not an actual alert)Step 5: Filter by Your County and Trigger an Alert
Write a small parsing script (Python works fine here) that watches the decoder's output, extracts the FIPS county codes from each header, and compares them against your own county's FIPS code — discard anything that doesn't match before it ever reaches a notification. For the alerts that do match, post to an MQTT topic or hit a Home Assistant webhook, exactly the pattern this site's n8n and Node-RED guides already cover for other sensor events; from there, routing to a phone push notification, a shop-wide audible alert, or an automation that pauses unattended CNC/laser jobs during a severe warning is just another automation rule on infrastructure you likely already have running.
Step 6: Log Everything
Append every decoded alert — matched or not — to a simple SQLite database or flat log file with a timestamp. This gives you a searchable history of every warning issued for your region, useful on its own and handy for catching decoder problems (a long gap with zero logged events, including the routine weekly test, is a sign something upstream has silently stopped working).
Safety Note
Build this because it's a genuinely useful automation project, not as a replacement for a real safety system. Software can crash, a Pi can lose power, a USB dongle can silently drop out — keep a commercial NOAA weather radio or your phone's built-in Wireless Emergency Alerts active as your actual life-safety backstop, and treat this build as a bonus layer of logging and automation on top of that, not instead of it.
Once it's running reliably, scaling to multiple SDR dongles tuned to different regional transmitters (useful if you're near a county line, or want coverage for a second property) is just another instance of the same pipeline on the same Pi.