Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Receive GOES-16 and GOES-17 Images with a Raspberry Pi and RTL-SDR dongle

Receive GOES-16 and GOES-17 Images with a Raspberry Pi and RTL-SDR dongle

Also see the original Pieter Noordhuis's guide


You need:

  1. Raspberry Pi Model B (or B+) with a MicroSD Card $35-40
  2. An RTL-SDR dongle:
  3. LNA and SAW filter for around 1.69GHz
  4. A 1.6 - 1.9 GHz parabolic grid antenna
  5. Adapter (depending on the antenna terminal):
  6. Cable(s)

Total: ~$185


[Antenna] --- [Adapter] --- [(input) SAWBird+ (output)] --- RTL-SDR (with Bias Tee)] --- [Raspberry Pi]


Prep your Raspberry Pi and install necessary drivers and software.

0. Get your Raspberry Pi ready

  • Download Raspbian Lite Image and Etcher
  • Use Etcher to write the image to the SD card.
  • Mount the SD card as a volume on your machine.
  • Follow this procedure to configure WiFi and SSH.
  • Plug the card into your Raspberry Pi and turn it on.
  • Find the IP address of the Raspberry Pi using your gateway/router administrative interface.

Now you can SSH into your Raspberry PI as pi with a default password raspberry.

1. Get everything up to date

From now on all commands should be run on the Raspberry Pi.

sudo apt update
sudo apt dist-upgrade

# reboot the device
sudo reboot

2. Install dependencies

# get the packages necessary to build and run goestools
sudo apt install git build-essential cmake libusb-1.0 libopencv-dev libproj-dev

3. Install librtlsdr

Grab the latest librtlsdr source, compile it, and install the shared libraries/includes.

# download, compile, and install librtlsdr
git clone
cd librtlsdr
mkdir build
cd build
sudo make -j2 install

# load udev rules and blacklist the DVB driver shipped with the OS
sudo cp ../rtl-sdr.rules /etc/udev/rules.d/
sudo ldconfig
echo 'blacklist dvb_usb_rtl28xxu' | sudo tee --append /etc/modprobe.d/blacklist-dvb_usb_rtl28xxu.conf

# reboot the device
sudo reboot

4. Test your the RTL-SDR dongle


You should see something like this:

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

If it hangs, just press crtl-c to exit. It doesn't have to finish.

If there are errors, or if the device is not recognized:

  • Reinstall the driver from Step 3
  • Ensure the dongle is secured in the USB port
  • Remove all USB hubs and plug in into the Pi directly
  • Make sure you power your Raspberry Pi with at least a 2.5A power supply
  • Check the device using lsusb command. You should see ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 or something of the like listed there. If not, try the previous steps.
  • Run dmesg and check for errors such as error -71 related to the USB device. This may mean that your RTL-SDR receiver might be broken. This happened to me, so I ordered another one, which ran fine.

5. Install goestools

git clone
cd goestools
git submodule init
git submodule update --recursive
mkdir build
cd build

# this will take a while on a raspberry pi
sudo make -j2 install 

6. Create goesrecv.conf config

cat <<EOF > ~/goesrecv.conf
mode = "hrit"
source = "rtlsdr"

frequency = 1694100000
sample_rate = 2400000
gain = 5
bias_tee = false

max_deviation = 200e3

bind = "tcp://"
send_buffer = 1048576

statsd_address = "udp4://localhost:8125"

If you're using a NooElec SmarTee dongle with an always-on bias tee, or if you're powering your SAWBird through the micro USB port, set bias_tee = false under [rtlsdr].

If you're using dongle, set bias_tee = true to power the SAWBird board.

7. Roughly point your antenna at the satellite

Find where the GOES-16 or GOES-17 satellites are in the sky at your location using

Note the azimuth and elevation.

Use an actual real compass to point your dish at the azimuth. I've been using the iPhone phone compass, which has a 20-30 degree error, rendering it practically useless.

Adjust your dish angle according to the elevation.

8. Run goesrecv and perform fine antenna adjustments

goesrecv -v -i 1 -c ~/goesrecv.conf

This will show output every second that looks something like this:

2018-09-15T21:52:03Z [monitor] gain:  8.44, freq: -2121.4, omega: 2.589, vit(avg):  2400, rs(sum):  0, packets: 0, drops:  55

The vit(avg) stat shows the average viterbi error rate over 1 second interval (if running with -i 1).

If there's no signal, the vit value should be over 2000. When signal is stronger it should decrease.

This should help you point the antenna correctly. Slightly rotate the dish right or left and note whether the vit errors are increasing or decreasing.

Once you're at the local error minimum, perform the same process to find the minimum error rate while slightly adjusting the vertical angle.

