FNA-Steuerung

Eine Ampelsteuerung für das FieldNet

Vorraussetzungen und Funktionen

Voraussetzungen

Für die Steuerung wird ein PC/Gerät benötigt, auf dem Docker läuft und installiert ist. Dies kann ein Notebook (Windows, Linux, Mac) aber auch ein PC/Raspberry Pi sein. Bei einem Gerät ohne Bildschirm, wie bei einem Raspberry wird noch ein Eingabegerät oder eine Fernbedienung benötigt. Dies kann ein Smartphone, Tablet oder ein zweites Notebook sein.

Funktionen

Installation

In diesem Kampitel geht es um die Installation und Update der Software

Installation

Windows

Vorraussetungen

Projektdateien und Software

Benötigtes Material

Anleitung - Start/Installation der Steuerung

1. Docker Desktop starten

Die Ampelsteuerung ist in einzelne Module aufgeteilt. Diese kommunizieren miteinander über eine ValKey/Redis Datenbank. Um die Benutzung der Software möglichst einfach zu gestalten sind alle Module in Docker Container geschachtelt. Um diese starten zu können, müssen wir in Docker Desktop die einzelnen Container miteinander starten. Dies funktioniert am einfachsten über eine Docker Compose Datei. Hierfür muss starten wir als erstes Docker Desktop. Unsere Oberfläche für das starten und stopen von Docker Container.

2. Docker Compose Stack starten

Um Docker Desktop unsere Container und wie sie miteinander arbeiten sollen beizubrigen benötigen wir die bereitgestellte Docker-Compose Datei. Bei dem Compose module von Docker handelt es sich um eine automatisch installierte erweiterung, welche uns anhand einer .yaml Datei mehrere Container als einen zusammenhängenden Dienst starten lassen. Weiterhin können wir darin abhängigkeiten und Konfigurationen mitgeben. Da diese Datei nicht in der Oberfläche hinzugefügt werden kann müssen wir diese in einen Ordner legen und über die CMD einen Befehl absetzen. 

  1. Lege die Datei in einem Ordner mit dem Namen "FNA-Steuerung" auf deinem PC ab.
  2. Starte eine Kommandozeile in diesem ordner. Rechtsklick in dem Ordner und "In Terminal öffnen" auswählen

    image.png

  3. In der Komandozeile geben wir folgenden Befehl ein docker compose up -d, dieser startet anhand der "docker-compose.yaml" Datei die entsprechenden Container im Hintergrund. (ohne -d würden wir die Ausgabe der Container sehen und beim schließen der Kommandozeile würde die Steuerng beendet werden)
  4. Es werden nun die benötigten Docker Images heruntergeladen und dannach gestartet

    image.png

    image.png

  5. Nun ist wird dieser auch in Docker Desktop angezeigt und kann dort gestartet und gestoppt werden

image.png

3. WebUI öffnen

Nachdem die Container nun laufen kann auf die Weboberfläche (WebUI) der Steuerng zugegriffen werden. Diese läuft auf Port 80. Im Browser die URL http://127.0.0.1 eingeben.

image.png

Eine Detailierte Anleitung, wie die Steuerung bedient werden kann gibt es in anderen Kapitel.

Anleitung - Stoppen der Steuerung

Die Steuerung kann über den Docker Desktop einfach gestoppt und gestartet werden. Hierzu unter Container bei der fna-steuerung unter Aktionen Starten bzw. stoppen. Solltest du die Software nicht manuell stoppen, wird sie beim nächsten Start von Docker Desktop, oder deinem PC automatisch gestartet.

image.png

WICHTIG: Im Netzwerk darf nur eine Steuerung gleichzeitig laufen, da sonst die Anzeigegeräte unterschiedliche Informationen erhalten.

Anleitung - Update der Steuerung

Um die Steuerung auf den aktuellen Stan zu bringen müssen die Container gestoppt werden. Im Anschluss wechselt man auf den Reiter Images, wählt bei Actions die 3 Punkte aus und klickt auf Pull. Dadurch wird die neuste Version der Software heruntergeladen. Du musst dies für alle 4 Images machen einzeln machen.

image.png

Installation

Linux

Vorraussetungen

Projektdateien und Software

Benötigtes Material

Anleitung - Start/Installation der Steuerung

1. Ordner anlegen und Docker Compose Datei ablegen

Als erstes erstellen wir im Home Verzeichnis einen Ordner namens fna-steuerung

## Optional, wenn wget nicht installiert ist
sudo apt install wget -y
## Erstellen des Ordners fna-steuerung
cd ~
mkdir fna-steuerung
cd fna-steuerung
## Downloaden der docker-compose.yaml
wget https://gitlab.gras-it.de/bsapp/fieldnet-ampel/fna-docker-infrastructur/-/blob/e561a872b02b854c72ce75088ba0750fe36b8028/docker-compose.yaml

2. Starten des Docker Compose Service

Nachdem wir die docker-compose.yaml Datei heruntergeladen haben können wir den Service starten

