KAC: Ein kleiner Würfel wird zur Statusanzeige für Netz, Firewall und NAS
Zusammenfassung
Im Oktober 2026 habe ich dem GeekMagic SmallTV Ultra, einem würfelförmigen WLAN-Display mit ESP8266, eine eigene Firmware geschrieben: KAC, den KleinerAnzeigeComputer. Er zeigt im Wechsel den Durchsatz meiner beiden Internetleitungen, den Zustand der Firewall und die Platten des NAS, flackert nicht und strahlt im Betrieb kein offenes WLAN aus. Die Firmware lässt sich direkt über die Update-Seite der Werksfirmware aufspielen, und dieser Beitrag zeigt, wie ein eigenes Dashboard dafür entsteht.
Das Gerät
Der SmallTV Ultra von GeekMagic ist ein kleiner Würfel mit einem IPS-Display. Innen arbeiten ein ESP8266 als ESP-12F-Modul mit 4 MB Flash und rund 80 KB Arbeitsspeicher sowie ein IPS-Panel mit 240 × 240 Pixeln und ST7789-Controller. Strom kommt über USB-C, eine serielle Schnittstelle gibt es nur über Lötpunkte im Gehäuse.
Ab Werk zeigt er Uhrzeit, Wetter und Bilder. Eingerichtet wird er über ein offenes WLAN namens GIFTV, danach holt er sich seine Daten aus dem Netz. Eigene Werte lassen sich nicht anzeigen, und genau das wollte ich: Upload und Download meiner beiden Internetzugänge, auf einen Blick neben dem Monitor.


Erster Anlauf: eine fremde Firmware mit Haken
Zuerst habe ich die alternative Firmware u1pns/smalltv-ultra ausprobiert. Sie kann Panels anzeigen, also Seiten, die ein Programm im Netz schickt, und das funktionierte auf Anhieb. Zwei Dinge störten aber: Jede neue Seite zeichnet den ganzen Bildschirm neu, was bei Messwerten im Sekundentakt unruhig aussieht. Und das Gerät strahlt dauerhaft einen eigenen Zugangspunkt aus, mit dem fest eingebauten Passwort 12345678.
Das ist dort bewusst so gebaut: Der Zugangspunkt gehört zum Rettungsmodus und soll sicherstellen, dass man das Gerät immer erreicht. Abschalten lässt er sich nicht, und auch die Zugangsdaten der Weboberfläche sind fest im Image. Wer in Funkreichweite ist, kann sich also verbinden und eine beliebige Firmware aufspielen. Das wollte ich in meinem Netz nicht haben.
Eigene Firmware: der Bootloader entscheidet
Also eine eigene Firmware, geschrieben mit dem Arduino-Core für den ESP8266, der Grafikbibliothek TFT_eSPI und ArduinoJson. Die Pinbelegung des Displays stammt von der ESPHome-Geräteseite für dieses Modell: Hardware-SPI an GPIO14 und GPIO13, DC an GPIO0, Reset an GPIO2, kein Chip-Select, SPI-Modus 3, Hintergrundbeleuchtung invertiert an GPIO5.
Spannend war die Frage, wie die Firmware auf das Gerät kommt, ohne das Gehäuse zu öffnen. Ein Arduino-Image für den ESP8266 beginnt mit einem kleinen Bootloader namens eboot, die eigentliche Anwendung liegt dahinter ab Adresse 0x1000. Ich habe die Images verglichen: Die Werksfirmware V9.0.50, die alternative Firmware und mein eigener Build mit PlatformIO und dem Arduino-Core 3.1.2 haben in den ersten 4096 Bytes einen byte-gleichen Bootloader und denselben Flash-Header (DIO, 4 MB, 40 MHz).
Damit nimmt die Update-Seite der Werksfirmware das eigene Image einfach an. Begrenzt ist nur der Platz: Neben der laufenden Werksfirmware bleiben nach meiner Abschätzung rund 500 KB frei, KAC braucht etwa 390 KB. Ausprobiert habe ich das an einem zweiten, baugleichen Gerät mit Werksfirmware V9.0.51: Datei hochladen, „Update Success! Rebooting...“, fertig.
curl -F "firmware=@firmware.bin" http://<gerät>/updateEinrichtung ohne Standardpasswort
Im Betrieb ist KAC nur WLAN-Client und strahlt nichts aus. Für die Einrichtung dient der Stromstecker, eine Idee aus der alternativen Firmware, die damit ihren Rettungsmodus startet: Wer fünfmal hintereinander kurz den Strom trennt, jeweils nach weniger als zehn Sekunden, startet den Einrichtungsmodus. Ein Zähler im Flash merkt sich die kurzen Starts, läuft das Gerät länger, setzt er sich zurück.
Dann öffnet das Gerät ein WLAN namens KAC und den letzten drei Bytes seiner MAC-Adresse, etwa KAC-4670fa. Das Passwort ist zehn Zeichen lang, wird bei jedem Mal neu zufällig erzeugt und steht nur auf dem Display. Wer es lesen will, muss also vor dem Gerät stehen. Nach dem Speichern startet KAC neu und der Zugangspunkt ist weg, ohne Eingabe nach 15 Minuten ebenfalls.

