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:
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:
- der lokale Cache aus vorherigen Läufen, inklusive der Negativtreffer
- HamDB, kostenlos und ohne Account
- die XML-API von QRZ.com, falls Zugangsdaten hinterlegt sind – die stopft die verbliebenen Lücken
- 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:
- Die Änderung ist getestet – einmal mit einem echten Log durchlaufen lassen und das Ergebnis angesehen.
- 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
Kommentare
Kommentiere diesen Beitrag mit deinem Fediverse-Account, indem du auf den zugehörigen Toot antwortest:
– Favoriten – geteilt