## Springen in den Ordner fna-steuerung
cd ~/fna-steuerung
## Starten des Services
#Je nach dem ob der Benutzer in der docker Gruppe ist mit oder ohne SUDO
#Ist der Benutzer in der docker gruppe kann das sudo weggelassen werden
sudo docker compose up -d

3. Öffnen der WebUI

Nachdem die Container nun laufen kann auf die Weboberfläche (WebUI) der Steuerng zugegriffen werden. Diese läuft auf Port 80. Im Browser die URL http://127.0.0.1 eingeben. Alternativ, wenn die Steuerung ohne Bildschirm betrieben wird, dann auf dem Gerät mit Bildschirm (Notebook / Smartphone / Tablet) die IP Adresse oder der DNS Name des "Servers" eingeben. z.B. http://10.0.1.10 oder http://sv-ampel 

image.png

Anleitung - Stoppen der Steuerung

Die steuerung kann über ein docker compose down gestoppt werden.  Solltest du die Software nicht manuell stoppen, wird sie beim nächsten Start von deinem PC automatisch gestartet.

## Springen in den Ordner fna-steuerung
cd ~/fna-steuerung
## Stoppen des Services
#Je nach dem ob der Benutzer in der docker Gruppe ist mit oder ohne SUDO
#Ist der Benutzer in der docker gruppe kann das sudo weggelassen werden
sudo docker compose down

WICHTIG: Im Netzwerk darf nur eine Steuerung gleichzeitig laufen, da sonst die Anzeigegeräte unterschiedliche Informationen erhalten.

Anleitung - Update der Steuerung

Die steuerung kann mit einem einfachen docker compose pull und einem neuerstellen beim Start durchgeführt werden. Hierzu muss der Servie auf jeden fall gestoppt sein.

## Springen in den Ordner fna-steuerung
cd ~/fna-steuerung
## Stoppen des Services
sudo docker compose down
## Starten des Services
#Je nach dem ob der Benutzer in der docker Gruppe ist mit oder ohne SUDO
#Ist der Benutzer in der docker gruppe kann das sudo weggelassen werden
sudo docker compose pull
sudo docker compose up --force-recreate -d
sudo docker image prune -f

Installation

Mac OS

Voraussetzungen

Docker Desktop installiert (Anleitungen gibt es auf der offiziellen Website oder im Internet)

Projektdateien und Software

Docker-Compose Datei

Benötigtes Material

Anleitung - Start/Installation der Steuerung

1. Docker Desktop starten

Die Ampelsteuerung ist in einzelne Module aufgeteilt. Diese kommunizieren miteinander über eine ValKey/Redis Datenbank. Um die Benutzung der Software möglichst einfach zu gestalten sind alle Module in Docker Container geschachtelt. Um diese starten zu können, müssen wir in Docker Desktop die einzelnen Container miteinander starten. Dies funktioniert am einfachsten über eine Docker Compose Datei. Hierfür starten wir als erstes Docker Desktop. Unsere Oberfläche für das Starten und Stoppen von Docker Container.

2. Docker Compose Stack starten

Um Docker Desktop unsere Container und wie sie miteinander arbeiten sollen beizubringen benötigen wir die bereitgestellte Docker-Compose Datei. Bei dem Compose Modul von Docker handelt es sich um eine automatisch installierte Erweiterung, welche uns anhand einer .yaml Datei mehrere Container als einen zusammenhängenden Dienst starten lassen. Weiterhin können wir darin Abhängigkeiten und Konfigurationen mitgeben. Da diese Datei nicht in der Oberfläche hinzugefügt werden kann müssen wir diese in einen Ordner legen und über das Terminal einen Befehl absetzen.

  1. Lege die Datei in einem Ordner mit dem Namen "FNA-Steuerung" auf deinem Mac ab.
  2. Starte ein Terminal in diesem Ordner. Rechtsklick in dem Ordner im Finder und "Neues Terminal beim Ordner" auswählen oder öffne das Terminal und navigiere mit cd zum entsprechenden Ordner
  3. Im Terminal geben wir folgenden Befehl ein: docker compose up -d, dieser startet anhand der "docker-compose.yaml" Datei die entsprechenden Container im Hintergrund. (ohne -d würden wir die Ausgabe der Container sehen und beim Schließen des Terminals würde die Steuerung beendet werden)
  4. Es werden nun die benötigten Docker Images heruntergeladen und danach gestartet
  5. Nun wird dieser auch in Docker Desktop angezeigt und kann dort gestartet und gestoppt werden

3. WebUI öffnen

Nachdem die Container nun laufen kann auf die Weboberfläche (WebUI) der Steuerung zugegriffen werden. Diese läuft auf Port 80. Im Browser die URL http://127.0.0.1 eingeben.

Eine detaillierte Anleitung, wie die Steuerung bedient werden kann gibt es in anderen Kapiteln.

Anleitung - Stoppen der Steuerung

Die Steuerung kann über Docker Desktop einfach gestoppt und gestartet werden. Hierzu unter Container bei der fna-steuerung unter Aktionen Starten bzw. Stoppen. Solltest du die Software nicht manuell stoppen, wird sie beim nächsten Start von Docker Desktop, oder deinem Mac automatisch gestartet.