Flackerfrei: Zeilen im Speicher zeichnen
Gegen das Flackern hilft ein einfacher Trick. Die Anzeige besteht aus einer Kopfzeile und acht Zeilen à 25 Pixel. Das Gerät merkt sich, was in jeder Zeile steht, und zeichnet nur Zeilen neu, die sich geändert haben. Eine geänderte Zeile entsteht zuerst vollständig in einem Zwischenspeicher, einem sogenannten Sprite, und wird dann in einem Stück übertragen. Es wird also nie sichtbar gelöscht.
Weil der Arbeitsspeicher knapp ist, hat der Sprite nur 8 Bit Farbtiefe: 3 Bit Rot, 3 Bit Grün, 2 Bit Blau. Das hat mich prompt einen Fehler gekostet. Mein Dunkelgrau für den leeren Teil der Balken hatte so wenig Blau, dass es auf null abgerundet wurde, und übrig blieb Oliv. Seitdem sind alle Farben so gewählt, dass sie die Reduktion auf 8 Bit überstehen. Ein zweiter Fehler fiel erst auf dem Foto auf: Die äußersten Pixel am rechten Rand verdeckt das Gehäuse, rechtsbündiger Text endet deshalb jetzt einige Pixel früher.
Mit dieser Technik verträgt die Anzeige Aktualisierungen im Sekundentakt, ohne zu flackern. Uhrzeit und Datum stellt das Gerät selbst per NTP, den Seitenwechsel übernimmt es auch: Welche Seite gerade dran ist, ergibt sich aus der Uhrzeit.
Das Dashboard
Die Daten schickt ein kleines Python-Programm auf meinem Administrationsrechner, alle fünf Sekunden als JSON per HTTP. Der Schlüssel dafür steht nur in einer Konfigurationsdatei, ohne ihn antwortet das Gerät mit 403. Es gibt drei Seiten:
- Internet: für beide Leitungen Download und Upload als Balken, die Latenz über IPv4 und IPv6, dazu die Zahl der aktiven Clients, die Latenz des VPN und das Datenvolumen seit Mitternacht.
- Firewall: Temperatur, CPU und RAM der OPNsense, offene Verbindungen, neue Verbindungen pro Sekunde, Quell- und Zieladressen, Prozesse und geblockte Pakete pro Stunde.
- NAS: RAID-Status, Belegung, und je Platte Temperatur, Betriebsstunden, CRC-Fehler und defekte Sektoren, gelesen per SSH und smartctl.
Die Werte der Firewall kommen über deren API, mit einem eigenen Benutzer, der nur drei Leserechte hat: Traffic, System Health und ARP-Tabelle. Den Durchsatz berechnet das Programm aus der Differenz zweier Bytezähler, Latenzen und Tagesvolumen stammen aus den Verläufen, die OPNsense ohnehin aufzeichnet. Störungen färben eine Zeile rot, etwa ab fünf Prozent Paketverlust auf einer Leitung.
Nebenbei hat die NAS-Seite schon etwas gefunden: Eine der beiden Platten meldet 182 CRC-Fehler, also Übertragungsfehler zwischen Platte und Controller. Das passt zu Abstürzen, die das NAS aus dem Beitrag über die EX2 Ultra inzwischen beim gleichzeitigen Anlaufen beider Platten hatte, und zum Verdacht auf ein schwaches Netzteil.
Der QR-Code auf dem Gerät
Solange keine Daten kommen, zeigt KAC eine Info-Seite: Version, IP-Adresse, WLAN und Signalstärke. Darunter steht ein QR-Code zu diesem Beitrag. Wer ein Gerät mit KAC in die Hand bekommt, findet so die Anleitung, ohne zu wissen, wo er suchen muss.

