Piaware ADS-B receiver

From regional-training

flightaware

piaware on raspberry pi

hints

raspi-config
  • copy the configuration data off pi

ADS-B background

piaware src

installation

Claim the new feeder-id if you are setting up a new piaware and not re-using an existing feeder-id to preserve its history.

trixie

At the time of writing (2025-11-24) flightaware did not have a repository for Debian trixie release so we explore using https://github.comn/abcd567a/debian13

This repos https://discussions.flightaware.com/t/piaware-ver-10-0-on-trixie-aarch64-rpi-model-4/97562 allows you to install:

  • piaware - PiAware is an open-source software package from FlightAware that turns a low-cost computer like a Raspberry Pi, a USB receiver, and an antenna into an aircraft tracking ground station. It decodes signals from aircraft transponders, allowing users to view planes in real-time on a local network and to contribute data to FlightAware's global flight tracking network.
  • dump1090-fa - dump1090-fa is a software-based aircraft transponder message decoder and demodulator, forked from dump1090 by FlightAware. It is designed to work with an RTL-SDR dongle and other software-defined radio (SDR) devices to receive, decode, and display aircraft position data from ADS-B signals. Piaware can feed this data to FlightAware's network for a crowd-sourced view of global air traffic
  • fr24feed - f24feed refers to the fr24feed software, a program used to feed Flightradar24 with real-time aircraft data, specifically ADS-B signals. It allows users to set up their own ADS-B receiver to share collected data with the Flightradar24 service in exchange for a free business plan. This is a way to contribute to the global flight tracking network and get a free premium service.
  • piaware-web - piaware-web is the web-based landing and status page for a PiAware system, which is a program that turns a Raspberry Pi into an aircraft tracking ground station. It provides a user-friendly interface for local network access to information from the PiAware, including its status and configuration options. The piaware-web package includes static HTML/JS files and a web server configuration, making it easy to access the system's data from a web browser on the same local network.
  • fclient - flight data client for Plane Finder that pulls aircraft data (Mode S/Beast) and sends it to the Plane Finder network. The Prompt Flow PFClient is a Python client class used to manage the runs, connections, and tools within the Prompt Flow framework.
  • rbfeeder - RBFeeder is a software application from RadarBox that allows users to share aircraft tracking data with RadarBox's servers. It works by decoding ADS-B messages from aircraft and sending the information to RadarBox for their flight tracking service. This software is particularly popular with Raspberry Pi users who can use it to set up their own flight data sharing station.
Installation steps https://github.com/abcd567a/debian13/blob/master/README.md
  • obtain repos key
wget -O /etc/apt/keyrings/abcd567a-key.gpg https://abcd567a.github.io/debian13/KEY2.gpg  
  • obtain repos source
wget -O /etc/apt/sources.list.d/abcd567a.list https://abcd567a.github.io/debian13/abcd567a.list
  • update apt
sudo apt update
  • install piaware
apt install piaware
  • install dump1090
apt install dump1090-fa
  • (optional) install piaware-web
apt install piaware-web
  • (optional) install fr24feed
sudo apt install fr24feed
sudo fr24feed --signup
  • (optional) install pfclient using <IP-of-PI>:30053
sudo apt install pfclient
  • (optional) install rbfeeder only for raspberry pi
sudo apt install rbfeeder 
sudo rbfeeder --setkey xxxxxxxxxxxx (If you have a RB24 key)
sudo rbfeeder   (If you do not have a RB24 key)

installation from flightaware repository for buster/bullseye/bookworm

via apt-get https://flightaware.com/adsb/piaware/install ***

  • (optional) prepare
sudo apt update
sudo apt full-upgrade
sudo reboot
  • Obtain piaware client code from repos
wget https://www.flightaware.com/adsb/piaware/files/packages/pool/piaware/f/flightaware-apt-repository/flightaware-apt-repository_1.2_all.deb
sudo dpkg -i flightaware-apt-repository_1.2_all.deb
  • now update
sudo apt update
sudo apt install piaware
  • (optional) automatic and manual (web-based, via your request) PiAware software updates. These updates are disabled by default. To leave updates disabled, skip this step.
sudo piaware-config allow-auto-updates yes
sudo piaware-config allow-manual-updates yes
  • Install dump1090-fa
sudo apt install dump1090-fa
  • disable swap
