Tracker fuer die QRP Labs Assembled-Kits Warteliste (Fetcher + statisches Dashboard)
  • HTML 57.1%
  • Python 42.9%
Find a file
Phil 96eb791f86 QRP Labs Waitlist Tracker: Fetcher, CLI-Analyse und Dashboard
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 14:29:07 +02:00
.gitignore QRP Labs Waitlist Tracker: Fetcher, CLI-Analyse und Dashboard 2026-08-03 14:29:07 +02:00
Caddyfile.example QRP Labs Waitlist Tracker: Fetcher, CLI-Analyse und Dashboard 2026-08-03 14:29:07 +02:00
fetch.py QRP Labs Waitlist Tracker: Fetcher, CLI-Analyse und Dashboard 2026-08-03 14:29:07 +02:00
index.html QRP Labs Waitlist Tracker: Fetcher, CLI-Analyse und Dashboard 2026-08-03 14:29:07 +02:00
README.md QRP Labs Waitlist Tracker: Fetcher, CLI-Analyse und Dashboard 2026-08-03 14:29:07 +02:00
waitlist.py QRP Labs Waitlist Tracker: Fetcher, CLI-Analyse und Dashboard 2026-08-03 14:29:07 +02:00

QRP Labs Waitlist Tracker

Verfolgt die Position einer Bestellung auf der QRP Labs Assembled-Kits Warteliste und schätzt den Versandmonat. Besteht aus einem Fetcher für Cron und einem statischen Dashboard.

Nur Python-Stdlib, keine Abhängigkeiten. Charts im Dashboard kommen aus einem eingebetteten Chart.js.

Dateien

Datei Zweck
fetch.py Holt die Seite, parst Warteliste + Monatsstatistik, hängt einen Snapshot an data.json an. Für Cron gedacht.
waitlist.py Einmalige Analyse direkt im Terminal, schreibt nichts. python3 waitlist.py <order_id>
index.html Statisches Dashboard, lädt data.json per fetch() — braucht also einen Webserver, file:// funktioniert nicht.
config.json Wird von fetch.py angelegt, enthält die Order-ID. Nicht im Repo.
data.json Snapshot-Historie + Monatsstatistik, vom Fetcher geschrieben. Nicht im Repo.
Caddyfile.example Beispiel-vHost für das Dashboard.

Einrichtung

git clone https://git.syslinx.org/ituri/qrplabs-waitlist.git /var/www/waitlist
cd /var/www/waitlist

# einmalig: Order-ID setzen (wird in config.json gespeichert)
python3 fetch.py 119318

# danach ohne Argument
python3 fetch.py

Jeder Lauf hängt einen Snapshot an data.json an; die Historie ist die Datengrundlage der Verlaufsgrafiken im Dashboard.

Cron

Die Seite wird von QRP Labs typischerweise einmal am Tag aktualisiert — alle 6 Stunden reicht dicke:

0 */6 * * * cd /var/www/waitlist && python3 fetch.py >> /var/log/qrplabs.log 2>&1

Dashboard ausliefern

index.html und data.json müssen unter derselben URL liegen. Mit Caddy:

waitlist.example.com {
    root * /var/www/waitlist
    file_server
}

Zum schnellen Ausprobieren reicht auch:

python3 -m http.server 8000   # → http://localhost:8000

Wie geschätzt wird

  • Geräte davor: Alle Einträge oberhalb der eigenen Position, wobei Bestellungen mit mehreren (kommaseparierten) Seriennummern entsprechend mehrfach zählen.
  • Durchsatz: Aus der Monatsstatistik der Seite; als „realistisch" dient der Schnitt der letzten 3 Monate (Untergrenze 50/Monat). Dazu je ein pessimistisches (160/Monat) und optimistisches (300/Monat) Szenario.
  • Status: Taucht die Order-ID nicht mehr auf und liegt sie unter der kleinsten gelisteten ID, gilt sie als shipped. Liegt sie darüber, not_found (z. B. Bestellung nach dem letzten Seiten-Update).

Wartung

Beide Skripte parsen rohes HTML mit html.parser. Ändert QRP Labs den Tabellenaufbau, bricht das Parsing still ein: fetch.py meldet dann „Keine Einträge gefunden" und beendet sich mit Exit-Code 1, ohne data.json anzufassen. Anlaufstellen dafür sind parse_waitlist() (erwartet ≥5 Spalten: Position, Order-ID, Serial, Modell, Datum DD-Mon-YY) und parse_shipped_history() (Spalte 1 Month YYYY, Spalte 3 Stückzahl).