Airspy ADS-B decoder

Try airspy.us
They had them on special yesterday.

1 Like

Is it that beneficial to use an airspy for dump978-fa?
I’d say you might be better off with an uputronics 978 amp and an normal rlt-sdr dongle.

I seriously doubt it. Overkill in my opinion and a waste of a good radio, but regardless, I think the goal was to see if the Pi4 is capable of handling more than just a single Airspy hung off a port - whether it be another Airspy (anything > 12Msps is probably a waste for UAT), or a cheap rtl-sdr.

So far as myself, I do much more outside of ADSB, so a couple more solid radios to work with would be a good problem to have :slight_smile:

@jonhawkes2030 - I keep an eye out all the time on airspy.us, and I think the R2 have been up for $169 for some time now ($99 for the mini). Waiting for those to come down or find some used since that’s steep for their age and support level. Can get the HF discovery+ for the same price -granted for different use, but it’s just my angle I guess - for right or wrong. I still think they make great radios that seemingly fills the huge gap between hobby and professional.

2 Likes

This does appear to be how the Pi 4 is set up.

Here’s what lsusb -t looks like on a Pi 4 with no external devices connected:

/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M

Empirically:

  • USB3 devices in a USB3 port use bus 02 @ 5Gbps:
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
    |__ Port 2: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
  • USB2 devices in either port type, and USB3 devices in USB2 ports, use the child hub on bus 01 @ 480Mbps
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 7, If 0, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 1: Dev 7, If 1, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 3: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, 480M
  • bus 03 is unused for external devices (I think that’s the SoC bus)

So if you have multiple USB2 devices (even in the USB3 ports) they do appear to share the 480M bandwidth available to bus 01.

It’s not going to benefit from an increased sample rate, the dump978-fa demodulator is hardwired for 2.08333MHz.

I have some prototype work for a higher rate demodulator around (probably at 6.mumble MHz for 6 samples/bit) but it’s relatively low priority currently.

2 Likes

Set up is here
https://xavierberger.github.io/RPi-Monitor-docs/11_installation.html

After that is setup, you can install and configure the avionics template.
(Sample one in German)

I believe I got my base template from
https://www.jeremybrown.co.nz/monitorADSB.php

but that site doesn’t seem to work anymore.
There used to be a tutorial in some forum post on some flight tracking site, but can’t find it now. :wink:

Template goes here
/etc/rpimonitor/template/avionics.conf

rpimonitor has an interactive mode, which helps make it easy to test commands and regexes to get the values you want to monitor. See
https://xavierberger.github.io/RPi-Monitor-docs/23_configuration_helper.html

If you want to crib off my template, feel free, its very hacky, due to many of these feeder bits all behaving differently, like for getting the version.
You’ll have to change local IPs to those of your pi(s), and likely mess with other things like URLs to your feeders on the various sites, update feedIDs, etc.

 $ cat /etc/rpimonitor/template/avionics.conf
########################################################################
# Extract information about Opened Port
#  Page: 1
#  Information               Status
#  - dump1090-fa port (8080)           - yes      - no
#  - Flightradar24 Feeder/Decoder port (8754)  - yes      - no
#  - FlightAware port (30104)          - yes      - no
#  - PlaneFinder port (30053)        - yes      - no
#  - Virtual Radar Server port (8081) - yes - no
#  - ModeSMixer2 port (8787) - yes - no
#  - lighttpd port (80) - yes - no
#  - collectd status - active - inactive|failed|activating|deactivating
#  - dump978-fa port (30978) -yes -no
#  - RadarBox status - active - inactive|failed|activating|deactivating
########################################################################
dynamic.1.name=dump1090
dynamic.1.source=netstat -nlt
dynamic.1.regexp=tcp .*:(8080).*LISTEN

dynamic.2.name=fr24
dynamic.2.source=netstat -nlt
dynamic.2.regexp=tcp .*:(8754).*LISTEN

dynamic.3.name=piware
dynamic.3.source=netstat -nlt
dynamic.3.regexp=tcp .*:(30104).*LISTEN

dynamic.4.name=finder
dynamic.4.source=netstat -nlt
dynamic.4.regexp=tcp .*:(30053).*LISTEN

