FlightAware Discussions

One Pi, Two Dongles, Two Maps, Two Receivers

Normally the two dvb/dump work in isolation, as shown in diagram below (ignore pipe in the diagram as it is normally not there).

If a pipe is established as shown in block diagram below, dump1 acts additionally as merger.

Sorry NO MLAT if merged using the pipe.

2 Likes

@jlb56
It just occured to me that like dump1090, why we don’t/can’t run a 2nd instance of piaware data feeder, and configure it to get data from 2nd instance of dump1090? This will make two completely independent stations (both MLAT enabled) running on single Pi.

2 Likes

If you feed the primary(from the secondary) dump instance using a protocol that doesn’t provide timing information, it could also work.
I feed two DUMP978 instances into one dump1090.
I believe that the AVR protocol doesn’t provide timing information.

This would be useful, if say the primary was a vertical antenna(all a round reception) and the secondary was directional (A yagi or skycatcher etc). For me, pointing something away from the NYC Hudson river traffic would be useful, if I wasn’t so low and blocked towards the south and east.

2 Likes

@abcd567
I know that feeding flarm with rpi is not allowed due to proprietary flarm-protocoll or whatever, but wouldn´t this 2 sticks+one rpi guide be perfect for an adsb+flarm-feeder? One stick for 1090mhz adsb and one stick for 868mhz flarm feedding to ogn http://live.glidernet.org
This should cover the hole airtraffic… :wink:

1 Like

FLARM is encrypted:


So…

Article 6 of EU Directive 2013/40/EU[13] states that “[…] intercepting, by technical means, non-public transmissions of computer data to, from or within an information system, including electromagnetic emissions from an information system carrying such computer data, intentionally and without right, is punishable as a criminal offence […]”. “Information system” is defined in Article 2 as “a device or group of interconnected or related devices, one or more of which, pursuant to a programme, automatically processes computer data, as well as computer data stored, processed, retrieved or transmitted by that device or group of devices for the purposes of its or their operation, use, protection and maintenance”.
The Convention on Cybercrime has a similar text in its Article 3. The Convention on Cybercrime has been ratified by most signatory countries.

DUMP1090-FA

The method for dump1090-fa is different because:

  1. File /etc/init.d/dump1090-fa does not exist
  2. File /etc/default/dump1090-fa is in a different format. Further, in the Piaware image, it is over-written by piaware-config at restart of piaware or reboot of Pi.

In view of above, following method is adopted to run second Dongle with 2nd instance of dump1090-fa.

DETAILED PROCEDURE

STEP-1: Serialize Dongles

Serialize two dongles (DVB-T / ProStick), one serial number 00000000, other serial number 00000001

Stop dump1090-mutability.
Plug in one Dongle into Pi, serialize it, and put sticker of serial number.
Unplug first dongle, plugin 2nd dongle and serialize it, and put sticker of serial number.

How to Change Serial Number of Dongle - ADSB 1090 + UAT 978 Dongles Plugged Into Same Pi

STEP-2: Create 2nd instance of dump1090-fa which will use 2nd Dongle.

(1) Create a blank file /etc/init.d/dump1090-fa-2

sudo touch /etc/init.d/dump1090-fa-2

(2) Make new file executable

sudo chmod +x /etc/init.d/dump1090-fa-2   

(3) Open newly created blank file to edit

sudo nano /etc/init.d/dump1090-fa-2   

(4) Copy-paste following code in new blank file

#!/bin/sh
### BEGIN INIT INFO
# Provides:          dump1090-mutability
# Required-Start:    $remote_fs $network
# Required-Stop:     $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: dump1090 daemon (mutability variant)
# Description:       Receives ADS-B messages from a RTLSDR dongle
#                    and makes them available to other applications via
#                    a variety of network protocols.
### END INIT INFO

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="dump1090-fa-2 daemon"
NAME=dump1090-fa-2
DAEMON=/usr/bin/dump1090-fa
ARGS="--measure-noise "
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# work out daemon args