When the vit errors are at their lowest, you've pointed the antenna. Double check the antenna position again with a compass to make sure you're pointed at the intended satellite; GOES-17 and GOES-16 are only about 15 degrees from each other in the sky.

9. Restart goesrecv and play around with the config parameters.

If your vit errors are under 400, and you're observing no packet drops, you're all set!

If the average errors are at around 1500-1800, try the following:

  • Terminate and restart goesrecv. This should allow it to readjust the gain and frequency offset to get a better read on the signal.

  • Cool the Raspberry Pi and the RTL-SDR dongle. I've noticed that temperature might significantly affect reception quality.

  • Play around with goesrecv.conf parameters. Try adjusting the gain and sample_rate. For the NooElec XTR or other E4000 tuners, you might need to set your gain to 10 or below.

Once you decreased the error rates, but your vit is still over 400, try making very slight adjustments to the antenna again.

10. Process packets into images

While goesrecv is running, in a separate session, run:

goesproc -c /usr/share/goestools/goesproc-goesr.conf -m packet  --subscribe tcp://

Once goesproc receives enough packets, it will start writing images and text to the locations described in /usr/share/goestools/goesproc-goesr.conf.

Writing: ./goes16/m2/ch13/2018-09-15/GOES16_M2_CH13_20180915T231750Z.jpg
Writing: ./goes16/m2/ch13_enhanced/2018-09-15/GOES16_M2_CH13_enhanced_20180915T231750Z.jpg
Writing: ./goes16/m2/ch02/2018-09-15/GOES16_M2_CH02_20180915T231750Z.jpg
Writing: ./goes16/m2/fc/2018-09-15/GOES16_M2_FC_20180915T231750Z.jpg
Writing: ./goes16/m1/ch07/2018-09-15/GOES16_M1_CH07_20180915T231820Z.jpg

11. TODO: Automatically restart goesrecv, store images on S3, send metrics to statsd and Grafana, and make videos!

Stay tuned!


This comment has been minimized.

Copy link

donde2 commented Sep 19, 2018

How long does it take to render a complete picture?


This comment has been minimized.

Copy link

nitelite7 commented Sep 19, 2018

How can I use my Airspy HF+ instead of the RTL-SDR with the software?


This comment has been minimized.

Copy link

kylePOGH commented Sep 21, 2018

so cool, cant wait to try this


This comment has been minimized.

Copy link

davidsaintruby commented Sep 24, 2018

Great write up. Got me working in 3 hours. Note you need to bump up the gain number for the rtl sdr v3. If not it looks dead. I found an example config with 30 and it brought it to life.


This comment has been minimized.

Copy link

jrocco36 commented Sep 30, 2018

Im not receiving any signal at all on 1694.1Mhz or anything above 1Ghz
I don't know where Iv'e gone wrong
first I have 3 meter (10ft) satellite dish so I should be collecting quite allot of signal
I have checked the dish alignment many times and it is pointed at GOES-16
I use the Nooelec NESDR Smartee with the NooElec Sawbird +GOES
I also tried using Airspy with SDR# and did not see anything over 1Ghz
I have also used a FM Block filter to remove FM radio stations.
Ive built a cantenna and helical coil and checked the specs on the dish to verify where the focal point is
Ive used this software on a Raspberry Pi 3B+ GQRX on Pi and SDR# on Windows and still never see over 1Ghz
I can tune in NOAA radio on 162.XX and FM Radio when the block filter is not connected
Any help will be appreciated.


This comment has been minimized.

Copy link

donde2 commented Oct 2, 2018

One link in the chain you haven't mentioned are cables and connectors. Very important to have clean and tight connectors. Stepping upon or bending a coax more than 50 degrees is not good. Look carefully. Stay focused looking carefully at each component. Maybe you're not getting voltage down the coax. Check last active device before the dish. What does the satellite have attached to it? I hope it's not an LNB! Remember the dish is not designed for 1694 MHz. Better to use what is suggested. The grid antenna is designed to have 20 db of gain very near 1694. Spend the $100 and get one.


This comment has been minimized.

Copy link

edbir1 commented Oct 17, 2018

Can you change the dongle number? There are several rtl_sdr devices on this machine and it would be nice to be able to choose the correct one. I tried -d like many rtl applications and it gave me Invalid option.


This comment has been minimized.

Copy link

w0fms commented Oct 28, 2018

This is pretty much absolutely brilliant. Thank you Pieter!

This guide is spot on as well! Thank you too!

It took me about 3 hours once I got serious about it too. I am using a RTL-SDR V3 (blog) unit powering a NooElec filter. I am using an old grid dish I had without a feed, but I built one using a "Kent Electronics 800-2500 MHz" (WA5VJB) PC board log periodic. Once I got the polarization right I'm getting about a Viterbi of about 300.. which only seems to drop a packet or two an hour. A more permanent mount than a camera tripod and I'll get that down a bit.

