Nach jedem Contest kommt der Moment, in dem das Log geschlossen wird und man auf eine lange Liste aus Rufzeichen, Uhrzeiten und Rapporten schaut. 815 Zeilen waren es beim CW-Fieldday 2026 mit DL0AT/P. Für uns Operatoren steckt in jeder dieser Zeilen eine kleine Geschichte – für alle anderen ist es erst einmal eine Tabelle. Eine Animation der Verbindungen macht dagegen für jeden nachvollziehbar, wie so ein Contest abläuft.

Es gibt viele Tools, die aus einem Log eine statische Karte aller Verbindungen erzeugen. So eine Karte hilft schon ein gutes Stück weiter. Aber sie zeigt eben nur das Endergebnis: ein dichtes Netz über Europa, ein paar Bögen über den Atlantik, ein einsamer Marker im Indischen Ozean. Was sie nicht zeigt, ist der Verlauf. Wann ging 40 m auf? Wann kippte die Station nachts auf 80 m? An welcher Stelle der 24 Stunden tauchte plötzlich 3B9FR auf 10 m im Log auf?

Genau dafür habe ich mir ein kleines Werkzeug gebaut: qso-animation.

Hier könnt ihr euch zum Beispiel die Animation des CW-Fielddays 2026 anschauen:

Video: Rückblick CW-Fieldday 2026 mit DL0AT/P (auf YouTube ansehen)

Die Idee

Vorne kommt das Cabrillo-Log rein, hinten kommt ein MP4 raus.

Eingabe ist also genau die Datei, die nach dem Contest ohnehin eingereicht wird. Das Skript liest die Verbindungen, sucht in verschiedenen Quellen nach den Standortdaten oder fällt auf das Präfix zurück. Dann zeichnet es für jedes QSO eine Großkreis-Linie von der eigenen Station zur Gegenstation. Statt einer fertigen Karte sieht man zu, wie sie entsteht: Bogen für Bogen, Stunde für Stunde, von der ersten Verbindung nach Contestbeginn bis zum letzten QSO kurz vor Schluss.

Dazu kommt alles, was man beim Zuschauen braucht, um sich zu orientieren: die Einfärbung nach Band, sodass Bandwechsel sofort ins Auge springen, eine mitlaufende Uhr und ein QSO-Zähler im Bild – und auf Wunsch die Grayline, synchronisiert mit der Contestzeit aus dem Log.

Gerade die Kombination aus Grayline und Bandfarben macht den Reiz aus: Man sieht die Dämmerungslinie über die Karte wandern und gleichzeitig, wie die Verbindungen mit ihr das Band wechseln.

Das resultierende Video lässt sich konfigurieren: Der Contest kann innerhalb von zwei Minuten im Zeitraffer nacherlebt werden – oder deutlich langsamer. Das gemächliche Tempo ist zum Beispiel für einen Amateurfunk-Infostand interessant. Dort lässt sich Besuchern anhand der Animation zeigen, wie so ein Contest abläuft und wie weit Verbindungen mit Amateurfunk möglich sind.

Der Locator und das Stationsrufzeichen sind momentan noch im Code fest eingebaut. Die Parametrisierung aller nötigen Werte für andere Stationen wäre ein guter erster Änderungsbeitrag (low-hanging fruit), bei dem ich auch gerne behilflich bin, falls es Fragen geben sollte.

Warum ein eigenes Skript?

Karten-Generatoren für Logdateien gibt es einige, viele davon als Online-Dienst. Mir war vor allem eines wichtig, das ich so nicht gefunden habe:

Der zeitliche Verlauf. Eine Animation erzählt die Geschichte eines Contests, eine Karte fasst sie nur zusammen. Und sie lässt sich weiterverwenden: Mir ging es darum, Ausschnitte in meine Videos über Fielddays und ähnliche Conteste schneiden zu können, um Außenstehenden den Ablauf zu verdeutlichen.

Im Einsatz: Fieldday 2026

815 Verbindungen aus 24 Stunden, fünf Bänder – daraus wird mit einem einzigen Aufruf ein gut dreieinhalbminütiges Video:

python3 qso_map_animation.py <callsign>.log --speed 400

Vor dem Rendern verrät das Skript, wie lang das Video wird:

Contest duration: 23.9h, speedup: 400.0x -> video: 216.1s (3.6 min)

Ausprobieren

Gebraucht werden Python und ffmpeg, der Rest kommt aus dem Makefile:

make venv
source venv/bin/activate
python3 qso_map_animation.py <callsign>.log

Das erzeugt qso_map.mp4 im aktuellen Verzeichnis, Full HD, mit Standardeinstellungen. Für einen schnellen Test lohnt sich ein Ausschnitt – die ersten 30 QSOs sind in Sekunden gerendert, während ein kompletter 4K-Lauf durchaus Zeit braucht:

python3 qso_map_animation.py <callsign>.log --start-qso 1 --num-qsos 30 -o test.mp4

Und wenn die Parameter dann sitzen, die volle Ausbaustufe:

python3 qso_map_animation.py <callsign>.log \
  --width 3840 --height 2160 --dpi 240 --fps 30 \
  --speed 960 --camera-follow --grayline --dots-only \
  -o qso_map_full.mp4

Zwei Optionen daraus möchte ich hervorheben. --camera-follow lässt die Kamera den aktuellen Verbindungen folgen, inklusive Vorausschau: Ein weit entferntes QSO zieht das Bild schon vorher in seine Richtung, statt ruckartig umzuspringen. Das sieht auf einer Europakarte während eines Contests erstaunlich filmisch aus. Und --dots-only lässt die Linien nach dem Aufleuchten verschwinden, während die Punkte als Stationsmarkierungen stehen bleiben – bei mehreren hundert QSOs bleibt die Karte so lesbar, statt in einem Wollknäuel zu enden.

Sämtliche Optionen stehen in der README.md im Repository; dort dokumentiere ich auch Auflösung/DPI-Kopplung und die Speedup-Tabelle für andere Videolängen.

Woher die Standorte kommen

Im Cabrillo-Log steht kein Locator der Gegenstation, also wird für jedes Rufzeichen nachgeschlagen – in dieser Reihenfolge:

  1. der lokale Cache aus vorherigen Läufen, inklusive der Negativtreffer
  2. HamDB, kostenlos und ohne Account
  3. die XML-API von QRZ.com, falls Zugangsdaten hinterlegt sind – die stopft die verbliebenen Lücken
  4. eine lokale Präfix-Tabelle als Fallback, schwerpunktmäßig für Region-1-Länder

Portable-Suffixe wie /P, /M oder /QRP werden vor der Abfrage abgeschnitten. Bleiben Rufzeichen übrig, die nirgends zu finden sind, zeigt -v sie an – dann landet die Verbindung eben auf dem Mittelpunkt des Präfixlandes statt an der Haustür des Gegenübers.

Ein Wort zur Entstehung

Die Idee zu dem Tool hatte ich schon länger im Kopf, um damit meine Videos zu bereichern, aber mangels Zeit ist sie nie umgesetzt worden. Dieses Jahr nach dem IARU-Region-1-Fieldday fiel sie mir wieder ein, und ich habe mich mit einem LLM an eine Umsetzung gewagt – das Video oben ist das Ergebnis.

Das Ganze ist ein Feierabendprojekt – „simple QSO animation script" steht nicht ohne Grund in der Projektbeschreibung. Und es ist vollständig in Zusammenarbeit mit KI entstanden. Das schreibe ich bewusst dazu, weil ich es für eine faire Information halte und weil sich daraus für dieses Projekt gleich eine Konsequenz ergibt.

Für ein Werkzeug dieser Größenordnung funktioniert das ausgesprochen gut: Die Aufgabe ist klar umrissen, das Ergebnis kann man sich buchstäblich ansehen, und wenn ein Bogen an der falschen Stelle landet, fällt das im Video sofort auf. Was die KI nicht abnimmt, ist die Entscheidung, was das Werkzeug überhaupt können soll – und der Blick darauf, ob das Ergebnis funkbetrieblich Sinn ergibt.

Mitmachen

Wer weitere Ideen hat, ist herzlich eingeladen, sie beizutragen. Issues und Merge Requests im GitLab-Projekt sind ausdrücklich willkommen.

Und ja: KI ist beim Beitragen ausdrücklich erlaubt. Ich möchte niemandem vorschreiben, mit welchem Werkzeug ihr entwickelt. Zwei Bedingungen habe ich allerdings, und die gelten unabhängig davon, ob eine KI beteiligt war:

  1. Die Änderung ist getestet – einmal mit einem echten Log durchlaufen lassen und das Ergebnis angesehen.
  2. Die bestehende Funktion bleibt heil. Was heute funktioniert, muss nach dem Merge Request weiter funktionieren. Bugfixes ausgenommen natürlich ;-)

Genauso freue ich mich über Rückmeldungen aus der Praxis: andere Contests, andere Logsoftware, Rufzeichen, die im Lookup durchrutschen.

Und falls ihr damit euren eigenen Fieldday, euer Portabelwochenende oder eure Contest-Saison animiert: Schickt mir gern den Link. Mich interessiert sehr, für welche Zwecke dieses Tool hilfreich ist.

73 und viel Spaß beim Auswerten, Heiko, DH3IKO