# sanitize missing settings
[ -z "$START_DUMP1090" ] && START_DUMP1090=no
[ -z "$DUMP1090_USER" ] && DUMP1090_USER="missing-DUMP1090_USER-setting-in-config"
[ -z "$RAW_INPUT_PORT" ] && RAW_INPUT_PORT=0
[ -z "$RAW_OUTPUT_PORT" ] && RAW_OUTPUT_PORT=0
[ -z "$SBS_OUTPUT_PORT" ] && SBS_OUTPUT_PORT=0
[ -z "$BEAST_INPUT_PORT" ] && BEAST_INPUT_PORT=0
[ -z "$BEAST_OUTPUT_PORT" ] && BEAST_OUTPUT_PORT=0
[ -z "$NET_BUFFER" ] && NET_BUFFER=0
[ -z "$JSON_INTERVAL" ] && JSON_INTERVAL=0
[ -z "$MAX_RANGE" ] && MAX_RANGE=300

# receiver:
NICELEVEL="--nicelevel -5"
case "x$DEVICE" in
 x|x0) ARGS="$ARGS --net" ;;
 xnone) ARGS="$ARGS --net-only"; NICELEVEL="" ;;
 *) ARGS="$ARGS --net --device-index $DEVICE" ;;
esac
case "x$GAIN" in
 x|xmax) ;;
 xagc) ARGS="$ARGS --gain -10" ;;
 *) ARGS="$ARGS --gain $GAIN" ;;
esac
if [ -n "$PPM" ]; then ARGS="$ARGS --ppm $PPM"; fi

# decoder:
if [ "x$FIX_CRC" = "xyes" ]; then ARGS="$ARGS --fix"; fi
if [ -n "$LAT" ]; then ARGS="$ARGS --lat $LAT"; fi
if [ -n "$LON" ]; then ARGS="$ARGS --lon $LON"; fi
ARGS="$ARGS --max-range $MAX_RANGE"

# net:

ARGS="$ARGS \
--net-ri-port $RAW_INPUT_PORT --net-ro-port $RAW_OUTPUT_PORT \
--net-bi-port $BEAST_INPUT_PORT --net-bo-port $BEAST_OUTPUT_PORT \
--net-sbs-port $SBS_OUTPUT_PORT"
if [ -n "$NET_HEARTBEAT" ]; then ARGS="$ARGS --net-heartbeat $NET_HEARTBEAT"; fi
if [ -n "$NET_OUTPUT_SIZE" ]; then ARGS="$ARGS --net-ro-size $NET_OUTPUT_SIZE"; fi
if [ -n "$NET_OUTPUT_INTERVAL" ]; then ARGS="$ARGS --net-ro-interval $NET_OUTPUT_INTERVAL"; fi
if [ "$NET_BUFFER" -le "65536" ]; then ARGS="$ARGS --net-buffer 0"
elif [ "$NET_BUFFER" -le "131072" ]; then ARGS="$ARGS --net-buffer 1"
elif [ "$NET_BUFFER" -le "262144" ]; then ARGS="$ARGS --net-buffer 2"
else ARGS="$ARGS --net-buffer 3"; fi
if [ -n "$NET_BIND_ADDRESS" ]; then ARGS="$ARGS --net-bind-address $NET_BIND_ADDRESS"; fi

# misc:
if [ -n "$STATS_INTERVAL" ]; then ARGS="$ARGS --stats-every $STATS_INTERVAL"; fi
if [ -n "$JSON_DIR" ]; then ARGS="$ARGS --write-json $JSON_DIR"; fi
if [ -n "$JSON_INTERVAL" ]; then ARGS="$ARGS --write-json-every $JSON_INTERVAL"; fi
case "x$JSON_LOCATION_ACCURACY" in
  xexact) ARGS="$ARGS --json-location-accuracy 2" ;;
  xapproximate) ARGS="$ARGS --json-location-accuracy 1" ;;
  *) ARGS="$ARGS --json-location-accuracy 0" ;;