I don't have one, but as for the Airspy. Assuming that the version of it in the Raspbian Stretch distribution is okay, then doing s "sudo get airspy libairspy-dev" before you do the build configuration and build seems to build it in okay.

DO NOT pull the Stretch librtl, it won't work because it doesn't support the biasing of the RTL-SDR v3 and even if you don't have one the goestool software assumes you are running a newer version of librtlsdr.

Also, about every two weeks so far since I've toyed with the code (but was still building my feed for the dish) there has been code improvement made. You should periodically do the distribution upgrades, and the apt package upgrades, but also go to the goestools directories and do a "sudo git pull" and then the recompile the tools periodically as well.

cd build
sudo git pull
sudo make -j2 install

Will update the goestool code.

I'll write a comment later of how to set up shares and auto runs if the main blog here doesn't get updated. I need on working on building a weather shield for the log periodic and a more permanent mount before I get serious about leaving it up 24/7.


This comment has been minimized.

Copy link

w0fms commented Oct 29, 2018

By the way, for the "how long does it take?", the EMWIN stuff (NWA and text messages) are a couple of seconds, and the worst case is a full color GOES-16 full disk, and that is about 35 to 40 seconds. This is much faster than the old analog days, but since the satellite is sending files interlaced with other data it does vary. GOES-15 IR images are about 15 seconds.. Images range from about 1 megabyte to 4.. so 10-40 seconds...


This comment has been minimized.

Copy link

godayla commented Nov 1, 2018

Very interesting and successful this contribution. I want to try to receive it from the East of Spain (Valencia) but I see that the coverage footprint is very weak. Would it be possible? How many db of gain or diameter for an estimate? Thank you.


This comment has been minimized.

Copy link

LDK16 commented Nov 17, 2018

Great write up. Got me working in 3 hours. Note you need to bump up the gain number for the rtl sdr v3. If not it looks dead. I found an example config with 30 and it brought it to life.

I'm having some issues with the installing part because I am new to linux could you help me???


This comment has been minimized.

Copy link

windsr commented Dec 10, 2018

Thanks for the write-up, followed it and had my receiver up and running first try, well, after a little adjustment to the antenna. One question. Where do I find/create settings for the "regions" used? I'd like to try and create images using an area of interest, like when hurricanes are active, or a region in the US, instead of just editing the image. I see all the entries in the goesproc-goesr.conf file,
Thanks for your contribution to this.


This comment has been minimized.

Copy link

windsr commented Dec 14, 2018

Another question, is there a way to select what to process for the EMWIN downloads? I'd like to process just one region instead of all of them.


This comment has been minimized.

Copy link

dmcvin2447 commented Dec 23, 2018

Just built this systems today. It is AWESOME! Now to make a weatherproof enclosure for all the components and make the 2.5cm extension for the antenna mod permanent (cable ties for now). I shared a couple pics on my RasPi Twitter page @RasPi_WxSat.


This comment has been minimized.

Copy link

jogomez74 commented Dec 29, 2018

Hi, I try to install this decoder but in the the system ask to me a user name and password. I try with my Github count but ist not. Any suggestions?


This comment has been minimized.

Copy link

jrocco36 commented Feb 2, 2019

Got back on this project and got it working. brought the grid antenna and added two LNA's and now I can receive the images. I also gave up on using the Raspberry Pi 3b+ since it's power demands where so high and even with a 5a power supply connected to the GPIO ports it kept reboot. I built a full PC using Ubuntu and it works great. I would still like to use my 10ft Dish if possible since I get allot of dropped packets during rain or heavy clouds.


This comment has been minimized.

Copy link

kstoner-sbux commented May 26, 2019

Got it working! I was never able to get less than about 530 VER, but it seems to be low enough that I am not getting missed packets. Just got one of the FC Disks from GOES-17 - gorgeous!


This comment has been minimized.

Copy link

amdorj commented Aug 8, 2019

For part 11, have you considered using systemd to automatically (re)start goesrecv?
Something like this, located at /lib/systemd/system/goesrecv.service


ExecStart=/usr/local/bin/goesrecv -c /home/{your username here}/goesrecv.conf
User={your username here}

Run sudo systemctl daemon-reload then sudo service goesrecv start. Afterwards it will automatically start after startup.

Here's the down-low: What we're doing here is codifying GOESRecv as a service to be handled by Systemd, much like other services like apache or NetworkManager. It enables automatic start on boot and automatic restarting on crash, which might be useful.

I haven't tested this thoroughly, though, so your mileage may vary.


This comment has been minimized.

Copy link

RBlink91 commented Sep 18, 2019

Are there any updates on step 11? Thanks


This comment has been minimized.

Copy link

yoww commented Feb 13, 2020

Does this support hackrf?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.