dynamic.5.name=vrs
dynamic.5.source=netstat -nlt
dynamic.5.regexp=tcp .*:(8081).*LISTEN

dynamic.6.name=modesmixer2
dynamic.6.source=netstat -nlt
dynamic.6.regexp=tcp .*:(8787).*LISTEN

dynamic.7.name=lighttpd
dynamic.7.source=netstat -nlt
dynamic.7.regexp=tcp .*:(80).*LISTEN

dynamic.8.name=collectd
dynamic.8.source=service collectd status
dynamic.8.regexp=Active: (.*) \(

dynamic.9.name=dump978
dynamic.9.source=netstat -nlt
dynamic.9.regexp=tcp .*:(30978).*LISTEN

dynamic.10.name=rbfeeder
dynamic.10.source=service rbfeeder status
dynamic.10.regexp=Active: (.*) \(

dynamic.11.name=adsbexchange
dynamic.11.source=ps awwux | grep socat | grep -v grep | grep feed
dynamic.11.regexp=feed.adsbexchange.com:(.*)

dynamic.12.name=opensky
dynamic.12.source=service opensky-feeder status
dynamic.12.regexp=Active: (.*) \(

static.1.name=dump1090ver
static.1.source=dump1090-fa --help
static.1.regexp=dump1090-fa (.*\b)

static.2.name=fr24ver
static.2.source=fr24feed --help
static.2.regexp=Version: (.*)/

static.3.name=piwarever
static.3.source=piaware -v
static.3.regexp=(^.*)

static.4.name=finderver
static.4.source=pfclient -v
static.4.regexp=version:(.*)

static.5.name=modesmixer2ver
static.5.source=/home/pi/mm2/modesmixer2 --help
static.5.regexp=ModeSMixer2 v\.(.*)

static.6.name=lighttpdver
static.6.source=lighttpd -v
static.6.regexp=lighttpd/(.*) \(

static.7.name=collectdver
static.7.source=collectd -h
static.7.regexp=collectd(.*)\.git\,

static.8.name=dump978ver
static.8.source=dump978-fa --version 2>&1 | grep dump | awk '{print $2}'
static.8.regexp=(.*)

static.9.name=rbfeederver
static.9.source=/usr/bin/rbfeeder --help 2>&1 | grep "Version " | awk '{print $4}'
static.9.regexp=(.*)

static.10.name=openskyver
static.10.source=journalctl -u opensky-feeder --no-pager
static.10.regexp=Version (.*)

web.status.1.content.1.name=Avionics
web.status.1.content.1.icon=daemons.png
web.status.1.content.1.line.1="<table class='table'><thead><tr><th>Application</th><th>Status</th><th>Version</th><th>Web interface</th></tr></thead><tbody>"
web.status.1.content.1.line.2="<tr>"
web.status.1.content.1.line.3="<td><a href='https://github.com/flightaware/dump1090' target=_blank>dump1090-fa</a></td><td>" + Label(data.dump1090,"==8080","active","success") + Label(data.dump1090,"!=8080","inactive","danger") + "</td><td>" + data.dump1090ver + "</td><td><a href='http://127.0.0.1:8080/' target=_blank>DUMP1090</a></td>"
web.status.1.content.1.line.4="</tr>"
web.status.1.content.1.line.5="<tr>"
web.status.1.content.1.line.6="<td><a href='http://feed.flightradar24.com/#raspberry-pi' target=_blank>fr24feed</a></td><td>" + Label(data.fr24,"==8754","active","success") + Label(data.fr24,"!=8754","inactive","danger") + "</td><td>" + data.fr24ver + "</td><td><a href='http://127.0.0.1:8754' target=_blank>FR24 Feeder Status</a><br /><a href='https://www.flightradar24.com/premium/' target=_blank>Flightradar24.com Premium</a></td>"
web.status.1.content.1.line.7="</tr>"
web.status.1.content.1.line.8="<tr>"
web.status.1.content.1.line.9="<td><a href='http://ja.flightaware.com/adsb/piaware/' target=_blank>piaware</a></td><td>" + Label(data.piware,"==30104","active","success") + Label(data.piware,"!=30104","inactive","danger") + "</td><td>" + data.piwarever + "</td><td><a href='https://flightaware.com/adsb/stats/user/you' target=_blank>FlightAware</a></td>"
web.status.1.content.1.line.10="</tr>"
web.status.1.content.1.line.11="<tr>"
web.status.1.content.1.line.12="<td><a href='https://planefinder.net/sharing/client' target=_blank>pfclient</a></td><td>" + Label(data.finder,"==30053","active","success") + Label(data.finder,"!=30053","inactive","danger") + "</td><td>" + data.finderver + "</td><td><a href='http://127.0.0.1:30053' target=_blank>Plane Finder Client</a></td>"
web.status.1.content.1.line.13="</tr>"
web.status.1.content.1.line.14="<tr>"
web.status.1.content.1.line.15="<td><a href='http://www.virtualradarserver.co.uk/Download.aspx' target=_blank>VirtualRadar</a></td><td>" + Label(data.vrs,"==8082","active","success") + Label(data.vrs,"!=8082","inactive","danger") + "</td><td>2.4<br />31-JUL-2016</td><td><a href='http://127.0.0.1:8082/VirtualRadar/WebAdmin/Index.html' target=_blank>VRS Web Admin</a><br /><a href='http://127.0.0.1:8082/VirtualRadar' target=_blank>Virtual Radar Server</a><br /><a href='http://www.adsbexchange.com/' target=_blank>ADS-B Exchange</a></td>"
web.status.1.content.1.line.16="</tr>"
web.status.1.content.1.line.17="<tr>"
web.status.1.content.1.line.18="<td><a href='http://xdeco.org/?page_id=30#mm2' target=_blank>modesmixer2</a></td><td>" + Label(data.modesmixer2,"==8787","active","success") + Label(data.modesmixer2,"!=8787","inactive","danger") + "</td><td>" + data.modesmixer2ver + "</td><td><a href='http://127.0.0.1:8787' target=_blank>ModeSMixer2</a><br /></td>"
web.status.1.content.1.line.19="</tr>"
web.status.1.content.1.line.20="<tr>"
web.status.1.content.1.line.21="<td>lighttpd</td><td>" + Label(data.lighttpd,"==80","active","success") + Label(data.lighttpd,"!=80","inactive","danger") + "</td><td>" + data.lighttpdver + "</td><td><a href='http://127.0.0.1:8080/3d/' target=_blank>MyRadar24</a></td>"
web.status.1.content.1.line.22="</tr>"
web.status.1.content.1.line.23="<tr>"
web.status.1.content.1.line.24="<td>collectd</td><td>" + Label(data.collectd,"=='active'","active","success") + Label(data.collectd,"!='active'","inactive","danger") + "</td><td>" + data.collectdver + "</td><td><a href='127.0.0.1/collectd/' target=_blank>dump1090-tools</a></td>"
web.status.1.content.1.line.25="</tr>"
web.status.1.content.1.line.26="<tr>"
web.status.1.content.1.line.27="<td><a href='https://github.com/flightaware/dump978' target=_blank>dump978-fa</a></td><td>" + Label(data.dump978,"==30978","active","success") + Label(data.dump978,"!=30978","inactive","danger") + "</td><td>" + data.dump978ver + "</td><td><a href='http://127.0.0.1/skyaware978' target=_blank>dump978-fa</a></td>"
web.status.1.content.1.line.28="</tr>"
web.status.1.content.1.line.29="<tr>"
web.status.1.content.1.line.30="<td><a href='https://www.radarbox24.com/raspberry-pi/guide' target=_blank>RadarBox</a></td><td>" + Label(data.rbfeeder,"=='active'","active","success") + Label(data.rbfeeder,"!='active'","inactive","danger") + "</td><td>" + data.rbfeederver + "</td><td><a href='https://www.radarbox24.com/stations/EXTRPI00000' target=_blank>RadarBox</a></td>"
web.status.1.content.1.line.31="</tr>"
web.status.1.content.1.line.32="<tr>"
web.status.1.content.1.line.33="<td><a href='https://www.adsbexchange.com/active-feeds/' target=_blank>ADSBExchange</a></td><td>" + Label(data.adsbexchange,"==30005","active","success") + Label(data.adsbexchange,"!=30005","inactive","danger") + "</td><td>N/A</td><td><a href='http://www.adsbexchange.com/coverage-1D/?new' target=_blank>ADSBExchangeFeeder</a></td>"
web.status.1.content.1.line.34="</tr>"
web.status.1.content.1.line.35="<tr>"
web.status.1.content.1.line.36="<td><a href='https://opensky-network.org' target=_blank>OpenSkyNetwork</a></td><td>" + Label(data.opensky,"=='active'","active","success") + Label(data.opensky,"!='active'","inactive","danger") + "</td><td>" + data.openskyver + "</td><td><a href='https://opensky-network.org/receiver-profile?s=00000' target=_blank>OpenSkyFeeder</a></td>"
web.status.1.content.1.line.37="</tr>"
web.status.1.content.1.line.38="</tbody></table>"

then you edit

/etc/rpimonitor/data.conf

and add the avionics.conf template

include=/etc/rpimonitor/template/avionics.conf

Restart rpimonitor and collectd

sudo systemctl stop collectd rpimonitor
sudo systemctl start collectd rpimonitor
2 Likes

This does look to be the case from experimenting.
Plug in another dongle and start receiving data, or an old crappy usb thumb drive and start copying stuff, and then try the airspy and there isn’t enough bandwidth to sustain 20 MSPS.
So if you run an airspy, don’t use usb for anything else.
Sucks.

I’d love to get airspy_adsb compiled for my Mac mini, which has tons of bandwidth.
I be happy to do that for the airspy folks.

@mikkyo - Thanks a ton for the silver spoon, I’ll use wisely :slight_smile:

I also just did a little preliminary test by plugging a GPS unit in along with the mini running 20 MSPS and it spooked mlat as well… Will need to test more.

A couple years ago I saw much of the same problem when I booted and ran a Pi3 off a mini usb stick (no sdcard at all), I could never get MLAT to sync when using a flightstick even. Drive IO was almost non-existent since I always run log2ram. Go figure that one… That couldn’t have been a bandwidth issue, and I know it for sure wasn’t a power issue because the same would happen when running through a powered USB hub. MLAT must be terribly sensitive to any sort of buffering/interrupts due to it’s timestamp requirement. Wonder if it could be loosened up without bringing down the entire house of cards? Albeit, I have an FA Orange (978) and an FA Blue (1090) running through a powered USB hub on my test setup on a Pi3 and it has zero issues with MLAT, so not every device plays mean…

Grasping at straws still evidently.

It’s sensitive specifically to message loss, because all the timing relies on seeing samples at a fixed rate; if any data is dropped then that looks like the clock jumped. It is very sensitive and there’s not really any flexibility there - when a jump like this happens the mlat server has to resynchronize the receiver all over again. Keep in mind that dropping only one sample is effectively about a 100 metre error for mlat, and more typically it’ll drop anywhere between 64 and 64k samples at a go…

AFAIK there’s no mechanism in the rtlsdr hardware to do retransmission of any data that gets lost on the USB bus (so it’s sensitive to bus noise, bad cables etc), and I’d guess that there’s very limited send-side buffers so if the USB bus is monopolized by another device for more than a short time then data will get dropped that way too.

Oh and if you want to add the throttling info to the cpu graph:

########################################################################
# Extract CPU information
#  Page: 1
#  Information               Status     Statistics
#  - cpu frequency           - yes      - no
#  - cpu voltage             - yes      - no
#  - cpu load 1, 5, 15       - yes      - yes
#  - cpu scaling governor    - yes      - no
########################################################################
dynamic.1.name=cpu_frequency
dynamic.1.source=/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
dynamic.1.regexp=(.*)
dynamic.1.postprocess=$1/1000
dynamic.1.rrd=

dynamic.2.name=cpu_voltage
dynamic.2.source=vcgencmd measure_volts core
dynamic.2.regexp=(\d+.\d+)V
dynamic.2.postprocess=
dynamic.2.rrd=

dynamic.3.name=load1,load5,load15
dynamic.3.source=/proc/loadavg
dynamic.3.regexp=^(\S+)\s(\S+)\s(\S+)
dynamic.3.postprocess=
dynamic.3.rrd=GAUGE

dynamic.4.name=scaling_governor
dynamic.4.source=/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
dynamic.4.regexp=(.*)
dynamic.4.postprocess=
dynamic.4.rrd=

dynamic.26.name=undervolted
dynamic.26.source=vcgencmd get_throttled
dynamic.26.regexp=throttled=(.*)
dynamic.26.postprocess=$1&0x1
dynamic.26.rrd=

dynamic.27.name=capped
dynamic.27.source=vcgencmd get_throttled
dynamic.27.regexp=throttled=(.*)
dynamic.27.postprocess=$1&0x2
dynamic.27.rrd=

dynamic.28.name=throttled
dynamic.28.source=vcgencmd get_throttled
dynamic.28.regexp=throttled=(.*)
dynamic.28.postprocess=$1&0x4
dynamic.28.rrd=

dynamic.29.name=hasundervolted
dynamic.29.source=vcgencmd get_throttled
dynamic.29.regexp=throttled=(.*)
dynamic.29.postprocess=$1&0x10000
dynamic.29.rrd=

dynamic.30.name=hascapped
dynamic.30.source=vcgencmd get_throttled
dynamic.30.regexp=throttled=(.*)
dynamic.30.postprocess=$1&0x20000
dynamic.30.rrd=

dynamic.31.name=hasthrottled
dynamic.31.source=vcgencmd get_throttled
dynamic.31.regexp=throttled=(.*)
dynamic.31.postprocess=$1&0x40000
dynamic.31.rrd=

static.9.name=max_proc
static.9.source=nproc
static.9.regexp=(.*)
static.9.postprocess=$1 + 1

web.status.1.content.1.name=CPU
web.status.1.content.1.icon=cpu.png
#web.status.1.content.1.line.1="Loads: <b>" + data.load1 + "</b> [1min] - <b>" + data.load5 + "</b> [5min] - <b>" + data.load15 + "</b> [15min]"
web.status.1.content.1.line.1=JustGageBar("Load", "1min", 0, data.load1, data.max_proc, 100, 80)+" "+JustGageBar("Load", "5min", 0, data.load5, data.max_proc, 100, 80)+" "+JustGageBar("Load", "15min", 0, data.load15, data.max_proc, 100, 80)
web.status.1.content.1.line.2="CPU frequency: <b>" + data.cpu_frequency + "MHz</b> Voltage: <b>" + data.cpu_voltage + "V</b>"
web.status.1.content.1.line.3="Scaling governor: <b>" + data.scaling_governor + "</b>"
web.status.1.content.1.line.4="<table class='table'><thead><tr><th>Power</th><th>Current Status</th><th>Previous Status</tr></thead><tbody>"
web.status.1.content.1.line.5="<tr>"
web.status.1.content.1.line.6="<td>Under Voltage:</td><td>" + Label(data.undervolted,"==0","no","success") + Label(data.undervolted,"!=0","yes","danger")+ "</td><td>" + Label(data.hasundervolted,"==0","no","success") + Label(data.hasundervolted,"!=0","yes","danger")+ "</td>"
web.status.1.content.1.line.7="</tr>"
web.status.1.content.1.line.8="<tr>"
web.status.1.content.1.line.9="<td>Throttled:</td><td>" + Label(data.throttled,"==0","no","success") + Label(data.throttled,"!=0","yes","danger")+ "</td><td>" + Label(data.hasthrottled,"==0","no","success") + Label(data.hasthrottled,"!=0","yes","danger")+ "</td>"
web.status.1.content.1.line.10="</tr>"
web.status.1.content.1.line.11="<tr>"
web.status.1.content.1.line.12="<td>Frequency Capped:</td><td>" + Label(data.capped,"==0","no","success") + Label(data.capped,"!=0","yes","danger")+ "</td><td>" + Label(data.hascapped,"==0","no","success") + Label(data.hascapped,"!=0","yes","danger")+ "</td>"
web.status.1.content.1.line.13="</tr>"
web.status.1.content.1.line.14="</tbody></table>"
#web.status.1.content.1.line.4=InsertHTML("/addons/top3/top3.html")

web.statistics.1.content.1.name=CPU Loads
web.statistics.1.content.1.graph.1=load1
web.statistics.1.content.1.graph.2=load5
web.statistics.1.content.1.graph.3=load15
web.statistics.1.content.1.ds_graph_options.load1.label=Load 1min
web.statistics.1.content.1.ds_graph_options.load5.label=Load 5min
web.statistics.1.content.1.ds_graph_options.load15.label=Load 15min
1 Like

That’s awesome!..

Along the USB lines, I agree that the bus seems to be shared,
When I added a dongle for UAT978 to my RPI4 I lost some airspy traffic. I think I removed bit packing for some reason at the same time. I just re-enabled bit packing and the airspy is back to 1800 msg/sec(from 1600msg/sec).

My UAT messages are also up. They fluctuate so much and there hasn’t been enough time to see if this is real or not.

I did a similar test on an Odroid XU4 (I assume it will be similar in the N2). It looks like there are two buses (one of the front and one on the back).
I just pluged three different USB devices into the ports.
The U-Blox AG is a cheap USB dongle.

jonha@odroid:~$ lsusb
Bus 006 Device 002: ID 0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 002: ID 05e3:0616 Genesys Logic, Inc. hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
**Bus 003 Device 006: ID 1d50:60a1 OpenMoko, Inc. Airspy**
**Bus 003 Device 007: ID 1546:01a7 U-Blox AG [u-blox 7]**
Bus 003 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
**Bus 001 Device 003: ID 0bda:2832 Realtek Semiconductor Corp. RTL2832U DVB-T**
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
jonha@odroid:~$ lsusb -t
/:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
    |__ Port 1: Dev 2, If 0, Class=Vendor Specific Class, Driver=r8152, 5000M
/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/2p, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/2p, 480M
        **|__ Port 1: Dev 7, If 0, Class=Communications, Driver=cdc_acm, 12M**
**        |__ Port 1: Dev 7, If 1, Class=CDC Data, Driver=cdc_acm, 12M**
        **|__ Port 2: Dev 6, If 0, Class=Vendor Specific Class, Driver=usbfs, 480M**
Bus 02.Port 1: Dev 1, Class=root_hub, Driver=exynos-ohci/3p, 12M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=exynos-ehci/3p, 480M
    **|__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=usbfs, 480M**
jonha@odroid:~$

Use dump978-fa on the the Mac Mini, it’s open source so you can compile it on there.

Have you tried running the Aispy as the only USB device with the RPi4 since then?

@mikkyo - It’s a beautiful thing, thanks again!

Just so this isn’t a complete hijack: addition for airspy info:

dynamic.13.name=airspy
dynamic.13.source=service airspy_adsb status
dynamic.13.regexp=Active: (.*) \(
...
static.11.name=airspyver
static.11.source=/usr/local/bin/airspy_adsb -h 2>&1 | grep "airspy_adsb" | awk '{print $2}'
static.11.regexp=(.*)
...
web.status.1.content.1.line.38="<td><a href='https://airspy.com' target=_blank>airspy_adsb</a></td><td>" + Label(data.airspy,"=='active'","active","success") + Label(data.airspy,"!='active'","inactive","danger") + "</td><td>" + data.airspyver + "</td><td><a href='http://127.0.0.1/al/' target=_blank>Dump1090-fa/al/</a></td>"
web.status.1.content.1.line.39="</tr>"

I currently have it linked to Al’s overlay, but that can be changed to suit needs.

Back on track, total change of subject:
@prog - Is decimation a thing of the past in airspy_adsb?

1 Like

It’s no longer used with the new algo (since a year or so).

1 Like

Thanks for it !
On my Pi4 for the version number to work, I had to remove the \ before $2 on this line :

static.11.source=/usr/local/bin/airspy_adsb -h 2>&1 | grep "airspy_adsb" | awk '{print \$2}'

But status keep always inactive in red color. Do you have an idea ?

Sans-titre-1

Thanks.

Looking more closely at the avionics.conf, it seems that it misses the part “dynamic” in the code that you gave, can you tell me what you put as value in your conf file ?

Thanks !

Ooops! I forgot to tear that escape out. I have that as part of my script inside a tee function and strings need to be escaped or they disappear. Be sure to double-check the absolute path on your airspy_adsb install (yours is fine as it picked up the version). AND I forgot the dynamic code like a dumdum. I fixed it in the above post so it doesn’t catch anyone else. Thx for the head’s-up!

1 Like

Thanks it works perfectly now !

Sans-titre-1

Loaded the new version and my stats are up quite nicely.
Keeping me ahead of the other local feeders, where we were usually neck and neck.

2 Likes