esac

if [ "x$LOG_DECODED_MESSAGES" != "xyes" ]; then ARGS="$ARGS --quiet"; fi

if [ -n "$EXTRA_ARGS" ]; then ARGS="$ARGS $EXTRA_ARGS"; fi

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started

        if [ "x$START_DUMP1090" != "xyes" ]; then
            log_warning_msg "Not starting $NAME daemon, disabled via /etc/default/$NAME"
            return 2
        fi

        start-stop-daemon --start --quiet --pidfile $PIDFILE --user "$DUMP1090_USER" --exec $DAEMON --test > /dev/null \
                || return 1

        # create JSON_DIR with the appropriate permissions
        # (it is on /run by default, so will be lost on reboot)
        if [ "x$JSON_DIR" != "x" ]; then
           if [ ! -e $JSON_DIR ]; then
             (mkdir $JSON_DIR && chmod 0755 $JSON_DIR && chown $DUMP1090_USER $JSON_DIR) || log_warning_msg "Failed to create $JSON_DIR"
           fi
        fi

        # create logfile with the appropriate permissions if not already there
        touch $LOGFILE
        chown "$DUMP1090_USER":root $LOGFILE

        start-stop-daemon --start $NICELEVEL --quiet --pidfile $PIDFILE --user "$DUMP1090_USER" --chuid "$DUMP1090_USER" --make-pidfile --background --no-close --exec $DAEMON -- \
                $ARGS >>$LOGFILE 2>&1 \
                || return 2
        sleep 1
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --retry=TERM/30/KILL/5 --pidfile $PIDFILE --user "$DUMP1090_USER" --exec $DAEMON
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        sleep 1
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
        status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
        ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
        exit 3
        ;;
esac

:


.

(5) Save file (Ctrl+o) and close it (Ctrl+x)

(6) IMPORTANT : Enable Daemon dump1090-fa-2 to autostart at boot.

sudo update-rc.d dump1090-fa-2 defaults   
sudo systemctl daemon-reload    

(7) Create a new blank file /etc/default/dump1090-fa-2

sudo nano /etc/default/dump1090-fa-2

(8) Copy-paste following code into this blank file, and Save (Ctrl+o)

# dump1090-fa-2 configuration file
# This is a POSIX shell fragment.
# You can edit this file directly.

# Set to "yes" to start dump1090 on boot.
START_DUMP1090="yes"

# User to run dump1090 as.
DUMP1090_USER="dump1090"

# Logfile to log to
LOGFILE="/var/log/dump1090-fa-2.log"

#
# Receiver options
#

# RTLSDR device index or serial number to use
# If set to "none", dump1090 will be started in --net-only mode
DEVICE="1"

# RTLSDR gain in dB.
# If set to "max" the maximum supported gain is used.
# If set to "-10" (the default) the tuner AGC is used to set the gain.
GAIN="-10"

# RTLSDR frequency correction in PPM
PPM="0"

#
# Decoding options
#

# If yes, fixes messages with correctable CRC errors.
FIX_CRC="yes"

# If set, supplies a reference location for local position decoding.
LAT=""
LON=""

# If set, provides the absolute maximum receiver range used to
# filter bad position reports, and to determine when local position
# decoding is safe to use. Specify this in nautical miles (NM).
MAX_RANGE="300"

#
# Networking options
#

# Port to listen on for raw (AVR-format) input connections. 0 disables.
RAW_INPUT_PORT="31001"

# Port to listen on for raw (AVR-format) output connections. 0 disables.
RAW_OUTPUT_PORT="31002"

# Port to listen on for SBS-format output connections. 0 disables.
SBS_OUTPUT_PORT="31003"

# Port to listen on for Beast-format input connections. 0 disables.
BEAST_INPUT_PORT="31004,31104"