sudo apt purge dphys-swapfile

install from images

unzip -p 2019-07-10-raspbian-buster.zip | sudo dd of=/dev/sdX bs=4M conv=fsync
pi raspberry
  • configure feed if you have existing account [1] [2]
sudo piaware-config flightaware-user somename
sudo piaware-config flightaware-password somepasswd-XYZZY
sudo piaware-config feeder-id 7e5d4355-xxxx-xxxx-xxxx-b30ed1f4ac71    # from your records
sudo piaware-config rtlsdr-gain max
sudo piaware-config wireless-network no
  • network setting
    • local EN_AU
    • localisation UTF8
    • set timezone e.g. Australia/Canberra
    • set hostname
    • enable sshd
sudo systemctl start sshd [3]
  • disable swap
sudo apt purge dphys-swapfile

general configuration

update existing piaware

This is done on an existing pi instead of re-imaging the card

  • get the repository details
wget http://flightaware.com/adsb/piaware/files/packages/pool/piaware/p/piaware-support/piaware-repository_3.7.1_all.deb
  • install the repository
sudo dpkg -i piaware-repository_3.7.1_all.deb
  • do an update
sudo apt-get update
  • install piaware
sudo apt-get install piaware
  • install dump1090
sudo apt-get install dump1090-fa
  • configure
sudo piaware-config allow-auto-updates yes
sudo piaware-config allow-manual-updates yes
  • reboot

set hostname

set page title

The PiAware SkyAware tab title is set via config.js

  • edit the title to state the location e.g. the airport it is covering
// Controls page title, righthand pane when nothing is selected
PageName = "YSCB PiAware";

You may also change the pointer and default map location.

It is then a simple matter of systemctl restart lighttpd to publish the .js changes.

ensuring piaware is running properly

Implement the following script executed by cron

vi /root/check-aircraft.sh
chmod +x /root/check-aircraft.sh
#!/bin/bash

URL=http://localhost:8080/data/aircraft.json

command="curl -s $URL" 

result=`$command`
#echo $result

expr="aircraft.*: (.*)"

if [[ $result =~ $expr ]]; then
	matched=${BASH_REMATCH[1]}
	if [[ ! $matched =~ hex ]]; then
		echo "no aircraft in $matched - restarting services"
  		echo "need to restart dump1090 et al" >> /var/log/piaware.log
		/bin/systemctl restart lighttpd dump1090-fa piaware
	else
		echo "aircraft being tracked"
	fi
else
	echo "$result restarting services"
	echo "need to restart dump1090 et al" >> /var/log/piaware.log
	/bin/systemctl restart lighttpd dump1090-fa piaware
fi
  • execute this script every minute to ensure that piaware/dump1090/lighttpd is functioning as expected.
*/1 * * * * /root/check-aircraft.sh

It seems that it takes several minutes for the aircraft database to time-out in which case the request will return 404. Messages are still sent to flightaware until all the aircraft timeout so tracking the number of messages does not help.

piaware et. al. is also restarted by this script during quiet times which results in aircraft[] being empty. This is just a fail-safe safety feature as I have seen this happen, even when there really are aircraft to be tracked. I have had to restart the Cowra dump1090-fa a couple of times while I was on holidays in Sydney which is the reason why this script has been developed. Note that the script restarts all the dependent services: lighttp, piaware and dump1090-fa.

ensure logrotate empties periodically

This prevents the sdcard being filled with logs, or overlay filesystem from clagging. You may also consider periodic reboot.

This is an example /etc/logrotate.conf from the watchdog.server:

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 1 rotations worth of backlogs
rotate 1

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
#dateext

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# system-specific logs may be also be configured here.
# RBH specific log rollover
#
# lists.log can get big due to all the attacks; rotate it daily and limit its size
/var/log/lists.log {
	missingok
	maxsize 100M
	daily
	create 0644 root root
	rotate 4
}

upgrade

Preserve your feeder id.

  • Find the existing feeder ID that you want to use either as the "Site Identifier" on the site's statistics page (My ADS-B)
  • or from the PiAware logs in /var/log/piaware.log on your existing install.

The identifier looks like a series of dash-separated hex digits, e.g., 12345678-1234-1234-1234-123456789abc.

Configure the feeder ID on the new system by running this command on the Pi:

