Einleitung
Im Amateurfunk ist eine gute Dokumentation der geführten QSOs essenziell. Neben der digitalen Archivierung stellt sich für viele Funkamateure auch die Frage, wie diese Statistiken optisch ansprechend und gut sichtbar dargestellt werden können. In meinem Funkraum habe ich hierzu die „Ulanzi TC001 Pixelclock“ mit der alternativen Firmware „Awtrix“ eingesetzt. Diese ermöglicht es, diverse Daten auf einem LED-Display anzuzeigen. In diesem Artikel beschreibe ich, wie ich mit Hilfe von Wavelog, ioBroker und Awtrix eine automatische Anzeige meiner QSO-Statistiken realisiert habe.
Hardware und Software
Für die Umsetzung dieses Projekts nutze ich folgende Komponenten:
- Ulanzi TC001 Pixelclock mit der alternativen Firmware Awtrix
- Wavelog als Logbuchsoftware mit API-Schnittstelle
- ioBroker als zentrale Plattform zur Datenverarbeitung
- JavaScript-Adapter innerhalb ioBroker zur Datenabfrage und -speicherung
Anbindung von Wavelog über die API
Dank der API von Wavelog lassen sich meine Logbuchdaten automatisiert abrufen. Hierfür wird in Wavelog ein Read-Only API-Schlüssel generiert, der einen sicheren Zugriff auf die QSO-Statistiken ermöglicht. Dies geschieht über folgende Schritte:
- Erstellung eines API-Schlüssels in Wavelog mit Lesezugriff.
- Notieren der URL zur API, der eigenen Station ID (meist „1“) sowie des API-Schlüssels.
- Implementierung eines Skripts in ioBroker, welches die Daten zyklisch abruft.

Einbindung in ioBroker
In ioBroker habe ich eigene Datenpunkte für meine QSO-Statistiken erstellt. Diese erfassen die Gesamtzahl meiner QSOs sowie die Summen der QSOs in den Betriebsarten SSB, FM, CW, RTTY, FT8, FT4 und PSK:
javascript.0.Wavelog.totalqso
javascript.0.Wavelog.SSB_QSOs
javascript.0.Wavelog.fmqso
javascript.0.Wavelog.rttyqso
javascript.0.Wavelog.ft8ft4qso
javascript.0.Wavelog.pskqso
javascript.0.Wavelog.digiqso
javascript.0.Wavelog.cwqso
Das folgende JavaScript wird innerhalb des JavaScript-Adapters von ioBroker eingesetzt und läuft automatisch alle 10 Minuten. Das immer aktuelle Script findet sich hier auf Github.
const request = require('request');
// Wavelog API-settings
const WAVELOG_URL = "https://urlzumlogbuch.de/index.php/api/get_contacts_adif";
const API_KEY = "demoapikey";
const STATION_PROFILE_ID = "1";
// Function for retrieving and processing data
function runScript() {
const options = {
url: WAVELOG_URL,
method: "POST",
json: true,
body: {
key: API_KEY,
station_id: STATION_PROFILE_ID,
fetchfromid: 0
}
};
request(options, (error, response, body) => {
if (error) {
console.error("Error in API query:", error);
return;
}
if (!body || !body.adif) {
console.error("Error: No ADIF data received.");
return;
}
const adifData = body.adif;
// Count all QSOs
const totalQso = (adifData.match(/<CALL:/g) || []).length;
// Count SSB-QSOs
const ssbCount = (adifData.match(/<MODE:\d+>SSB/g) || []).length;
// Count FM-QSOs
const fmCount = (adifData.match(/<MODE:\d+>FM/g) || []).length;
// Count RTTY-QSOs zählen
const rttyCount = (adifData.match(/<MODE:\d+>RTTY/g) || []).length;
// Count FT4 & FT8 QSOs summed up
const ft4ft8Count = ((adifData.match(/<MODE:\d+>FT8/g) || []).length) +
((adifData.match(/<MODE:\d+>FT4/g) || []).length);
// Count PSK-QSOs
const pskCount = (adifData.match(/<MODE:\d+>PSK/g) || []).length;
// Count CW-QSOs
const cwCount = (adifData.match(/<MODE:\d+>CW/g) || []).length;
// Count JS8-QSOs
const cwCount = (adifData.match(/<MODE:\d+>JS8/g) || []).length;
// Count Digimode-QSOs (all digital Modes)
const digiModes = ["FT8", "FT4", "PSK", "RTTY", "JT65", "JS8","JT9", "OLIVIA", "CONTESTI", "ROS"];
let digiCount = 0;
digiModes.forEach(mode => {
digiCount += (adifData.match(new RegExp(`<MODE:\\d+>${mode}`, "g")) || []).length;
});
console.log(`Total QSOs: ${totalQso}, SSB: ${ssbCount}, FM: ${fmCount}, RTTY: ${rttyCount}, FT8+FT4: ${ft4ft8Count}, PSK: ${pskCount}, CW: ${cwCount}, JS8: ${js8Count}, Digi: ${digiCount}`);
// Write values in io.Broker datapoints
setState("javascript.0.Wavelog.totalqso", totalQso, true);
setState("javascript.0.Wavelog.SSB_QSOs", ssbCount, true);
setState("javascript.0.Wavelog.fmqso", fmCount, true);
setState("javascript.0.Wavelog.rttyqso", rttyCount, true);
setState("javascript.0.Wavelog.ft8ft4qso", ft4ft8Count, true);
setState("javascript.0.Wavelog.pskqso", pskCount, true);
setState("javascript.0.Wavelog.digiqso", digiCount, true);
setState("javascript.0.Wavelog.cwqso", cwCount, true);
setState("javascript.0.Wavelog.js8qso", cwCount, true);
});
}
// Start Skript automatically
runScript();
// Automatic repeat interval (every 10 minutes)
schedule("*/10 * * * *", function () {
runScript();
});
Dieses Skript ruft die aktuellen QSO-Statistiken von Wavelog ab und speichert sie in den zuvor erstellten Datenpunkten in ioBroker.


Visualisierung auf der Awtrix-Uhr
Der ioBroker bietet einen Awtrix-Adapter, mit dem die Daten aus den erstellten Datenpunkten auf die Ulanzi TC001 Pixelclock übertragen werden können. Hier kann definiert werden:
- Welche Werte angezeigt werden sollen
- Textfarbe und Darstellungszeit
- Symbole und Hintergrundanimationen
Beispielsweise kann die Darstellung so konfiguriert werden, dass die Gesamtzahl der QSOs sowie die Summen pro Betriebsart rollierend auf dem Display erscheinen. Hier die Konfiguration für die Anzeige des Datenpunktes „javascript.0.Wavelog.totalqso“


Fazit
Mit dieser Lösung habe ich eine komfortable und automatisierte Anzeige meiner QSO-Statistiken realisiert. Die Kombination aus Wavelog, ioBroker und der Awtrix-Uhr ermöglicht eine einfache Visualisierung direkt im Shack. Dieses Setup kann leicht angepasst und erweitert werden, z. B. um weitere Betriebsarten oder eine Filterung nach Band. So bleibt der Funkbetrieb nicht nur gut dokumentiert, sondern er wird auch optisch ansprechend präsentiert.


2044