# Port to listen on for Beast-format output connections. 0 disables.
BEAST_OUTPUT_PORT="31005"

# TCP heartbeat interval in seconds. 0 disables.
NET_HEARTBEAT="60"

# Minimum output buffer size per write, in bytes.
NET_OUTPUT_SIZE="500"

# Maximum buffering time before writing, in seconds.
NET_OUTPUT_INTERVAL="1"

# TCP buffer size, in bytes
NET_BUFFER="262144"

# Bind ports on a particular address. If unset, binds to all interfaces.
# This defaults to binding to localhost. If you need to allow remote
# connections, change this.
#NET_BIND_ADDRESS="127.0.0.1"

#
# Misc options
#

# Interval (in seconds) between logging stats to the logfile. 0 disables.
STATS_INTERVAL="3600"

# Path to write json state to (for use with an external webserver). Blank disables.
JSON_DIR="/run/dump1090-fa-2"

# Interval between writing json state (in seconds). 0 disables.
JSON_INTERVAL="1"

# Accuracy of receiver location to write to json state, one of "exact" / "approximate" / "none"
JSON_LOCATION_ACCURACY="approximate"

# Set to yes to log all decoded messages
# This can get large fast!
LOG_DECODED_MESSAGES="no"

# Additional options that are passed to the Daemon.
EXTRA_ARGS=""
NET_BIND_ADDRESS=""

.

(9) The file /etc/default/dump1090-fa-2 is configuration file for dump1090-fa-2.
Add your required Gain, Latitude and Longitude in it in following lines:

# RTLSDR gain in dB.
# If set to "max" the maximum supported gain is used.
# If set to "-10" (the default) the tuner AGC is used to set the gain.
GAIN="-10"


# If set, supplies a reference location for local position decoding._
LAT=""
LON=""

STEP-3: Enable 2 Separate Maps for 2 Dongles.

Map 1 at < IP OF PI >/dump1090-fa/
Map 2 at < IP OF PI >/dump1090-fa-2/

(1) Make a copy of FOLDER /usr/share/dump1090-fa with name /usr/share/dump1090-fa-2. This folder contains folder html which contains all map files.

cd /usr/share    
sudo cp -r dump1090-fa dump1090-fa-2    

(2) Create new file /etc/lighttpd/conf-available/89-dump1090-fa-2.conf

sudo nano /etc/lighttpd/conf-available/89-dump1090-fa-2.conf  

(3) Copy-paste following code in the newly created blank file 89-dump1090-fa-2.conf

# Allows access to the static files that provide the dump1090 map view,
# and also to the dynamically-generated json parts that contain aircraft
# data and are periodically written by the dump1090 daemon.


alias.url += (
  "/dump1090-fa-2/data/" => "/run/dump1090-fa-2/",
  "/dump1090-fa-2/" => "/usr/share/dump1090-fa-2/html/"
)


# redirect the slash-less URL
url.redirect += (
  "^/dump1090-fa-2$" => "/dump1090-fa-2/"
)

.
(4) Save file (Ctrl+o) and close (Ctrl+x)

(5) IMPORTANT : Enable lighttpd module dump1090-fa-2

sudo lighty-enable-mod dump1090-fa-2   
sudo /etc/init.d/lighttpd force-reload   

(6) REBOOT PI

MAP-1

http:// < IP-OF-PI >/dump1090-fa/

2%20dongles%20dump-fa%20-%20map-1

MAP-2

http:// < IP-OF-PI >/dump1090-fa-2/

Very interesting. My knowledge of Linux is about nil as of right now. My dongles I have serialized them a while back. I thought about running the second (rtl-sdr.com V3) for 978 operations but in the US I dont think its available. I also thought is it possible to run ACARSDECO2 or DUMP VDL2.

Uat978 is only used in the U.S.A…
It is fairly simple to add to an RPI. Joe’s scripts make it really easy
https://www.adsbreceiver.net

