7accctrl - fernbedienbare Zubehör- und Antennensteuerung

7acctrl ist ein Programm für die lokale oder fernbedienbare Steuerung von Antenneumschaltern und Stationszubehör. Es läuft auf einem Raspberry PI.

Die Schaltfunktionen können durch selbst definierte Ausdrücke den eigenen Anforderungen angepasst werden.

Als Eingabewerte stehen selbstdefinerte Schalter, die über die WEB-Oberfläche umgeschaltet werden können und Parameter der angeschlossenen Funkgeräte zur Verfügung.

Von den Funkgeräten kann die aktuelle Frequenz per rigctld und der PTT-Status per GPIO-Eingabe in den Ausdrücken für die Steuerung der Ausgänge verwendet werden.

Die Anwendungsfälle sind durch die freie Definition der Bedinungen für das Schalten der Relaus vielfältig und reichen von automatischer bandabhängiger Antennenumschaltung über die Möglichkeit zum Einschalten von Transverten oder der Aktivierung von Endstufen bis zum Schutz der Transceivereingängen bei Verwendung von mehreren Transceivern in der Station.

Konfiguration

Die Konfiguration erfolgt über eine hinterlegte Konfiguratiosndatei im JSON-Format mit den Abschnitten:

    {"global": {},
     "switches: {},
     "transceiver": {},
     "symbols": [],
     "relais": {}
    }

Im Abschnitt general werden die Basiskonfiguration eingestellt.

    {"inverted_relais" : true,
     "bindhost": "localhost",
     "bindport": 8000
    }

Der Abschnitt switches definiert die Schalter die zur Steuerung in der Weboberfläche angezeigt werden und die in den Ausdrücken verwendet werden können.

   {
     "id": "swpa01",
     "name": "SW PA",
     "default": false},
   }

Im Abschnitt transceiver werden die angeschlossenen Funkgeräte definiert

    {"ic705":
        {"name": "IC-705",
         "rigctld": "localhost:4532",
         "pttgpio": 17}
    }

In diesem dictionary ist der Schlüssel die ID des transceivers. Aus dieser ID bilden sich die variablen f_<id> für die aktuelle Frequenz des Funkgeräts und PTT_<id> für den PTT-Status. Zusätzlich wird mit band_<id> eine Bandbezeichnung wie 20m oder 70cm zur Verfügung gestellt wenn sich die Frequenz innerhalb eines Amateurfunkbandes befindet.

Der Abschnitt symbols dient zur Definition von Variablen, die in den Ausdrücken für die Relais verwendet werden können. Damit lassen sich gemeinsam benutze Bedingungen für ein Relais zusammenfassen. Die Syntax für die Symbole ist dort beschrieben. Der Namen eines Symbols darf nicht der Name eines Schalters oder einer der Namen für die Frequenz oder des PTT-Status eines Funkgeräts entsprechen.

 [{"name":"lowbandrx",
   "expression": "swrxlowband and f_ic705 <3.8e6 and not PTT_ic705"
  },
  {"name": "trans23",
   "expression": "f_ic705 >=144e6 and f_ic705 <148e6 and sw23cm"
  }
 ]

Symbols sind eine Liste von Dictionaries mit den Schlüsseln:

In expression dürfen nur die Variablen für Frequenz, Band, die Schalter, wie hier im Beispiel swrxlowband, und vorher definierte Symbole verwendet werden. Als Operatoren sind nur <, <=, >, >=, ==, or, and, not erlaubt. Dazu kommen noch Klammern und konstante Werte wie die Frequenzangaben.