piaware-config feeder-id 12345678-1234-1234-1234-123456789abc

Or, edit the piaware-config.txt file to add the feeder-id configuration row:

feeder-id 12345678-1234-1234-1234-123456789abc

Restart the device or restart piaware by running this command on the Pi:

sudo systemctl restart piaware

Download latest image

http://piaware.flightcdn.com/piaware-sd-card-3.6.3.img.zip

optimising gain

The system gain on piaware at YSWG is so high that AAPA aircraft within 3 miles of the aerodrome are practically trackable. I reduced the gain from max -10 to 45 dB and there was an improvement with close in. It looks like I have to employ diversity and setup a second RTL set to a lower gain, or with a cheap antenna to see if I can fill-in the close range traffic. If a second dongle will contribute traffic and it an merge then that is a good idea, otherwise I will need to modify dump1090-fa so the trackers can collaborate. It seems that I need to knock the gain down to 40dB.

unassign existing feeder id

To see the current feeder-id

sudo piaware-config -show feeder-id
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  • to reset
sudo piaware-config feeder-id ""
Cleared setting for feeder-id in /etc/piaware.conf:9
  • restart (then claim it)

$ sudo systemctl restart piaware

Now log-in to the new Flightaware account from same network where the Pi is, and click this link and complete claim process.

https://flightaware.com/adsb/piaware/claim 

The Pi will now be registered with your new account with a new station number.

Note: there may be a /boot/piaware-config.txt in which case entries inside it will take precedence.

overlayfs

You can enable the overlayfs [4] to eliminate writes to the sdcard, later versions of raspi-config [5] - from bullseye onwards includes a Performance option for the overlayfs. Writing to the sdcard will eventually cause the card to fail.

raspberry pi 3 B + overlay

Note that from buster onwards the raspi-config includes scripting to enable and disable an overlayfs. This is not available on the raspberry pi 3 B + running buster and bullseye so overlay is enabled by the actions as follows.

  • include overlay module ini initramfs
echo overlay >>/etc/initramfs-tools/modules
  • create the overlay script /etc/initramfs-tools/scripts/overlay
# Local filesystem mounting                     -*- shell-script -*-

#
# This script overrides local_mount_root() in /scripts/local
# and mounts root as a read-only filesystem with a temporary (rw)
# overlay filesystem.
#

. /scripts/local

local_mount_root()
{
        local_top
        local_device_setup "${ROOT}" "root file system"
        ROOT="${DEV}"

        # Get the root filesystem type if not set
        if [ -z "${ROOTFSTYPE}" ]; then
                FSTYPE=$(get_fstype "${ROOT}")
        else
                FSTYPE=${ROOTFSTYPE}
        fi

        local_premount

        # CHANGES TO THE ORIGINAL FUNCTION BEGIN HERE
        # N.B. this code still lacks error checking

        modprobe ${FSTYPE}
        checkfs ${ROOT} root "${FSTYPE}"

        # Create directories for root and the overlay
        mkdir /lower /upper

        # Mount read-only root to /lower
        if [ "${FSTYPE}" != "unknown" ]; then
                mount -r -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /lower
        else
                mount -r ${ROOTFLAGS} ${ROOT} /lower
        fi

        modprobe overlay

        # Mount a tmpfs for the overlay in /upper
        mount -t tmpfs tmpfs /upper
        mkdir /upper/data /upper/work

        # Mount the final overlay-root in $rootmnt
        mount -t overlay \
            -olowerdir=/lower,upperdir=/upper/data,workdir=/upper/work \
            overlay ${rootmnt}
}
  • create the initramfs
update-initramfs -c -k $(uname -r)
  • include the initramfs initrd.img-4.19.66-v7+ that was just generated in /boot/config.txt
[pi3]
kernel=kernel7.img
[all]
## end of rpi-bootconfig autogenerated section. Do not modify or remove this line.

# RBH load my generated initramfs which contains the overlay module et al.
initramfs initrd.img-4.19.66-v7+

# RBH enable uart for the gpsd
enable_uart=1

# dtoverlay=w1-gpio  enable gpiopin 23 for the 1PPS from the GPS module
dtoverlay=pps-gpio,gpiopin=23

When you want to run with the overlay enabled

  • include the overlay option in /boot/cmdline.txt
 boot=overlay 