Nachbauen
Firmware, Dashboard-Programm und eine ausführliche Anleitung liegen auf GitHub, unter der GPL-3.0. Die Schritte:
- PlatformIO installieren und einen geheimen Geräteschlüssel erzeugen, zum Beispiel mit
python3 -c 'import secrets;print(secrets.token_hex(16))'. - Bauen mit
KAC_TOKEN=<schlüssel> pio run. Ohne Schlüssel bricht der Bau ab, damit nie ein Gerät mit leerem Update-Passwort entsteht. - Das Image über die Update-Seite der Werksfirmware hochladen, im Feld „firmware“.
- Der Einrichtungsbildschirm erscheint: mit KAC-<Chip-ID> verbinden, http://192.168.4.1/ öffnen, WLAN wählen, Passwort eintragen.
- Seiten schicken, zum Beispiel mit curl oder dem Python-Programm aus dem Repository.
curl -X POST http://<gerät>/api/seiten -H "X-Token: $KAC_TOKEN" \
-d '{"seiten":[{"t":"Test","z":[{"y":"h","l":"Hallo","v":"Welt"},
{"y":"b","l":"CPU","p":42,"v":"42 %"}]}]}'Eine Seite hat bis zu acht Zeilen. Es gibt Überschriften, Bezeichnung mit Wert, Balken mit Pfeil für Down- und Upload und Balken mit Bezeichnung. Die Schriften kennen nur ASCII und das Gradzeichen, Umlaute schreibt man deshalb als ae, oe und ue.
Was du mitnehmen kannst
- Vergleiche vor dem Flashen einer eigenen Firmware die ersten 4 KB der Images: Ist der Bootloader gleich, nimmt der vorhandene Updater das Image oft an.
- Prüfe bei alternativer Firmware, welche Zugänge sie dauerhaft öffnet. Ein fest eingebautes Passwort ist im eigenen Netz ein offenes Tor.
- Zeichne auf kleinen Displays zeilenweise in einen Zwischenspeicher, dann flackert nichts, auch bei Aktualisierungen im Sekundentakt.
- Gib einem Dashboard-Programm einen eigenen API-Benutzer mit reinen Leserechten statt eines Admin-Zugangs.
Zahlen im Überblick
- Der SmallTV Ultra hat einen ESP8266 (ESP-12F) mit 4 MB Flash und ein 240 × 240-Display mit ST7789-Controller.
- KAC ist rund 390 KB groß und belegt damit etwa 37 Prozent des Platzes für die Anwendung.
- Werksfirmware, alternative Firmware und KAC haben einen byte-gleichen Bootloader in den ersten 4096 Bytes.
- Die Einrichtung startet nach fünf kurzen Stromunterbrechungen, das WLAN-Passwort hat zehn zufällige Zeichen und gilt höchstens 15 Minuten.
- Das Dashboard schickt alle fünf Sekunden neue Werte, das Gerät schreibt dabei nichts in den Flash.
Referenzen
- KAC auf GitHub: Firmware, Dashboard und Anleitung
- GeekMagic: Werksfirmware des SmallTV Ultra
- ESPHome-Geräteseite GeekMagic Ultra (Pinbelegung)
- u1pns/smalltv-ultra: alternative Firmware
- TFT_eSPI: Grafikbibliothek
- Arduino-Core für den ESP8266
- WD My Cloud EX2 Ultra: OpenWrt, ein Brick und ein Flipper als Retter
Bemerkungen
- Auf den SmallTV Ultra hat mich Thomas gebracht, der mir das Gerät empfohlen hat.
- Den Namen KleinerAnzeigeComputer hat meine Frau beigesteuert. Ich hatte gefragt, wie man das Gerät kurz beschreiben würde, und die Antwort passte so gut, dass sie geblieben ist. Im Netz nennt sich jedes Gerät KleinerAnzeigeComputer mit seiner Chip-ID.
- Firmware, Dashboard und Tests hat mein SoftwareSklave geschrieben und ausgeführt, die Ideen, das Layout und die Entscheidungen lagen bei mir. Die Fotos sind mit dem Handy entstanden und zeigen teils ältere Versionen.
Links zur Originalquelle und zum Webarchiv öffnen einen neuen Tab.