Mit dem Abschnitt relais werden die Ausgaberelais definiert.

  {
    "0":
        {"name": "SW BX1200 tuner",
         "expression": "f_ic705 < 30e6 and not lowbandrx",
         "delayon":0,
         "delayoff": 0},
    "1": {}

Jedes Relais ist mit einer als String definierten Nummer als Schlüssel versehen. In der Software sind für das Relaisboard "RPI RELAIS 8CH" von Reichelt die GPIO-Ports hinterlegt. Die Relais müssen von 0 an als ganzahlige Zahlen definiert werden.

Die Standardports für das angegene Relaisboard sind:

    def_ports = {0: 5,
                 1: 6,
                 2: 13, 
                 3: 16,
                 4: 19,
                 5: 20,
                 6: 21,
                 7: 26}

Beim Einsatz eines anderen Boards oder dem direkten Anschluss von Umschaltern über eigene Treiber muss mit gpioport der zum Relais passende Port definiert werden.

Folgende Konfigurationswerte sind für jedes Relais möglich: * gpioport: Optional der GPIO Port für das Relais * name: Der in der Weboberfläche angezeigte Name des Relais * delayon ist die Einschaltvezögerung in Sekunden als Float-Zahl * delayoff ist die Auschaltverzögerung in Sekunden als Float-Zahl * expression ist die Bedingung wann das Relais schaltet. Es gelten hier die Regeln wie bei Symbolen. Hier könnnen die Symbol-, Funkgerät- und Schaltervariablen verwendet werden.

Ablauf

Das Pogramm überwacht die PTT-Eingänge mit der Python-Funktion GPIO.add_event_detect sowie die weiteren Eingabewerte. Die Frequenz der Transceiver wird durch regelmäßiges Abfragen über die hamblib ermittelt. Bei einer Änderung oder der Umschaltung eines Schalters im WEB-Interface erfolgt eine Neueberechnung aller Relaisausgänge. Für alle Relais deren Status sich geändert hat, werden zuerst die Relais ausgeschaltet, die vorher angeschaltet waren. Danach werden die Relais, die vorher ausgeschaltet waren angeschaltet. Das Anschalten erfolgt in Reihenfolge der Relaisnummern. Dieses ermöglicht einen Sequencer indem z.B. ein Antennenrelais vor der Freigabe der PTT für eine PA definiert wird. Damit es bei der Erkennung des PTT-Status nicht zu einer Verzögerung kommt, ist der Weg über den GPIO-Port gewählt worden, obwohl auch die hamlib hier eine Abfrage ermöglicht hätte.

Installation

Das Programm basiert auf rigctld aus dem Packet hamblib. Die hamlib muss installiert und für jedes Funkgerät muss ein rigtctld Prozess mit den passenden Parametern gestartet werden.

Zu Installation sollte die Datei 7bbpacctrl.<version>.tgz mit tar -xzvf <Dateiname> in ein Verzeichnis entpackt werden.

Das in Python3 geschrieben Programm basiert auf den Python-Paketen waitress, morepath und more.chameleon.

Waitress kann mit sudo apt-get install python3-waitress installiert werden. Morepath und more.chameleon stehen nicht in der Standarddistribution bei debian oder ubuntu zur Verfügung. Sie müssen daher mit sudo pip3 install morepath und sudo pip3 install more.chameleon installiert werden. Wer diese Module nicht global installieren möchte, kann sie in ein virtuelles Environment installieren.

Um das Programm im Suchpfad zu haben empfehle ich einen symbolischen Link von /usr/bin/7accctrl auf das die Datei 7accctrl.py im Installationsverzeichnis zeigt. Dieses erfolgt mit sudo ln -s <Pfad zu 7accctrl.py> /usr/bin/7accctrl

Starten des Programm

Der Start erfolgt über den Aufruf von 7accctrl in der Kommandozeile Mit dem Parameter -h gibt es eine Übersicht über die Kommandozeilenparameter

usage: 7accctrl.py [-h] [--port PORT] [--hostbind HOSTBIND] [--config CONFIG]
                   [--verbose {0,1,2,3,4,5}]

7accctrl version: 0.9d

optional arguments:
  -h, --help            show this help message and exit
  --port PORT           Web service listen port default: 8000)
  --hostbind HOSTBIND   Web service local bind address default:localhost
  --config CONFIG       configfile for relais configuration
  --verbose {0,1,2,3,4,5}
                        print some logging 5 = max

Die Konfiguration wird ohne Angabe einer einer Datei mit --config aus dem Verzeichnis ~/.config/7accctrl/7accctrl.config gelesen.