When you want to revert to non-overlay then remove the boot=overlay from /boot/cmdline.txt

  • reboot and confirm
df . -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         464M  5.2M  458M   2% /

ssh problems

Makesure your keyboard is u mapping (or as appropriate), use raspi-config to localise your machine

sudo raspi-config

Kick start ssh

sudo systemctl start ssh

Weird characters displayed when executing arrow keys then ensure your user is running the bash shell and not the default which makes back-arrow into weird chars

sudo cat /etc/passwd
pi:x:1000:1000:,,,:/home/pi:/bin/bash
messagebus:x:105:109::/var/run/dbus:/bin/false
statd:x:106:65534::/var/lib/nfs:/bin/false
sshd:x:107:65534::/run/sshd:/usr/sbin/nologin
avahi:x:108:112:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
ralph:x:1001:1001::/home/ralph:/bin/bash
piaware:x:999:996::/usr/share/piaware:
dump1090:x:109:65534::/usr/share/dump1090-fa:/bin/false

packages

claim new feeder-id

You need to claim your piaware so you can manage it through the web-interface and it also entitles you to an account to do flightaware searches. [6]

Other topics

multiple dongles

you can run multiple dongles by assigning a serial number to each dongle.

Installing LXDE

 sudo apt-get install lxde-core xserver-xorg xinit
  • then
startx

source repositories

gain problems

The gain settings for the RTL SDR has been problematic. Close aircraft tend to overload the receiver. The latest release of piaware/dump1090-fa incorporates dynamic gain control where the gain is stepped while comparing the noise floor. This sets the gain pretty much for 30 dB of dynamic range and good coverage results, but close airrcaft go missing. There is also a strong single detect gain control to treat overload - but it is not effective.

Once I determine how this step gain control is implemented, I want to look at reducing the gain right down when aircraft are detected within 2 miles of the receiver for 330 mS in an attempt to be able to watch local traffic while allowing optimal gain for long range squitters for the reamining 660 mS.

See also https://www.rtl-sdr.com/a-new-software-automatic-gain-control-algorithm-c-library-for-rtl-sdr-and-other-sdrs/

piaware objects

Json objects [7] are written periodically to the file system and are accessible vi lighttpd.

  • receiver details
http://wcac.arising.com.au/data/receiver.json
 { "version" : "10.2", "refresh" : 1000, "history" : 120, "lat" : -35.16, "lon" : 147.45 }
  • aircraft details