WICHTIG: Im Netzwerk darf nur eine Steuerung gleichzeitig laufen, da sonst die Anzeigegeräte unterschiedliche Informationen erhalten.

Anleitung - Update der Steuerung

Um die Steuerung auf den aktuellen Stand zu bringen müssen die Container gestoppt werden. Im Anschluss wechselt man auf den Reiter Images, wählt bei Actions die 3 Punkte aus und klickt auf Pull. Dadurch wird die neueste Version der Software heruntergeladen. Du musst dies für alle 4 Images einzeln machen.

Die WebUI

Wie wir die Webbasierte Oberfläche verwendet. Wie stelle ich die Ampel korrekt ein und wie nutze ich diese in einem Wettkampf

Die WebUI

Benutzen der Steuerung

Hauptoberfläche (Main Interface)

Die Weboberfläche der FNA-Steuerung ist über den Browser erreichbar (z. B. http://sv-ampel oder http://127.0.0.1).

Um nicht mit jedem Gerät im Netzwerk die Ampel steuern zu können, muss man sich Anmelden. Der 6 stellige initiale Pin lautet 123456.

image.png

Je nach konfiguriertem Modus erscheint eine von zwei Ansichten: der Standard-Modus für Wettkämpfe und Liga 

image.png

sowie der Alternierend-Modus

image.png


Kurzübersicht

image.png

image.png


Steuerleiste

Die vier Schaltflächen oben sind in beiden Ansichten identisch vorhanden.

Schaltfläche Funktion
START Startet die aktive Schusssequenz. Die Ampel beginnt mit der konfigurierten Vorlaufzeit.
STOPP Bricht die laufende Sequenz sofort ab. Die Ampel wechselt auf Rot.
GEFAHR Löst ein Gefahrensignal aus: Die Hupe ertönt 5-mal, die Ampel wechselt sofort auf Rot. Nach Beenden des Gefahrenmodus setzt die Ampel an der Stelle fort, an der sie unterbrochen wurde.
WECHSEL Abhängig vom aktiven Modus – siehe die jeweiligen Abschnitte unten.

Hinweis: STOPP und GEFAHR sind unterschiedliche Aktionen. STOPP beendet die Sequenz kontrolliert und endgültig. GEFAHR unterbricht die laufende Sequenz für eine Sicherheitssituation und setzt sie danach automatisch fort.


Standard-Modus (Wettkampf / Liga)

Dieser Modus wird für normale Wettkämpfe und Ligabetrieb verwendet. Alle Ampelanlagen geben die gleichen Informationen aus.

Anzeigebereich

Der mittlere Bereich zeigt zwei Informationen nebeneinander:

Rechts – Gruppe: Das Kürzel AB oder CD zeigt an, welche Gruppe gerade an der Reihe ist.

WECHSEL im Standard-Modus

Im Standard-Modus wechselt WECHSEL die aktive Gruppe von AB nach CD (oder umgekehrt). Dies wird eingesetzt, wenn die Gruppen abwechselnd auf die Scheibe schießen.

Untere Schaltflächen

Die untere linke Schaltfläche ändert sich je nach Konfiguration:

Schaltfläche Wann sichtbar Funktion

NACHSCHIESSEN

Nachschießen nicht konfiguriert Startet eine Nachschieß-Sequenz für einzelne Athleten, die einen oder mehrere Pfeile nachholen müssen. Die Anzahl der Nachschusspfeile ist in den Einstellungen konfigurierbar.
BEENDEN / ANPASSEN Nachschießen konfiguriert Beendet das Nachschießen und wechselt wieder in den vorherigen Modus
EINSTELLUNGEN Immer Öffnet die Konfigurationsseite für Zeiten, Modi und Voreinstellungen.

Alternierend-Modus

Im Alternierend-Modus schießen zwei Mannschaften oder Athleten abwechselnd. Dabei sind zwei separate Ampeln (A1 links, A2 rechts) aktiv, die unabhängig voneinander gesteuert werden.

Anzeigebereich

Der Anzeigebereich ist horizontal in zwei gleichwertige Hälften geteilt:

Linke Hälfte (A1): Zeigt den Ampelstatus von Ampel 1 (Rot, Gelb, Grün) sowie darunter die verbleibenden Sekunden für diese Ampel.

Rechte Hälfte (A2): Zeigt den Ampelstatus von Ampel 2 (Rot, Gelb, Grün) sowie darunter die verbleibenden Sekunden für diese Ampel.

Beide Ampeln laufen im Wechsel: Während eine Ampel auf Grün schaltet (Schussfreigabe), bleibt die andere auf Rot.

WECHSEL im Alternierend-Modus

Im Alternierend-Modus bestimmt WECHSEL, welche Ampel (links oder rechts) den ersten Durchgang beginnt. Dies kann vor dem START genutzt werden, um die Startreihenfolge festzulegen.

Untere Schaltflächen

Schaltfläche Funktion
STECHEN Startet eine Stechen-Sequenz für Entscheidungssituationen. Im Alternierend-Modus gibt es kein Nachschießen – stattdessen steht diese Schaltfläche zur Verfügung.
EINSTELLUNGEN Öffnet die Konfigurationsseite.

Schnellübersicht: Unterschiede der beiden Modi

Merkmal Standard-Modus Alternierend-Modus
Anzahl Ampeln 1 2 (A1 links, A2 rechts)
Zeitanzeige Verbleibende Sekunden + Gruppe AB/CD Verbleibende Sekunden je Ampel
WECHSEL-Funktion Gruppe AB ↔ CD wechseln Startreihenfolge (links/rechts) festlegen
Nachschießen ✓ Möglich (wenn konfiguriert) ✗ Nicht verfügbar
Stechen ✗ Nicht verfügbar ✓ Möglich
GEFAHR-Verhalten Hupe 5× + sofort Rot, danach Fortsetzung Hupe 5× + sofort Rot, danach Fortsetzung
Die WebUI

Einstellen der Parameter (Zeiten und Modis)

Die Einstellungsseite der FNA-Steuerung ist in zwei Bereiche aufgeteilt: Allgemein (links) und Wettkampf (rechts). Über den Button ← Zurück gelangst du jederzeit zur Hauptsteuerung zurück.


Übersicht der Einstellungsseite

2026-04-27 16_39_36-2026-04-27 16_36_48-Greenshot.png - Greenshot - Editor.png

Die Einstellungsseite ist unter http://<IP-Adresse>/settings erreichbar oder direkt über den Button ⚙ EINSTELLUNGEN auf der Hauptseite.


Bereich: Allgemein

Ampel Helligkeit

Stellt die Helligkeit der Ampel-Anzeigegeräte ein.

Eigenschaft Wert
Minimum 0 (aus)
Maximum 100 (volle Helligkeit)

Mit den + und Buttons kannst du den Wert schrittweise anpassen.


Lautstärke Hupe

Stellt die Lautstärke der akustischen Signale (Hupe) ein.

Eigenschaft Wert
Minimum 0 (stumm)
Maximum 100 (volle Lautstärke)
Standard 80

Mit den + und Buttons kannst du den Wert schrittweise anpassen.


Bereich: Wettkampf

Hier werden die Parameter für den Schießbetrieb konfiguriert. Alle Änderungen werden erst mit ✓ Speichern und zurück übernommen.


Vorauswahl

Über das Dropdown-Menü kannst du ein gespeichertes Preset auswählen (z. B. Finale Einzel, Liga, Halle).

Hinweis: Das Laden einer Vorauswahl überschreibt automatisch die Felder Vorbereitungszeit, Zeit pro Pfeil, Anzahl Pfeile und Modus. Der Name sowie Helligkeit und Lautstärke bleiben unverändert.

Mit dem 🗑 (Papierkorb)-Button rechts neben der Vorauswahl kann das aktuell gewählte Preset gelöscht werden. Mit dem + (Plus)-Button links neben der Vorauswahl kann ein neues Preset erstellt werden.


Name

Der Name des aktuellen Einstellungsprofils. Dieser Name wird in der Vorauswahl-Liste angezeigt.


Vorbereitungszeit

Die Vorbereitungszeit ist die Zeit (in Sekunden) zwischen dem doppelten Hupsignal (Schützen an die Scheibe) und dem Startsignal (grünes Licht + ein Hupsignal).

Signal Bedeutung
2× Hupe Schützen begeben sich an die Schießlinie
Vorbereitungszeit läuft Schützen bereiten sich vor
Grün + 1× Hupe Freigabe zum Schießen

Mit den + und Buttons anpassen.


Zeit pro Pfeil

Gibt an, wie viel Zeit (in Sekunden) ein Schütze pro Pfeil zur Verfügung hat.

Beispiel: Bei 20 Sekunden pro Pfeil und 3 Pfeilen ergibt sich eine Gesamtschießzeit von 60 Sekunden.


Anzahl Pfeile

Legt fest, wie viele Pfeile pro Durchgang geschossen werden.

Die Gesamtschießzeit errechnet sich aus:

Schießzeit = Anzahl Pfeile × Zeit pro Pfeil

Diese Berechnung gilt für die Modi KEIN und AB/CD. Bei den alternierenden Modi (Alt. Einzel / Alt. Man.) läuft die Zeit anders ab – siehe unten.


Modus

Der Modus bestimmt, wie die Schützen bzw. Mannschaften gegeneinander schießen.

Modus Beschreibung
KEIN Kein Gruppenformat – alle Schützen schießen gleichzeitig (z. B. Liga-Betrieb). Die Gesamtschießzeit ergibt sich aus Anzahl Pfeile × Zeit pro Pfeil.
AB/CD Gruppenmodus: Gruppe A/B und C/D schießen abwechselnd. Die Schießzeit ergibt sich aus Anzahl Pfeile × Zeit pro Pfeil.
Alt. Einzel Alternierend Einzel: Zwei Einzelschützen schießen abwechselnd. Die Ampel zeigt immer die Zeit für einen Pfeil an und wechselt nach jedem Pfeil zur anderen Seite.
Alt. Man. Alternierend Mannschaft: Zwei Mannschaften schießen abwechselnd. Die Gesamtzeit wird vollständig angezeigt und nicht zurückgesetzt. Wenn eine Mannschaft ihren Pfeil geschossen hat, wird die Zeit angehalten, bis die andere Mannschaft an der Reihe war – dann läuft sie weiter.

Ablauf Alternierend Einzel (Alt. Einzel)

Schütze A schießt Pfeil 1  →  Wechsel  →  Schütze B schießt Pfeil 1
→  Wechsel  →  Schütze A schießt Pfeil 2  →  ...

Die Anzeige zeigt jeweils die Zeit für einen einzelnen Pfeil. Nach jedem Pfeil wechselt die Seite.

Ablauf Alternierend Mannschaft (Alt. Man.)

Mannschaft A jeder Schütze schießt ein Pfeil  →  Zeit stoppt  →  Mannschaft B jeder Schütze schießt ein Pfeil
→  Zeit stoppt  →  Mannschaft A jeder Schütze schießt ein Pfeil  →  ...

Die Gesamtzeit läuft durch und wird nur pausiert, wenn die andere Mannschaft schießt. Sie wird nicht zurückgesetzt.


Speichern

Nach dem Anpassen aller gewünschten Parameter klicke auf:

✓ Speichern und zurück

Die Einstellungen werden gespeichert und du kehrst zur Hauptsteuerung zurück. Das aktuelle Profil wird dabei unter dem eingetragenen Namen als Vorauswahl gespeichert bzw. aktualisiert.


Tipp: Lege für häufig verwendete Wettkampfformate (z. B. Finale Einzel, Halle 18m, Liga) eigene Profile an, um schnell zwischen verschiedenen Einstellungen wechseln zu können.

Die WebUI

Schießleiterprotokoll

Das Schießleiterprotokoll ist eine automatisch erstellte Aufzeichnung aller relevanten Aktionen, die während einer Veranstaltung über die Ampelsteuerung durchgeführt wurden. Es dient als offizieller Nachweis für den Schießleiter und kann direkt aus der WebUI geöffnet und ausgedruckt werden.


Übersicht der Protokoll-Schaltflächen

image.png

Im Bereich Protokoll der Einstellungsseite stehen vier Schaltflächen zur Verfügung:

Schaltfläche Funktion
📋 Protokoll öffnen Öffnet das aktuelle Protokoll als PDF im Browser
🗑️ Protokoll löschen Löscht alle gespeicherten Protokolleinträge unwiderruflich
🕐 Uhrzeit einstellen Ermöglicht die manuelle Synchronisation der Systemzeit
Einschießen Markiert die aktuelle Sitzung als Einschieß-Phase

Hinweis: Die Schaltflächen befinden sich auf der Seite Einstellungen, erreichbar über den Button „EINSTELLUNGEN" auf der Hauptseite der WebUI.


Protokoll öffnen

Ein Klick auf „Protokoll öffnen" generiert das Schießleiterprotokoll als PDF und öffnet es im Browser. Das Protokoll enthält:

Beispiel eines Protokolleintrags

Zeitpunkt Aktion Infos
3.4.2026, 20:50:13 START gedrückt AB/CD: –, Einschießen: False, Alternierend: True
3.4.2026, 20:49:37 STECHEN Einzeln Anzahl Schützen: 2
3.4.2026, 20:48:41 NACHSCHIESSEN Anzahl Pfeile: 3

Das PDF kann direkt aus dem Browser gedruckt oder gespeichert werden.


Protokoll löschen

⚠️ Achtung: Das Löschen des Protokolls ist nicht rückgängig zu machen. Alle bisher gespeicherten Einträge werden dauerhaft entfernt.

Ein Klick auf „Protokoll löschen" (rot hinterlegt) entfernt sämtliche Protokolleinträge. Dies sollte erst nach dem Ausdruck bzw. der Speicherung des Protokolls für die zurückliegende Veranstaltung erfolgen – typischerweise zu Beginn einer neuen Veranstaltung, um ein sauberes Protokoll zu erhalten.


Uhrzeit einstellen

Da die Ampelsteuerung auch offline betrieben werden kann, kann die interne Systemzeit von der tatsächlichen Uhrzeit abweichen – etwa nach einem Neustart ohne Internetzugang.

Warum ist das wichtig?

Alle Protokolleinträge werden mit einem Zeitstempel versehen. Ist die Systemzeit falsch, stimmen die Zeitangaben im Protokoll nicht mit dem realen Ablauf überein. Durch das manuelle Einstellen der Uhrzeit werden neue Einträge mit der korrekten Zeit gespeichert.

So stellen Sie die Uhrzeit ein

  1. Öffnen Sie die Einstellungen über die Hauptseite der WebUI.
  2. Klicken Sie im Bereich „Protokoll" auf „Uhrzeit einstellen".
  3. Tragen Sie die aktuelle Uhrzeit in das angezeigte Eingabefeld ein.
  4. Bestätigen Sie die Eingabe.

⚠️ Wichtig: Die Uhrzeitkorrektur wirkt sich nur auf zukünftige Einträge aus. Bereits im Protokoll gespeicherte Einträge werden nicht nachträglich angepasst. Stellen Sie die Uhrzeit daher vor Beginn der Veranstaltung ein.


Einschießen

Die Schaltfläche „Einschießen" kennzeichnet eine Schießphase explizit als Einschieß-Durchgang. Ist der Einschieß-Modus aktiv, wird dies in jedem Protokolleintrag unter Infos vermerkt (Einschießen: True).

Verwendung


Empfohlene Vorgehensweise bei einer Veranstaltung

  1. Vor der Veranstaltung:

    • Uhrzeit prüfen und ggf. über „Uhrzeit einstellen" synchronisieren.
    • Altes Protokoll der vorherigen Veranstaltung exportieren/drucken.
    • Protokoll über „Protokoll löschen" zurücksetzen.
  2. Während der Veranstaltung:

    • Einschießen über den Button „Einschießen" markieren.
    • Die Steuerung protokolliert alle Aktionen automatisch im Hintergrund.
  3. Nach der Veranstaltung:

    • Über „Protokoll öffnen" das PDF generieren.
    • Protokoll ausdrucken und mit Name, Veranstaltung, Datum und Unterschrift vervollständigen.
    • Das ausgefüllte Protokoll zu den Veranstaltungsunterlagen nehmen.
Die WebUI

Sicherheit

In den Einstellungen gibt es zwei bereiche zum Thema Sicherheit.

Bereich: PIN

image.png

Hier kann über die Schaltfläche PIN ändern der Loginpin für die Anmeldung angepasst werden. Der Standard PIN ist 123456.

image.png


Bereich: Geräte

image.png

Verschiedene Arten von Geräte müssen mit der Steuerung interagieren haben aber oft eine Möglichkeit zur Eingabe eines PIN's. Für dieses Problem gibt es die Möglichkeit Geräte für den Endpunkt /api/cmd freizuschalten. Sobald sich ein Gerät, zum Beispiel eine Fernbedienung für den Kampfrichter, an der Steuerung meldet, erscheint dieses in dieser Auflistung und kann genehmigt werden.

image.png

Sobald das Gerät Zugelassen wurde, kann es für 24 Stunden mit der Steuerung interagieren.

image.png

Über die Schaltfläche Widerrufen, kann ein aktives Gerät auch entfernt werden.

API Dokumentation

Die FNA-Steuerung stellt eine REST-API bereit, über die alle Funktionen der Ampelsteuerung programmatisch abgerufen und gesteuert werden können. Die API ist unter http://<ip-adresse>/api/ erreichbar.


Übersicht der Endpunkte

Methode Endpunkt Beschreibung PIN Auth Device Auth
GET /api/status Aktuellen Status der Ampeln abrufen X
GET /api/cmd Verfügbare Befehle abrufen X X
POST /api/cmd/{cmd} Befehl ausführen X X
GET /api/config Alle Konfigurationen abrufen X
POST /api/config Neue Konfiguration erstellen X
GET /api/config/preset Aktive Voreinstellung abrufen X
GET /api/config/volume Lautstärke abrufen X
PUT /api/config/volume Lautstärke setzen X
GET /api/config/brightness Helligkeit abrufen X
PUT /api/config/brightness Helligkeit setzen X
PUT /api/config/nach Nachschießen-Anzahl setzen X
DELETE /api/config/nach Nachschießen deaktivieren X
GET /api/config/{id} Einzelne Konfiguration abrufen X
PUT /api/config/{id} Konfiguration aktualisieren X
DELETE /api/config/{id} Konfiguration löschen X
GET /api/logs Protokolleinträge abrufen X
DELETE /api/logs Protokoll löschen X
GET /api/logs/training Trainings-Modus abrufen X
PUT /api/logs/training Trainings-Modus setzen X
GET /api/time Systemzeit abrufen X
POST /api/sync-time Systemzeit synchronisieren X
POST /api/auth/login
Anmelden mit PIN

GET /api/auth/status Status des Session (Auth)

POST /api/auth/logout Abmelden

PUT /api/auth/pin Login PIN ändern X
GET /api/devices/pending Liste der wartenden Geräte X
POST /api/devices/pending/{device_id}/approve Gerät zulassen X
DELETE /api/devices/pending/{device_id} Wartendes gerät löschen X
GET /api/devices/approved Liste der zugelassenen Geräte X
DELETE /api/devices/approved/{device_id} Zugelassenes Gerät löschen X

Status

GET /api/status

Gibt den aktuellen Betriebsstatus beider Ampeln zurück.

Antwort 200 OK

{
  "a1": {
    "red": true,
    "yellow": false,
    "green": false,
    "time": 120,
    "group": "A"
  },
  "a2": {
    "red": false,
    "yellow": false,
    "green": true,
    "time": 120,
    "group": "B"
  },
  "run": true,
  "group_mode": false,
  "count_arrows": 3,
  "alt_mode": false,
  "shoot_break": false,
  "shoot_off_mode": false
}
Feld Typ Beschreibung
a1 / a2 Objekt Status von Ampel 1 und 2
a1.red Boolean Rotes Licht aktiv
a1.yellow Boolean Gelbes Licht aktiv
a1.green Boolean Grünes Licht aktiv
a1.time Integer Verbleibende Zeit in Sekunden
a1.group String Zugewiesene Gruppe (z. B. "A" oder "B")
run Boolean Steuerung läuft aktuell
group_mode Boolean AB/CD-Gruppenmodus aktiv
count_arrows Integer Aktuell eingestellte Pfeilanzahl
alt_mode Boolean Alternierend-Modus aktiv
shoot_break Boolean Schießpause aktiv
shoot_off_mode Boolean Gibt an, ob Nachschießen oder Stechen eingestellt ist

Befehle

GET /api/cmd

Gibt zurück, welche Befehle aktuell verfügbar (ausführbar) sind.

Antwort 200 OK

{
  "CommandStatus": {
    "START": true,
    "STOP": false,
    "SWITCH": false,
    "BREAK": false
  }
}
Befehl Beschreibung
START Schießsequenz starten
STOP Schießsequenz stoppen
SWITCH Gruppe wechseln (bei Alternierend-Modus)
BREAK Schießpause einleiten

POST /api/cmd/{cmd}

Führt einen Steuerungsbefehl aus.

Pfadparameter

Parameter Typ Beschreibung
cmd String Befehl: START, STOP, SWITCH oder BREAK

Beispiel

POST /api/cmd/START

Antworten

Code Beschreibung
200 OK Befehl erfolgreich ausgeführt
400 Bad Request Ungültiger oder nicht erlaubter Befehl
500 Internal Server Error Serverfehler

Konfigurationen

Konfigurationen enthalten alle Einstellungen für einen Schießbetrieb (z. B. Zeit pro Pfeil, Pfeilanzahl, Modus). Es können mehrere Konfigurationen gespeichert werden.

GET /api/config

Gibt alle gespeicherten Konfigurationen zurück.

Antwort 200 OK – Array von Konfigurationsobjekten (siehe Felder unten)


POST /api/config

Erstellt eine neue Konfiguration.

Anfrage-Body

{
  "name": "Halle 18m",
  "time_per_arrow": 40,
  "prepare_time": 10,
  "count_arrows": 3,
  "group_mode": false,
  "alt_single": false,
  "alt_team": false
}
Feld Typ Beschreibung
name String Bezeichnung der Konfiguration
time_per_arrow Integer Zeit pro Pfeil in Sekunden
prepare_time Integer Vorlaufzeit in Sekunden
count_arrows Integer Anzahl der Pfeile pro Durchgang
group_mode Boolean AB/CD-Gruppenmodus aktivieren
alt_single Boolean Alternierend Einzeln aktivieren
alt_team Boolean Alternierend Mannschaft aktivieren

Antwort 200 OK – Die erstellte Konfiguration inkl. id und preset-Flag


GET /api/config/{id}

Gibt eine einzelne Konfiguration anhand ihrer ID zurück.


PUT /api/config/{id}

Aktualisiert eine vorhandene Konfiguration. Body entspricht POST /api/config.


DELETE /api/config/{id}

Löscht eine Konfiguration anhand ihrer ID.


GET /api/config/preset

Gibt die aktuell als Voreinstellung markierte Konfiguration zurück.

Antworten

Code Beschreibung
200 OK Voreinstellung gefunden
404 Not Found Keine Voreinstellung gesetzt

Lautstärke & Helligkeit

GET /api/config/volume

Gibt die aktuelle Lautstärke der Hupe zurück.

Antwort 200 OK

{ "amp_horn_vol": 80 }

PUT /api/config/volume?vol={wert}

Setzt die Lautstärke der Hupe.

Abfrageparameter

Parameter Typ Pflicht Beschreibung
vol Integer Ja Lautstärkewert

GET /api/config/brightness

Gibt die aktuelle Helligkeit der Ampeln zurück.

Antwort 200 OK

{ "amp_bright": 100 }

PUT /api/config/brightness?bright={wert}

Setzt die Helligkeit der Ampeln.

Parameter Typ Pflicht Beschreibung
bright Integer Ja Helligkeitswert

Nachschießen

PUT /api/config/nach?count={anzahl}

Aktiviert das Nachschießen mit der angegebenen Pfeilanzahl. Bei Alternierendem Modus wird hiermit das Stecken mit angegebener Schützenzahl aktiviert.

Parameter Typ Pflicht Beschreibung
count Integer Ja Anzahl der Pfeile für das Nachschießen / Schützen für Stechen

DELETE /api/config/nach

Deaktiviert das Nachschießen.


Protokoll (Logs)

GET /api/logs

Gibt alle Protokolleinträge zurück.

Antwort 200 OK

[
  {
    "id": 1,
    "timestamp": "2026-04-03T10:00:00",
    "action": "START",
    "description": "Schießsequenz gestartet"
  }
]
Feld Typ Beschreibung
id Integer Eindeutige ID des Eintrags
timestamp DateTime Zeitstempel des Ereignisses
action String Ausgeführte Aktion
description String Beschreibung des Ereignisses

DELETE /api/logs

Löscht alle Protokolleinträge.


GET /api/logs/training

Gibt zurück, ob der Trainings-Modus aktiv ist (Protokolleinträge werden im Trainings-Modus nicht für das Schießleiterprotokoll gewertet).

Antwort 200 OK

{ "training": false }

PUT /api/logs/training?training={wert}

Aktiviert oder deaktiviert den Trainings-Modus.

Parameter Typ Pflicht Standard Beschreibung
training Boolean Nein false true = Trainings-Modus aktiv

Zeit

GET /api/time

Gibt die aktuelle Systemzeit der Steuerung zurück.

Antwort 200 OK

{ "time": "2026-04-03T10:00:00" }

POST /api/sync-time

Synchronisiert die Systemzeit der Steuerung.

Anfrage-Body

{ "time": "2026-04-03T10:00:00" }

Antwort 200 OK – Bestätigung mit der gesetzten Zeit


Auth

POST /api/auth/login

Authentifiziert die UI

Anfrage-Body

{ "pin": "123456" }

Antwort 200 OK 

{  "token": "AA-BB-CC-DD" }

GET /api/auth/status

Gibt den Auth Status zurück

Antwort 200 OK 

{  "authenticated": true }

POST /api/auth/logout

Meldet die Session ab

Antwort 200 OK 

POST /api/auth/pin

Änder die Anmeldepin

Anfrage-Body

{ "new_pin": "987654" }

Antwort 200 OK 


Devices

GET /api/devices/pending

Gibt eine Liste der wartenden Geräte zurück

Antwort 200 OK 

[
  {
    "id": 1,
    "ip": "192.168.1.10",
    "first_seen": "2026-04-27T15:02:44.310Z",
    "last_seen": "2026-04-27T15:02:44.310Z",
    "request_count": 5,
    "app_name": "amp",
    "device_type": "remote",
    "discover_checked": true
  }
]
Feld Typ Beschreibung
id Integer Eindeutige ID des Eintrags
ip String IP des Gerätes
first_seen TimeStamp Wann hat sich das Gerät zum ersten mal gemeldet
last_seen TimeStamp Wann hat sich das Gerät zum letzten mal gemeldet
request_count Integer Wie oft hat sich das Gerät gemeldet
app_name String Info aus dem /discover feld App (Wenn vorhanden)
device_type String Info aus dem /discover feld Type (Wenn vorhanden)
discover_checked Boolean Gibt an, ob /discover geprüft werden konnte

POST /api/devices/pending/{device_id}/approve

Gibt ein Gerät anhand der device_id frei, sodass dieses die Ampel steuern kann.

Abfrageparameter

Parameter Typ Pflicht Beschreibung
device_id Integer Ja Device ID

Antwort 200 OK 

DELETE /api/devices/pending/{device_id}

Weist ein wartendes Gerät zurück anhand der device_id.

Abfrageparameter

Parameter Typ Pflicht Beschreibung
device_id Integer Ja Device ID

Antwort 200 OK 

GET /api/devices/approved

Gibt eine Liste der zugelassenen Geräte zurück

Antwort 200 OK 

[
  {
    "id": 1,
    "ip": "192.168.1.10",
    "app_name": "amp",
    "device_type": "remote",
    "approved_at": "2026-04-27T15:13:04.210Z",
    "expires_at": "2026-04-27T15:13:04.210Z"
  }
]
Feld Typ Beschreibung
id Integer Eindeutige ID des Eintrags
ip String IP des Gerätes
app_name String Info aus dem /discover feld App (Wenn vorhanden)
device_type String Info aus dem /discover feld Type (Wenn vorhanden)
approved_at TimeStamp Gibt an, wann das Gerät zugelassen wurde
expires_at TimeStamp Gibt an, ab wann das Gerät nicht mehr zugelassen ist

DELETE /api/devices/approved/{device_id}

Weist ein zugelassenes Gerät zurück anhand der device_id. Dannach ist das Gerät nicht mehr berechtigt Anfragen an /api/cmd zu senden

Abfrageparameter

Parameter Typ Pflicht Beschreibung
device_id Integer Ja Device ID

Antwort 200 OK 


Antwortformate

Erfolg / Fehler (DefaultStatusOUT)

Viele Endpunkte antworten bei Erfolg oder Fehler mit folgendem Format:

{ "status": "ok" }

Hinweise

Wichtig: Im Netzwerk darf nur eine Steuerung gleichzeitig laufen, da sonst die Anzeigegeräte widersprüchliche Informationen erhalten könnten.

Fehlerbehebung

PIN vergessen

Solltest du einen PIN vergessen haben, kannst du über docker mit folgendem Befehl den PIN zurücksetzen

# Setzt den PIN auf 123456 zurück.
# Verwendung im laufenden Container:

docker exec <container_name> sh /app/reset_pin.sh

# Wenn du z.B. die Docker Infrastruktur Datei aus der Installationsanleitung genommen hast 
docker exec fna-webui sh /app/reset_pin.sh