[{"content":"","date":"16.08.2026","externalUrl":null,"permalink":"/tags/badger2350/","section":"Tags","summary":"","title":"Badger2350","type":"tags"},{"content":"","date":"16.08.2026","externalUrl":null,"permalink":"/tags/e-paper/","section":"Tags","summary":"","title":"E-Paper","type":"tags"},{"content":"","date":"16.08.2026","externalUrl":null,"permalink":"/tags/hsm/","section":"Tags","summary":"","title":"Hsm","type":"tags"},{"content":"Es fing an wie die meisten meiner Projekte: Ich habe ein Gerät gesehen, das ich nicht brauchte, und mir überlegt, wofür ich es brauchen könnte.\nDas Gerät war ein Pimoroni Badger 2350 – ein E-Paper-Display mit RP2350, WLAN, Bluetooth und ein paar Knöpfen, gedacht als programmierbares Namensschild für Konferenzen. Der Anwendungsfall war schnell gefunden: Im Straßenbahnmuseum laufe ich an Fahrtagen ohnehin mit einem Schild herum. Warum nicht mit einem, das mehr kann als meinen Namen anzeigen?\nWarum E-Paper hier genau richtig ist # Ein Namensschild soll den ganzen Fahrtag durchhalten, und genau dafür ist E-Paper gebaut: Strom fließt nur beim Bildwechsel, danach steht das Bild von allein. Ein hinterleuchtetes Display wäre nach ein paar Stunden leer.\nPraktisch ist außerdem, dass die Daten nicht live kommen müssen. Das Museum hat keine flächendeckende WLAN-Abdeckung – aber das Gerät zieht sich seinen Fahrplan einmal, wo Empfang ist, und zeigt ihn dann offline an. Wenn ich doch frische Daten will, geht der Handy-Hotspot.\nZwei Einschränkungen habe ich unterwegs gelernt: Das WLAN kann nur 2,4 GHz, und Captive Portals funktionieren mit so einem Mikrocontroller praktisch nicht. Gäste-WLAN mit Login-Seite fällt also aus.\nWas drauf ist # Aus dem geplanten Namensschild sind am Ende vier Apps geworden.\nHSM Badge ist die eigentliche Museums-App. Mehrere Seiten, per Tasten durchblätterbar: Name und Rolle, der Fahrplan des Tages, ein Fahrgastzähler zum Mitzählen, Funkkanäle und Kontakte, Notfallinformationen und ein QR-Code für Besucher.\nVisitenkarte erzeugt den vCard-QR-Code direkt auf dem Gerät, hat einen Dunkelmodus und einen Präsentationsmodus – für Messen und Veranstaltungen außerhalb des Museums.\nWLAN-Check ist ein eigenständiges Diagnose-Werkzeug mit Fallback über mehrere hinterlegte Netze. Klingt banal, ist aber erstaunlich oft nützlich.\nIT-Crew ist die Arbeitsvariante: WLAN-Test, Erreichbarkeitsprüfung, ein per Code gesperrter WLAN-QR-Code zum Weitergeben, ein kleines Netzwerk-Spickzettelchen und Kontakte.\nDazu kam ein gepatchtes Menü, das eigene Anzeigenamen über eine name.txt unterstützt und Apps in fester Reihenfolge anpinnt.\nWo ich hängengeblieben bin # Der interessante Teil war nicht das Schreiben der Apps, sondern das Herausfinden, warum sie auf der echten Hardware anders liefen als gedacht.\nDie Firmware ruft init() nie auf. Das steht so in keiner Dokumentation, die ich gefunden habe. Wer seinen gespeicherten Zustand brav in einer init()-Funktion lädt, wundert sich, warum die App nach jedem Aufwachen wieder auf Seite null steht. State.load() gehört auf Modulebene.\nJede update()-Funktion muss mit badge.update() enden, gefolgt von wait_for_button_or_alarm(). Fehlt das, friert die App beim Öffnen ein. Zwei Zeilen, ein Nachmittag Fehlersuche.\nDer Simulator ist nicht die Hardware. Ich habe eine ganze Weile gegen den Simulator entwickelt, bis mir aufging, dass dessen Menü andere Importe benutzt als die echte Firmware. Ein Patch, der im Simulator sauber lief, hat das Gerät zuverlässig zerlegt. Seitdem gilt: Referenz ist das Firmware-Repository, nichts anderes.\nUnd dann war da noch uQR. Die QR-Bibliothek stürzte reproduzierbar mit einem Typfehler ab – irgendwo im Optimierungspfad, der intern Reguläre Ausdrücke benutzt und unter MicroPython Strings und Integer durcheinanderbringt. Die Lösung ist ein einziges Argument: add_data() mit optimize=0 aufrufen. Gefunden habe ich das nicht durch Nachdenken, sondern durch Ausprobieren.\nWas ich mitgenommen habe # Mikrocontroller-Entwicklung ist ein anderes Arbeiten als alles, was ich sonst mache. Kein Stacktrace, der einem sagt was los ist. Kein printf-Debugging, das nicht selbst das Timing verändert. Man baut eine Hypothese, flasht, wartet, schaut aufs Display und rät weiter.\nWas mir dabei gefällt: Am Ende steht ein Ding, das man anfassen kann. Und das an einem Fahrtag zwischen hundert Jahre alten Straßenbahnen hängt, während drinnen ein RP2350 rechnet. Diese Kombination hat was.\nStand # Läuft. Die vier Apps sind auf dem Gerät, das Menü ist gepatcht, und ich habe es bei mehreren Gelegenheiten getragen.\nWas noch offen ist: Der automatische Abgleich mit unseren Termindaten. Aktuell pflege ich den Fahrplan von Hand, was für ein System, das ich selbst geschrieben habe, ein bisschen peinlich ist.\n","date":"16.08.2026","externalUrl":null,"permalink":"/projekte/hsm-badge/","section":"Projekte","summary":"Aus einem Pimoroni Badger 2350 ist ein Namensschild fürs Museum geworden – mit Fahrplan, Fahrgastzähler und QR-Code. Und mit ein paar Lektionen über den Unterschied zwischen Simulator und echter Hardware.","title":"HSM-Badge: Ein E-Paper-Namensschild, das mitdenkt","type":"projekte"},{"content":"","date":"16.08.2026","externalUrl":null,"permalink":"/tags/micropython/","section":"Tags","summary":"","title":"Micropython","type":"tags"},{"content":"","date":"16.08.2026","externalUrl":null,"permalink":"/tags/pimoroni/","section":"Tags","summary":"","title":"Pimoroni","type":"tags"},{"content":"","date":"16.08.2026","externalUrl":null,"permalink":"/categories/projekte/","section":"Categories","summary":"","title":"Projekte","type":"categories"},{"content":"","externalUrl":null,"permalink":"/en/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/en/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"This is a private site with no commercial purpose. I don\u0026rsquo;t sell anything, don\u0026rsquo;t offer services and don\u0026rsquo;t make money here.\nGetting in touch # Email works best: philip@thephilluk.de. I don\u0026rsquo;t check it daily, but I do reply.\nCode and projects live on GitHub.\nIf something\u0026rsquo;s wrong # If you spot a mistake on this site – a broken link, a wrong instruction, a typo that hurts to look at – please let me know. I appreciate it more than it sounds.\nThe same applies if you think something is here that shouldn\u0026rsquo;t be. An email is faster than anything else and we\u0026rsquo;ll sort it out.\nAbout this site # Built with Hugo, hosted on my own server. No tracking, no cookies, no external scripts – see the privacy policy (German only).\n","externalUrl":null,"permalink":"/en/kontakt/","section":"Philip","summary":"","title":"Contact","type":"page"},{"content":"Notes from the server rack: setups, troubleshooting and the occasional thing that took an entire evening to figure out.\nAll articles here are written in German – you\u0026rsquo;ll find them under Homelab.\n","externalUrl":null,"permalink":"/en/homelab/","section":"Homelab","summary":"","title":"Homelab","type":"homelab"},{"content":" Hi. I\u0026rsquo;m Philip, a sysadmin from Hannover, Germany – and someone who stopped meaning \u0026ldquo;I\u0026rsquo;ll just have a quick look\u0026rdquo; literally a long time ago. During the day I look after networks, servers and the things that are supposed to work so nobody notices them. In the evening I do roughly the same again – voluntarily, with worse documentation and considerably more cables.\nWhat keeps me busy # Networking and infrastructure. Firewalls, VPN, routing, certificates. The part of the job you rarely get praised for and always get called about.\nProgramming. Python for anything that should be automated. Lua for FiveM servers. PHP, because it\u0026rsquo;s there.\nHomelab. An Unraid server, a Proxmox host, a few dozen containers and the firm intention to tidy all of it up one day. This is where the notes end up that I\u0026rsquo;ll have to explain to myself next time.\nGaming and simulation. From Kerbal Space Program through Farming Simulator to GTA roleplay. Mostly the kind of game where you read the manual voluntarily.\nVolunteering # I\u0026rsquo;m active at the Hannover Tram Museum in Sehnde-Wehmingen – where historic trams don\u0026rsquo;t just stand around, but actually run.\nMy role there is twofold. On the technical side: tools, apps and small systems for museum operations – e-paper badges, radio concepts, digital bits and pieces. On the operational side: as a regular member of the narrow-gauge railway crew, I help make sure there\u0026rsquo;s actually service on Sundays.\nA surprisingly good combination: hundred-year-old technology on one side, microcontrollers on the other.\nAbout this site # Under Projects I collect what I\u0026rsquo;m currently building. Under Homelab you\u0026rsquo;ll find notes from the server rack: setups, troubleshooting, things I figured out the hard way and don\u0026rsquo;t want to look up again.\nBoth updated irregularly. You know how it is.\nContact # Write to me at philip@thephilluk.de or have a look at GitHub.\n","externalUrl":null,"permalink":"/en/","section":"Philip","summary":"","title":"Philip","type":"page"},{"content":"The privacy policy for this site is available in German only. You\u0026rsquo;ll find it under Datenschutzerklärung.\nOnly the German version is legally binding.\nIf you have questions about how your data is handled and German isn\u0026rsquo;t an option for you, write to datenschutz@thephilluk.de and I\u0026rsquo;ll explain in English.\n","externalUrl":null,"permalink":"/en/datenschutz/","section":"Philip","summary":"","title":"Privacy Policy","type":"page"},{"content":"Things I\u0026rsquo;ve built, broken and occasionally finished.\nAll articles here are written in German – you\u0026rsquo;ll find them under Projekte.\n","externalUrl":null,"permalink":"/en/projekte/","section":"Projects","summary":"","title":"Projects","type":"projekte"},{"content":"","externalUrl":null,"permalink":"/en/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"Eine Liste von Dingen, die ich benutze. Nicht weil sie die besten sind, sondern weil sie funktionieren und ich mich dran gewöhnt habe.\nArbeitsplatz # Hel ist der Hauptrechner: Ryzen 9 5950X, 64 GB RAM, RTX 3060 Ti. Läuft unter Windows, das eigentliche Arbeiten passiert aber in WSL2. Die 16 Kerne sind Überschuss für das meiste, zahlen sich aber aus, sobald irgendwas kompiliert oder mehrere VMs gleichzeitig laufen.\nMacBook Pro (2022) für unterwegs und alles, wo ich nicht am Schreibtisch sitze.\nDazu eine Ducky One 3 RGB, eine Logitech G502 Hero und ein SteelSeries Arctis Nova Pro.\nSoftware # Vim ist der Editor auf der Kommandozeile, und das ist da auch der Normalfall – die meiste Arbeit passiert im Terminal. VS Code kommt dazu, wenn ein Projekt groß genug wird, dass ich mehr als drei Dateien gleichzeitig im Blick haben will.\nZsh mit angepasstem Oh My Zsh als Shell. Die Konfiguration liegt in einem privaten Repo und wird per ansible auf alle Maschinen verteilt – das erspart mir, auf jedem neuen System wieder von vorn anzufangen.\nFirefox als Browser, Obsidian für Notizen. Obsidian vor allem, weil die Notizen einfach Markdown-Dateien auf der Platte sind und nicht in irgendeiner Datenbank verschwinden.\nHomelab # Thor ist der Server: ein ODROID-H3 mit Pentium Silver N6005 und 16 GB DDR4. Klein, sparsam, und für einen Heimserver völlig ausreichend. Der überwiegende Teil der selbstgehosteten Dienste läuft hier.\nLoki ist der Proxmox-Host. Ein AMD A4-9125 mit knapp 4 GB RAM – deutlich schwächer als Thor und mit dauerhaft hoher Speicherauslastung, aber für ein paar kleine VMs reicht es. Der Ersatz steht auf der Liste. Wie so vieles.\nWas genau darauf läuft, wäre eine eigene Seite. Kurz gesagt: eine ganze Menge, und regelmäßig kommt etwas dazu.\nDiese Seite # Gebaut mit Hugo und dem Blowfish-Theme, deployed über GitHub Actions auf einen vServer bei Hetzner. Statisch, ohne Tracking, ohne Datenbank.\n","externalUrl":null,"permalink":"/setup/","section":"Philip","summary":"","title":"Setup","type":"page"},{"content":"","externalUrl":null,"permalink":"/en/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"}]