So the Flarm data in FR24 and Planefinder are illegal??
Whats the difference when I have my own RPI receiving flarm?
The Flarm-guys dont get my money - thats all.
http://wiki.glidernet.org/wiki:raspberry-pi-installation

From Wikipedia, regarding FLARM’s protocol:

"The FLARM radio protocol has always been encrypted, which is reasoned by the manufacturer to ensure the integrity of the system and also because of privacy and security considerations. Version 4 used in 2008 and Version 6 used in 2015 were reverse engineered despite its encryption.[11] [12]However, FLARM changes the protocol on a regular basis to add functionality and protect security[citation needed].

The decryption of the FLARM radio protocol might be illegal, especially in EU countries. Article 6 of EU Directive 2013/40/EU[13] states that “[…] intercepting, by technical means, non-public transmissions of computer data to, from or within an information system, including electromagnetic emissions from an information system carrying such computer data, intentionally and without right, is punishable as a criminal offence […]”. “Information system” is defined in Article 2 as “a device or group of interconnected or related devices, one or more of which, pursuant to a programme, automatically processes computer data, as well as computer data stored, processed, retrieved or transmitted by that device or group of devices for the purposes of its or their operation, use, protection and maintenance”. The Convention on Cybercrime[14] has a similar text in its Article 3. The Convention on Cybercrime has been ratified by most signatory countries.[15] It is questionable, however,[citation needed] if encrypted traffic advisory data, published in agreement of the operator to be received by an undetermined number of other aviation participants, enforces cybercrime data protection claims if the data is being decrypted solely for the purpose of nearby traffic advisory by third party systems.

The radio protocol has been criticised for its proprietary encryption, including a petition encouraging a change to an open protocol[16]. It has been argued that encryption increases processing time and contradicts the goal to increase aviation safety due to a closed monopoly market, because an open protocol could enable third party manufacturers to develop compatible devices, spreading the use of interoperable traffic advisory systems. FLARM Technology opposed these claims as published on the petition page and published a white paper[17] explaining the design of the system. They offer the technology to third parties[18][19], which requires the implementation of the OEM circuit board in compatible devices. Radio protocol specifications and crypto keys are not shared to third party manufacturers.

While the FLARM serial data protocol is public, the prediction engine of FLARM is patented by Onera (France)[20] and proprietary. It is licensed to manufacturers by FLARM Technology in Switzerland."

(1) INDEPENDENT SETUP OF 2 INSTANCES OF DUMP1090

.

(2) AGGREGATED SETUP OF 2 INSTANCES OF DUMP1090

NOTE :
MLAT SHOULD BE DISABLED IF AGGREGATION IS USED
(MLAT gets confused by two receivers data in one feed, gives erroneous results, and ultimately crashes).

.

AGGREGATION METHOD (Creating Data “Pipe”):

(1) Install netcat

sudo apt-get update
sudo apt-get install netcat

.

(2) Create a file named mypipe.sh

sudo nano mypipe.sh   

.

(3) Copy-paste any one of the following two codes (Do NOT copy-paste both):

(a) For Beast format

#!/bin/sh  
while true  
  do  
    sleep 30  
    nc 127.0.0.1 31005 | nc 127.0.0.1 30004  
  done

.

(b) For AVR format

#!/bin/sh  
while true  
  do  
    sleep 30  
    nc 127.0.0.1 31002 | nc 127.0.0.1 30001  
  done

.

(4) Save file (Ctrl+o) and close (Ctrl+x)

(5) Make file executable

sudo chmod +x mypipe.sh

.

(6) Run the aggregation script mypipe.sh

./mypipe.sh & disown  
2 Likes

@obj

Is it possible to also run two INDEPENDENT instance of Piaware Data Feeder on same Pi?

.

Yes, though not out of the box. You can start two copies of piaware each with different -configfile and -cachedir command-line options, and then configure the two config files to point to different data sources. You’ll need to put together your own systemd service files to do that.