Mit --port und --hostbind lässt sich noch der Port und die die Bindadresse des Webservers überschreiben.

Ist der rigtcld-Prozess noch nicht gestartet kann dieses auch nach dem Start von 7accctrl erfolgen. 7log versucht alle 5 Sekunden eine Verbindung zum rigtctld herzustellen.

Nach dem Start kann im Webbrowser mit http://localhost:8000 die Webseite auf dem Rechner angesprochen werden.

Beispielansicht

Das folgende Bild zeigt ein Beispiel der Ansicht in einem Webbrowser

Beipielansicht

Beipielansicht

Hinweise für den Remotebetrieb

Da das Programm keine Benutzerauthentifizierung kennt ist mit dem Zugriff auf den Webserver die Kontrolle über die Schalter möglich. Daher sollte der Port auf dem es betrieben wird nicht über den Internetrouter veröffentlicht werden.

Der Zugriff sollte daher über ein VPN abgesichert sein. Das VPN ist auch hilfreich den Verbindung zum Transceiver abzusichern.

Wenn auf die Absicherung der Verbindung zum transceiver verzichtet wird besteht eine eine Alternative darin ssh mit Portforwarding zu verwenden. Dazu wird der Webserver mit "localhost" als bindhost betrieben, so dass nur Verbdinungen vom selben Rechner akzeptiert werden. Auf der Client erfolgt eine Verbindung mit ssh -L:8003 localhost:8000. Nach dem einloggen in Raspi kann jetzt mit http://localhost:8003 auf der Clientmaschine im Browser der Webserver angesprochen werden.

Rechtliches

  1. Jens Rosebrock, 2022

Das Programm darf von Funkamateuren für den privaten Einsatz frei verwendet werden. Eine kommerzielle Nutzung ist ausgeschlossen.

Die Verwendung des Programms erfolgt auf eigene Gefahr. Der Autor übernimmt keine Haftung für irgendwelche Schäden, die durch die Verwendung des Programms entstehen.

Anhang

Beispielkonfiguration

{ "global": {"inverted_relais" : true,
             "bindhost": "localhost",
             "bindport": 8000
            },
  "symbols": 
    [{"name":"lowbandrx",
      "expression": "swrxlowband and f_ic705 <3.8e6 and not PTT_ic705"
      },
     {"name": "trans23",
      "expression": "f_ic705 >=144.e6 and f_ic705 <148e6 and sw23cm"
     }
    ],
  "switches":
    [
        {"id":"swpa01",
         "name":"SW PA",
         "default": false},
        {"id": "sw23cm",
        "name": "23cm transverter",
         "default": false},
        { "id": "swrxlowband",
          "name": "RX antenna lowbands",
          "default": false}
    ],
 "transceiver":
    {"ic705":
        {"name": "IC-705",
         "rigctld": "localhost:4532",
         "pttgpio": 17}
    },
 "relais":
    {"0":
        {"name": "SW BX1200 tuner",
         "expression": "f_ic705 < 30e6 and not lowbandrx",
         "delayon":0,
         "delayoff": 0},
     "1":
        {"name": "V/UHF vertical",
         "expression": "f_ic705 >100e6 and not sw23cm",
         "delayon":0,
         "delayoff": 0},
     "2":
        {"name": "23cm",
         "expression": "trans23",
         "delayon":0,
         "delayoff": 0},
     "3":
        {"name": "RX low bands antenna",
         "expression": "lowbandrx",
         "delayon": 0,
         "delayoff": 0},
     "4":
        {"name": "SW-PA PTT",
         "expression": "PTT_ic705 and f_ic705 >1.e6 and f_ic705 <30e6 and swpa01",
         "delayon": 0.010,
         "delayoff": 0
        },
     "5":
        {"name": "23cm PTT",
         "expression": "PTT_ic705 and trans23",
         "delayon": 0.010,
         "delayoff": 0
        },
     "6":
        {"name": "RX low bands power",
         "expression": "lowbandrx",
         "delayon": 0,
         "delayoff": 0}
   }
}