{"id":1570,"date":"2024-08-25T23:21:09","date_gmt":"2024-08-25T21:21:09","guid":{"rendered":"https:\/\/cln.io\/blog\/?p=1570"},"modified":"2024-09-21T17:46:10","modified_gmt":"2024-09-21T15:46:10","slug":"adsb-capture-with-a-raspberry-pi-4-airspy-mini-and-home-assistant","status":"publish","type":"post","link":"https:\/\/cln.io\/blog\/adsb-capture-with-a-raspberry-pi-4-airspy-mini-and-home-assistant\/","title":{"rendered":"ADSB Capture with a Raspberry Pi 4 &#8211; AirSpy mini and home assistant"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Get portainer running<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"570\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-10-1024x570.png\" alt=\"\" class=\"wp-image-1571\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-10-1024x570.png 1024w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-10-300x167.png 300w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-10-768x428.png 768w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-10-1536x855.png 1536w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-10.png 1853w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Go to your primary environment<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go to stacks and add a stack<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"570\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-11-1024x570.png\" alt=\"\" class=\"wp-image-1572\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-11-1024x570.png 1024w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-11-300x167.png 300w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-11-768x428.png 768w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-11-1536x855.png 1536w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-11.png 1853w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Use the web editor and let&#8217;s add our service <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/sdr-enthusiasts\/airspy_adsb\">https:\/\/github.com\/sdr-enthusiasts\/airspy_adsb<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The main change I had to do was to change the volumes to work with Home Assistant Operating System<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    volumes:\n      - \/mnt\/data\/supervisor\/homeassistant\/docker_storage\/ultrafeeder\/globe_history:\/var\/globe_history\n      - \/mnt\/data\/supervisor\/homeassistant\/docker_storage\/ultrafeeder\/graphs1090:\/var\/lib\/collectd\n      - \/proc\/diskstats:\/proc\/diskstats:ro<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  airspy_adsb:\n    image: ghcr.io\/sdr-enthusiasts\/airspy_adsb:latest\n    tty: true\n    container_name: airspy_adsb\n    hostname: airspy_adsb\n    restart: always\n    device_cgroup_rules:\n      - 'c 189:* rwm'\n    environment:\n      - AIRSPY_ADSB_VERBOSE=true\n      - AIRSPY_ADSB_TIMEOUT=90\n      - AIRSPY_ADSB_FEC_BITS=1\n      - AIRSPY_ADSB_WHITELIST_THRESHOLD=5\n      - AIRSPY_ADSB_PREAMBLE_FILTER_NONCRC=8\n      - AIRSPY_ADSB_CPUTIME_TARGET=60\n      - AIRSPY_ADSB_PREAMBLE_FILTER_MAX=20\n      - AIRSPY_ADSB_MLAT_FREQ=12\n      - AIRSPY_ADSB_RF_GAIN=auto\n      - AIRSPY_ADSB_STATS=true\n    volumes:\n      - \/dev:\/dev:ro\n    tmpfs:\n      - \/run:exec,size=256M\n      - \/tmp:size=128M\n      - \/var\/log:size=32M\n\n  ultrafeeder:\n    image: ghcr.io\/sdr-enthusiasts\/docker-adsb-ultrafeeder\n    # Note - if you want to enable telegraf for use with InfluxDB\/Prometheus and Grafana,\n    # use the following image instead:\n    # image: ghcr.io\/sdr-enthusiasts\/docker-adsb-ultrafeeder:telegraf\n    tty: true\n    container_name: ultrafeeder\n    hostname: ultrafeeder\n    restart: unless-stopped\n    device_cgroup_rules:\n      - \"c 189:* rwm\"\n    ports:\n      - 8080:80 # to expose the web interface\n      # - 9273-9274:9273-9274 # to expose the statistics interface to Prometheus\n    environment:\n      # --------------------------------------------------\n      # general parameters:\n      - LOGLEVEL=error\n      - TZ=${FEEDER_TZ}\n      # --------------------------------------------------\n      # SDR related parameters:\n      ### Set readsb to net-only mode, since we're getting SDR data via BEAST from airspy_adsb\n      - READSB_NET_ONLY=true\n      # - READSB_DEVICE_TYPE=rtlsdr\n      # - READSB_RTLSDR_DEVICE=${ADSB_SDR_SERIAL}\n      # - READSB_RTLSDR_PPM=${ADSB_SDR_PPM}\n      #\n      # --------------------------------------------------\n      # readsb\/decoder parameters:\n      - READSB_LAT=${FEEDER_LAT}\n      - READSB_LON=${FEEDER_LONG}\n      - READSB_ALT=${FEEDER_ALT_M}m\n      ### Disable readsb gain, since airspy_adsb is handling that\n      # - READSB_GAIN=${ADSB_SDR_GAIN}\n      - READSB_RX_LOCATION_ACCURACY=2\n      - READSB_STATS_RANGE=true\n      #\n      # --------------------------------------------------\n      # Sources and Aggregator connections:\n      # Notes - remove the ones you are not using \/ feeding\n      ###     - \"adsb,airspy_adsb,30005,beast_in;\" is how ultrafeeder gets the BEAST feed out of airspy_adsb\n      #       - remove \"adsb,dump978,30978,uat_in;\" if you don't have dump978 and a UAT dongle connected to your station\n      #       - !!! make sure that each line ends with a semicolon \";\",  with the exception of the last line which shouldn't have a \";\" !!!\n      - ULTRAFEEDER_CONFIG=\n        adsb,airspy_adsb,30005,beast_in;\n        #adsb,dump978,30978,uat_in;\n        #adsb,feed.adsb.fi,30004,beast_reduce_plus_out;\n        #adsb,in.adsb.lol,30004,beast_reduce_plus_out;\n        #adsb,feed.airplanes.live,30004,beast_reduce_plus_out;\n        #adsb,feed.planespotters.net,30004,beast_reduce_plus_out;\n        #adsb,feed.theairtraffic.com,30004,beast_reduce_plus_out;\n        #adsb,data.avdelphi.com,24999,beast_reduce_plus_out;\n        #adsb,skyfeed.hpradar.com,30004,beast_reduce_plus_out;\n        #adsb,feed.radarplane.com,30001,beast_reduce_plus_out;\n        #adsb,dati.flyitalyadsb.com,4905,beast_reduce_plus_out;\n        #mlat,feed.adsb.fi,31090,39000;\n        #mlat,in.adsb.lol,31090,39001;\n        #mlat,feed.airplanes.live,31090,39002;\n        #mlat,mlat.planespotters.net,31090,39003;\n        #mlat,feed.theairtraffic.com,31090,39004;\n        #mlat,skyfeed.hpradar.com,31090,39005;\n        #mlat,feed.radarplane.com,31090,39006;\n        #mlat,dati.flyitalyadsb.com,30100,39007;\n        #mlathub,piaware,30105,beast_in;\n        #mlathub,rbfeeder,30105,beast_in;\n        #mlathub,radarvirtuel,30105,beast_in;\n        #mlathub,planewatch,30105,beast_in\n      # If you really want to feed ADSBExchange, you can do so by adding this above:\n      #        adsb,feed1.adsbexchange.com,30004,beast_reduce_plus_out,uuid=${ADSBX_UUID};\n      #        mlat,feed.adsbexchange.com,31090,39008,uuid=${ADSBX_UUID}\n      #\n      # --------------------------------------------------\n      - UUID=${MULTIFEEDER_UUID}\n      - MLAT_USER=${FEEDER_NAME}\n      #\n      # --------------------------------------------------\n      # TAR1090 (Map Web Page) parameters:\n      - UPDATE_TAR1090=true\n      - TAR1090_DEFAULTCENTERLAT=${FEEDER_LAT}\n      - TAR1090_DEFAULTCENTERLON=${FEEDER_LONG}\n      - TAR1090_MESSAGERATEINTITLE=true\n      - TAR1090_PAGETITLE=${FEEDER_NAME}\n      - TAR1090_PLANECOUNTINTITLE=true\n      - TAR1090_ENABLE_AC_DB=true\n      - TAR1090_FLIGHTAWARELINKS=true\n      - HEYWHATSTHAT_PANORAMA_ID=${FEEDER_HEYWHATSTHAT_ID}\n      - HEYWHATSTHAT_ALTS=${FEEDER_HEYWHATSTHAT_ALTS}\n      - TAR1090_SITESHOW=true\n      - TAR1090_RANGE_OUTLINE_COLORED_BY_ALTITUDE=true\n      - TAR1090_RANGE_OUTLINE_WIDTH=2.0\n      - TAR1090_RANGERINGSDISTANCES=50,100,150,200\n      - TAR1090_RANGERINGSCOLORS='#1A237E','#0D47A1','#42A5F5','#64B5F6'\n      - TAR1090_USEROUTEAPI=true\n      #\n      # --------------------------------------------------\n      # GRAPHS1090 (Decoder and System Status Web Page) parameters:\n      # The two 978 related parameters should only be included if you are running dump978 for UAT reception (USA only)\n      - GRAPHS1090_DARKMODE=true\n      # - ENABLE_978=yes\n      # - URL_978=http:\/\/dump978\/skyaware978\n      ### Enable Airspy graphs and grab the data via http:\/\/airspy_adsb\/stats.json\n      - ENABLE_AIRSPY=true\n      - URL_AIRSPY=http:\/\/airspy_adsb\n      #\n      # --------------------------------------------------\n      # Prometheus and InfluxDB connection parameters:\n      # (See above for the correct image tag you must use to enable this)\n      # - INFLUXDBV2_URL=${INFLUX_URL}\n      # - INFLUXDBV2_TOKEN=${INFLUX_TOKEN}\n      # - INFLUXDBV2_BUCKET=${INFLUX_BUCKET}\n      # - PROMETHEUS_ENABLE=true\n    volumes:\n      - \/mnt\/data\/supervisor\/homeassistant\/docker_storage\/ultrafeeder\/globe_history:\/var\/globe_history\n      - \/mnt\/data\/supervisor\/homeassistant\/docker_storage\/ultrafeeder\/graphs1090:\/var\/lib\/collectd\n      - \/proc\/diskstats:\/proc\/diskstats:ro\n      ### Don't map the host \/dev into the container since the SDR(s) are handled in airspy_adsb \/ dump978\n      # - \/dev:\/dev:ro\n    tmpfs:\n      - \/run:exec,size=256M\n      - \/tmp:size=128M\n      - \/var\/log:size=32M<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Adjust your env files accordingly, and check out the ultrafeeder documentation <a href=\"https:\/\/github.com\/sdr-enthusiasts\/docker-adsb-ultrafeeder\">https:\/\/github.com\/sdr-enthusiasts\/docker-adsb-ultrafeeder<\/a><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">FEEDER_TZ=Europe\/Paris\nFEEDER_LAT=\nFEEDER_LONG=\nFEEDER_ALT_M=\nMULTIFEEDER_UUID=\nFEEDER_NAME=\nFEEDER_HEYWHATSTHAT_ID=\nFEEDER_HEYWHATSTHAT_ALTS=<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"823\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-12-1024x823.png\" alt=\"\" class=\"wp-image-1573\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-12-1024x823.png 1024w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-12-300x241.png 300w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-12-768x617.png 768w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-12-1536x1234.png 1536w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-12.png 1917w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"268\" height=\"93\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-13.png\" alt=\"\" class=\"wp-image-1574\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">you can check the logs and see if your airspy is picked up<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"823\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-14-1024x823.png\" alt=\"\" class=\"wp-image-1576\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-14-1024x823.png 1024w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-14-300x241.png 300w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-14-768x617.png 768w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-14-1536x1234.png 1536w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/image-14.png 1917w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The port exposed should be 8080, so when you head over to the IP, you should start seeing your results<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"625\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/63179-1024x625.png\" alt=\"\" class=\"wp-image-1627\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/63179-1024x625.png 1024w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/63179-300x183.png 300w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/63179-768x469.png 768w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/63179-1536x938.png 1536w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2024\/08\/63179-2048x1251.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Get portainer running Go to your primary environment Go to stacks and add a stack Use the web editor and let&#8217;s add our service https:\/\/github.com\/sdr-enthusiasts\/airspy_adsb The main change I had to do was to change [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1625,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1570","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts\/1570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/comments?post=1570"}],"version-history":[{"count":2,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts\/1570\/revisions"}],"predecessor-version":[{"id":1628,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts\/1570\/revisions\/1628"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/media\/1625"}],"wp:attachment":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/media?parent=1570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/categories?post=1570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/tags?post=1570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}