Thank you Oliver for your valuable guidance.
Will give it a try, possibly this weekend.
If successful, will end up in two totally independent stations on one RPi :slight_smile:
(1 RPi, 2 antennas, 2 dongles, 2 dump1090, 2 piaware data feeders)

1 Like

abcd567, were you able to make it work? Will you share a step by step guide similar to the one you published for dump1090-mutability? I’m a complete noob when it comes to linux, but I can follow detailed instructions.

No, I did not try to run two independent instances of piaware on same RPi.

Will sure post the step by step guide if I try to do it and succeed.

2nd piaware feed for UAT

sudo nano /lib/systemd/system/piaware2.service

Paste the following:


[Unit]
Description=FlightAware ADS-B uploader
Documentation=https://flightaware.com/adsb/piaware/
Wants=network-online.target
After=dump1090-fa.service network-online.target time-sync.target

[Service]
User=piaware
RuntimeDirectory=piaware2
ExecStart=/usr/bin/piaware -p %t/piaware2/piaware.pid -plainlog -statusfile %t/piaware2/status.json -configfile /etc/piaware2.conf -cachedir /var/cache/piaware2
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
Restart=on-failure
RestartSec=30
# exit code 4 means login failed
# exit code 6 means startup failed (bad args or missing MAC)
RestartPreventExitStatus=4 6

[Install]
WantedBy=default.target

Check the following 2 files for a configured feeder-id:

sudo nano /etc/piaware.conf
sudo nano /boot/piaware-config.txt

If in either of the above files there is a line starting with feeder-id, remove the whole line and save the file.

Copy the configuration file and create some directories:

sudo cp /etc/piaware.conf /etc/piaware2.conf
sudo mkdir /var/cache/piaware2
sudo chown piaware /var/cache/piaware2
sudo chown piaware /etc/piaware2.conf

Start piaware2:
sudo systemctl start piaware2

Enable starting on boot with
sudo systemctl enable piaware2

Wait 5 minutes.
Claim the 2nd piaware: https://flightaware.com/adsb/piaware/claim

Change piaware2 to UAT only:

sudo nano /etc/piaware2.conf

Add these line and save:

uat-receiver-type sdr  
receiver-type none   

restart to apply the changed configuration:

sudo systemctl restart piaware2

If you want to check if the service is working you can filter the journal:

sudo journalctl -u piaware2 -f

This will give you a live display of what it’s doing. (handy in a 2nd window while testing)

2 Likes

:+1: :+1: :+1: Well done @wiedehopf. Thanks

Tested on Piaware SD Card img, 2nd instance of piaware is working good :slight_smile:

FIRST INSTANCE: https://flightaware.com/adsb/stats/user/abcd567#stats-5252

SECOND INSTANCE: https://flightaware.com/adsb/stats/user/abcd567#stats-76000

.

SIDE NOTE:

-configfile /etc/piaware2.conf -cachedir /var/cache/piaware2

Above piece of code reminds me of fr24feed-1.service & fr24feed-2.service files I created for running TWO instances of fr24feed :slight_smile:

ExecStartPre=/bin/mkdir -p /var/log/fr24-1
ExecStartPre=/bin/chown fr24 /var/log/fr24-1
ExecStart=/usr/bin/fr24feed  --config-file=/etc/fr24feed-1.ini  

.

ExecStartPre=/bin/mkdir -p /var/log/fr24-2
ExecStartPre=/bin/chown fr24 /var/log/fr24-2
ExecStart=/usr/bin/fr24feed  --config-file=/etc/fr24feed-2.ini  

.

Encouraging progress! If you think this is a stable solution, please publish a quick-start guide for users running 3.7.1 with 1090 & 978 on a single feed-id who want to migrate to two feed-id’s.

I’d like to give it a try this weekend if possible.

The guide is already published by @wiedehopf in this post above. I have created second instance of piaware using this guide.