http://wcac.arising.com.au/data/aircraft.json
 "now" : 1763962578.8,
  "messages" : 14602175,
  "aircraft" : [
    {"hex":"7cb065","alt_baro":15200,"alt_geom":15550,"gs":143.6,"track":250.1,"baro_rate":2496,"nav_qnh":1012.8,"nav_altitude_mcp":18016,"nav_heading":239.8,"version":0,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"unknown","mlat":[],"tisb":[],"messages":9,"seen":17.8,"rssi":-18.5},
    {"hex":"76cd71","flight":"SIA222  ","alt_baro":31900,"alt_geom":33125,"gs":439.2,"ias":308,"tas":498,"mach":0.840,"track":288.3,"track_rate":0.03,"roll":0.0,"mag_heading":268.4,"baro_rate":704,"geom_rate":1056,"squawk":"1476","emergency":"none","category":"A5","nav_qnh":1013.6,"nav_altitude_mcp":32000,"nav_heading":268.6,"lat":-33.547760,"lon":149.703463,"nic":8,"rc":186,"seen_pos":6.5,"version":2,"nic_baro":1,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"mlat":[],"tisb":[],"messages":455,"seen":1.6,"rssi":-17.1},
    {"hex":"7c78ae","flight":"QLK1558 ","alt_baro":29000,"alt_geom":29925,"gs":498.4,"ias":275,"tas":424,"mach":0.716,"track":53.6,"track_rate":0.00,"roll":0.0,"mag_heading":37.1,"baro_rate":224,"geom_rate":192,"squawk":"3775","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":28992,"nav_heading":37.3,"lat":-36.637390,"lon":146.313744,"nic":8,"rc":186,"seen_pos":5.1,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"mlat":[],"tisb":[],"messages":339,"seen":5.1,"rssi":-13.6},
...
  • stats
http://wcac.arising.com.au/data/stats.json
{
"latest":{"start":1763983120.1,"end":1763983120.1,"local":{"samples_processed":0,"samples_dropped":0,"modeac":0,"modes":0,"bad":0,"unknown_icao":0,"accepted":[0,0],"strong_signals":0,"gain_db":58.6},"remote":{"modeac":0,"modes":0,"bad":0,"unknown_icao":0,"accepted":[0,0]},"cpr":{"surface":0,"airborne":0,"global_ok":0,"global_bad":0,"global_range":0,"global_speed":0,"global_skipped":0,"local_ok":0,"local_aircraft_relative":0,"local_receiver_relative":0,"local_skipped":0,"local_range":0,"local_speed":0,"filtered":0},"altitude_suppressed":0,"cpu":{"demod":0,"reader":0,"background":0},"tracks":{"all":0,"single_message":0,"unreliable":0},"messages":0,"messages_by_df":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},
"last1min":{"start":1763983060.1,"end":1763983120.1,"local":{"samples_processed":144048128,"samples_dropped":0,"modeac":0,"modes":2520608,"bad":7099198,"unknown_icao":977188,"accepted":[4584,433],"signal":-4.8,"noise":-24.4,"peak_signal":-1.2,"strong_signals":1768,"gain_db":58.6},"remote":{"modeac":0,"modes":0,"bad":0,"unknown_icao":0,"accepted":[0,0]},"cpr":{"surface":0,"airborne":1145,"global_ok":1098,"global_bad":0,"global_range":0,"global_speed":0,"global_skipped":1,"local_ok":36,"local_aircraft_relative":0,"local_receiver_relative":0,"local_skipped":11,"local_range":0,"local_speed":0,"filtered":0},"altitude_suppressed":0,"cpu":{"demod":16006,"reader":4074,"background":458},"tracks":{"all":3,"single_message":6,"unreliable":6},"messages":5017,"messages_by_df":[312,0,0,0,4,10,0,0,0,0,0,670,0,0,0,0,16,2694,1,0,574,736,0,0,0,0,0,0,0,0,0,0],"adaptive":{"gain_db":58.6,"dynamic_range_limit_db":58.6,"gain_changes":0,"loud_undecoded":0,"loud_decoded":0,"noise_dbfs":-29.1,"gain_seconds":[[58.6,60]]}},
"last5min":{"start":1763982820.1,"end":1763983120.1,"local":{"samples_processed":719978496,"samples_dropped":0,"modeac":0,"modes":12528339,"bad":35205319,"unknown_icao":4858426,"accepted":[25729,1751],"signal":-4.5,"noise":-24.3,"peak_signal":-0.8,"strong_signals":9959,"gain_db":58.6},"remote":{"modeac":0,"modes":0,"bad":0,"unknown_icao":0,"accepted":[0,0]},"cpr":{"surface":0,"airborne":6164,"global_ok":6030,"global_bad":0,"global_range":0,"global_speed":0,"global_skipped":3,"local_ok":106,"local_aircraft_relative":0,"local_receiver_relative":0,"local_skipped":28,"local_range":0,"local_speed":0,"filtered":0},"altitude_suppressed":0,"cpu":{"demod":80826,"reader":20558,"background":2247},"tracks":{"all":22,"single_message":22,"unreliable":22},"messages":27480,"messages_by_df":[1768,0,0,0,17,12,0,0,0,0,0,3564,0,0,0,0,128,14545,8,0,3363,4075,0,0,0,0,0,0,0,0,0,0],"adaptive":{"gain_db":58.6,"dynamic_range_limit_db":58.6,"gain_changes":0,"loud_undecoded":0,"loud_decoded":0,"noise_dbfs":-29.1,"gain_seconds":[[58.6,300]]}},
"last15min":{"start":1763982220.0,"end":1763983120.1,"local":{"samples_processed":2160066560,"samples_dropped":0,"modeac":0,"modes":38033882,"bad":107389804,"unknown_icao":14736452,"accepted":[85985,5923],"signal":-5.0,"noise":-24.4,"peak_signal":-0.8,"strong_signals":24869,"gain_db":58.6},"remote":{"modeac":0,"modes":0,"bad":0,"unknown_icao":0,"accepted":[0,0]},"cpr":{"surface":0,"airborne":20338,"global_ok":20011,"global_bad":1,"global_range":1,"global_speed":0,"global_skipped":18,"local_ok":273,"local_aircraft_relative":0,"local_receiver_relative":0,"local_skipped":53,"local_range":0,"local_speed":0,"filtered":0},"altitude_suppressed":0,"cpu":{"demod":243161,"reader":61484,"background":6706},"tracks":{"all":77,"single_message":68,"unreliable":68},"messages":91908,"messages_by_df":[7215,0,0,0,65,37,0,0,0,0,0,12454,0,0,0,0,705,46894,39,0,11453,13046,0,0,0,0,0,0,0,0,0,0],"adaptive":{"gain_db":58.6,"dynamic_range_limit_db":58.6,"gain_changes":0,"loud_undecoded":0,"loud_decoded":0,"noise_dbfs":-29.1,"gain_seconds":[[58.6,900]]}},
"total":{"start":1763831439.9,"end":1763983120.1,"local":{"samples_processed":364031508480,"samples_dropped":0,"modeac":0,"modes":242291902,"bad":2867914591,"unknown_icao":1810017533,"accepted":[16338515,1041148],"signal":-6.1,"noise":-25.7,"peak_signal":-0.6,"strong_signals":3434705,"gain_db":58.6},"remote":{"modeac":0,"modes":2400,"bad":0,"unknown_icao":0,"accepted":[2400,0]},"cpr":{"surface":3109,"airborne":3748496,"global_ok":3696264,"global_bad":22,"global_range":11,"global_speed":10,"global_skipped":2777,"local_ok":47898,"local_aircraft_relative":0,"local_receiver_relative":0,"local_skipped":7421,"local_range":2,"local_speed":1,"filtered":0},"altitude_suppressed":0,"cpu":{"demod":34782834,"reader":10642291,"background":1127788},"tracks":{"all":11233,"single_message":9271,"unreliable":9402},"messages":17382063,"messages_by_df":[1537793,0,0,0,68030,39439,0,0,0,0,0,2354483,0,0,0,0,100937,8972381,13076,0,2043906,2252018,0,0,0,0,0,0,0,0,0,0],"adaptive":{"gain_db":58.6,"dynamic_range_limit_db":58.6,"gain_changes":22,"loud_undecoded":0,"loud_decoded":0,"noise_dbfs":-29.1,"gain_seconds":[[49.6,39710],[58.6,111969]]}}
}

hardware

Serial UART

Wagga Wagga antenna

I purchased a 4G antenna from Jaycar (now they have several models and they all match differently) and installed it on the roof.

It was found as an experiment that this antenna performed reasonably OK when I used it as part of my portable setup, so I permanently installed it at Wagga. I have since then purchased a nanoVNA-v2-plus and been able to measure some of the characteristics. The antenna is not actually resonant at 1090MHz so next visit I should bring one that I have tinkered with to load onto frequency and see if the signal improves.

YSWG ADS-B antenna measurements with regular 4G configuration
Note that the SWR is poor.
YSWG ADS-B antenna measurements with regular 4G configuration
Note: bad gain; the antenna was lying over on the roof!

(Please note that I lost the receiver for sometime because the RTL dongle stopped working. It turns out that the RTL dongle pulled out of the USB cable because I removed the antenna!)

Parts

parts supplier image
raspberry pi 3B+ pi 3B+ - Rs Components
plug pack pi plug pack micro USB-B RS components
flightware pro plus flightware pro plus - ebay
box clear box - Jaycar
antenna 4G mobile 5dBi 4G 5dBi mobile antenna - Jaycar

The following URLs may be used to watch the feeder stats of RX that I maintain:

9267365617263685F726573706F6E73655F616374696F6E3D5265646972656374267365617263685F747970653D43415443485F414C4C5F44454641554C54267365617263685F7370656C6C5F636F72726563745F6170706C6965643D59267365617263685F77696C645F63617264696E675F6D6F64653D4E4F4E45267365617263685F6B6579776F72643D726173706265727279207069267365617263685F6B6579776F72645F6170703D726173706265727279207069267365617263685F636F6E6669673D3026&r=f&searchHistory=%7B%22enabled%22%3Atrue%7D RS online]

installation

WCAC installation
WCAC wall mounts
WCAC ant cable

bibliography

git hub

references

categories