UART-Logging mit Linux

Eine einfache aber blöde Problematik: Plasterouter stürzen ab und man kann nicht schnell hingehen.

In unseren Flüchtlingsunterkünften stehen Accesspoints mit Freifunk-Firmware herum, genauer gesagt handelt es sich um Xiaomi Mi Router 4A Gigabit Edition.

Gute Preis/Leistung, für um die 25 Euro (zumindest im Frühsommer 2022) bekommt man bei ffmuc zumindest theoretisch um die 90 Mbit/s durch. (Theoretisch, weil ich den Messwert hier via WLAN nicht bestätigen konnte).

Abgesehen von der etwas umständlichen Installation von zuerst OpenWrt (und dem etwas umständlichen jailbreak via OpenWRTInvasion, dem durchklickern durch ein chinesisches WebUI im Router und der Gefahr, dass man eine Version mit inkompatiblem SPI-Flash erwischt oder einer zu neuen Firmware erwischt oder sich das Teil beim Downgrade erst einmal brickt) und dann der Freifunk-Firmware, bei der dann erst einmal kein WiFi funktionierte und man die experimental-Version des images verwenden muss (Vielen Dank für die schnelle und tolle Unterstützung an die ffmuc-Community!) funktioniert das Teil recht gut, bis auf…

…tja, bis auf der Tatsache, dass die Plastikboxen ab und zu abschmieren. Mit crontab lässt sich ein Autoreboot in der Nacht einrichten, in anderen Situationen konnte ich mich über die anderen Knoten zu den teilabgeschmierten durchhangeln und rebooten. Manchmal – und dann natürlich vermehrt an den Standorten an denen sie hinter verschlossenen Türen stehen – knallen die Dinger aber so weg, dass man hinfahren und den Stecker ziehen muss. Noch blöder, wenn es beide machen.

Was macht man in diesem Fall? Natürlich herausfinden warum. Problem: Man kommt über Netzwerk nicht an die Konsole, weil tot. Also muss was externes ran.

Auf das Gehäuse und UART suchen – den es natürlich gibt. 4 Pins, beschriftet, fein:

Die Wege fürs Logging sind vielfältig, der Einfachheit halber wollte ich schon einen OpenLog bestellen – da muss man aber auch wieder fahren um die Daten zu holen und wenn’s dumm läuft ist etwas schief gegangen.

Auf der anderen Seite liegen mehr als genügend Raspberry Pis herum, die den Job übernehmen können.

Schritt 1 für sinnvolles Logging: Heartbeats. Auf dem Knoten kommt eine zusätzliche Zeile in crontab, die jede Minute die aktuelle Systemzeit ausgibt:

* * * * * echo "::Systime:: $(date)" > /dev/kmsg

Auf der Raspi-Seite ist es schon ein bisschen schwieriger – denke ich zumindest. Das Problem sollte eigentlich vorhanden und gelöst sein. Unter Windows kann das Putty super easy, aber es soll Linux und ohne Klickibunti sein. Ein Python-Script dafür zu schreiben ist mir zu blöd. Miniterm? Hm, scheint es nicht zu können. Nach längerer Suche stolpere ich (wieder) über screen – dem Schweizer Taschenmesser, wenn man zu blöd für services ist.

Und es hat auch hier eine Lösung parat, die man sich zusammenbasteln kann. Interaktiv wächst ein Befehl, der erst einmal überhaupt nicht funktioniert, bis die Erkenntnis kommt, dass zuerst die Parameter zur Konfiguration der Session und dann der Pfad zum TTY erfolgen muss. Mit der Zeit und nach einigen Tabs im Browser später ist folgender Kommandozeilenbefehl entstanden:

screen -S mimon -L -Logfile /home/pi/mimon/mimon_%Y.%m.%d_%c.log /dev/ttyUSB0 115200

Dieser startet eine Session namens mimon, aktiviert das Logging in die Logfile nur echt im py home directory mit aktuellem Datum und Uhrzeit für ttyUSB0 mit 115200 Baud.

Flutscht. Nur soll für jeden Tag eine neue Log entstehen. Bei dem Test inkl. Uhrzeit funktioniert das natürlich nicht, weil der String nur beim Start geparst wird.

Ein wenig Superuser-Browsing später ist die Erkenntnis erlangt, dass man die Session-Parameter auch zur Laufzeit ändern kann.

screen -XS mimon logfile /home/pi/mimon/mimon_%Y.%m.%d_%c.log

funktioniert auf der Konsole, als cronjob aber nicht. Zumindest nicht ganz – Datum und Uhrzeit fehlen. Eine Escaping-Runde später funktioniert auch das. Jetzt muss nur noch screen beim Reboot starten. der Befehl von oben – natürlich ebenfalls mit Escaping geht nicht, was vermutlich damit zusammenhängt, dass die Session direkt aufgeht und interaktiv wird. Wieder mit der Hilfe von Stackoverflow (wie entwickelt man heute eigentlich noch offline und wie hat man das früher geschafft?) landet folgende Zeile in crontab:

@reboot screen -dmS mimon -L -Logfile /home/pi/mimon/mimon_\%Y.\%m.\%d_\%c.log /dev/ttyUSB0 115200

…die natürlich wieder nicht funktioniert. Keine Typos, ohne das Escaping funktioniert interaktiv alles. Die erste Idee: Zeit. Keine Ahnung, wann im Bootprozess @reboot loslegt und für die Anwendung auch weniger relevant. Die Lösung: 30 Sekunden warten – das gibt dem System auch Gelegenheit, den NTP zu fragen, welche Stunde geschlagen hat.

Bereit für die finalen Crontab-Zeilen? Let’s go:

@reboot sleep 30 && screen -dmS mimon -L -Logfile /home/pi/mimon/mimon_\%Y.\%m.\%d_\%c.log /dev/ttyUSB0 115200
0 * * * * screen -XS mimon logfile /home/pi/mimon/mimon_\%Y.\%m.\%d_\%c.log

So wird jede Stunde eine neue Logdatei angelegt, wodurch man – auch dank des Graphana-Dashboards – die Crashes recht schnell eingrenzen können sollte.

Mal sehen, wann es wieder soweit ist und was die Logs sagen.

Allerdings könnte es sich erübrigt haben – da vor ein paar Tagen eine neue Firmware ausgerollt wurde.

Kommt ein Oszilloskop von Saleae?

Wer mich kennt weiß, dass ich ein großer Fan von Saleae Logic Analyzern bin. Auch wenn in der Logic 2 Software IMHO noch einige wichtige Features, gerade hinsichtlich der Dokumentation, fehlen, wächst und gedeiht die Software ganz ordentlich.

Eher durch Zufall habe ich nun entdeckt, dass die neue Version endlich wieder Automatisierung unterstützt, lediglich beim Blick in die Dokumentation gab es ein kurzes Stutzen – bei einem Screenshot zu „Finding the Serial Number of a Device“ ist das Menü zur Auswahl der Demo-Geräte zu sehen, darunter ein Eintrag „[Demo] Mso“:

Auszug aus der offiziellen Automation Documentation, abgerufen am 29.07.2022

Huch? Jeder, der in Sachen Elektronik bzw. Messtechnik bewandert ist, kennt diese Abkürzung: Mixed Signal Oscilloscope.

Auch wenn die Logics (oder Pods, wie sie vom Hersteller genannt werden) Analog sampeln können, gibt/gab es bis dato keinen Scope-View. Zum einen Schade, zum anderen aber auch verständlich: mit der -3 dB-Bandbreite von lediglich 5 MHz kann man erstaunlich wenig reißen – besser als die meisten Hosentaschen-Oszis wäre es allgemein. Aber irgendwo kann ich den Ansatz auch entstehen: Es ist eher ein schneller Logger als ein langsames Oszi, zudem muss man beachten, wo die Software her kommt.

Nichts desto weniger wäre der Schritt in Richtung Oszilloskop gar nicht so abwegig, auf Seiten des digitalen Pfad ist Know-How vorhanden, in Sachen Software auch – durch die Analog-Funktionalität der aktuellen Generationen ist auf jeden Fall schon mal ein Schuh in der Tür.

Müsste ich einen Tipp abgeben, würde ich auf einen auf einen Angriff in Richtung 3000er-Serie von Pico Technology tippen, also 2-4 Kanäle, 100 MHz, 1 GS/s und um 10 bit tippen. Aber das ist natürlich reine Spekulation.

Mal schauen, ob und wenn ja was da kommt.

Nachschlag vom 30.08.2022:

Ein Vögelchen kam mit folgendem Bild aus den Anwendungsressourcen aus einer aktuellen Logic-Installation (2.3.58) zugeflogen:

Also schon einmal vier Kanäle und eine Farbgebung und -reihung der Kanäle, die mich an die der großen Hersteller erinnert.

Chapeau, Canon! Der MG6150 bleibt stark.

Man kennt die Geräte, die man immer wieder kaufen würde, egal wie überholt sie mittlerweile sind. Meine aktuelle Knipse ist da so ein Kandidat (die ich selbst dem Nachfolger bevorzugen würde). Bei Laserdruckern wäre das ganz klar mein Brother, den ich mir zum Studium zulegte und noch nie aus eigenem Antrieb mucken machte (der Papierstau mit dem Briefumschlägen sei ihm verziehen). Allerdings hatte der in den knapp 10 Jahren auch nur einen Toner und somit unter 10000 Seiten durch.

Bei Tintenstrahldruckern und Scannern sind meine Favoriten – vermutlich auch ein wenig der Nostalgie geschuldet – der Agfa SnapScan 600 und der Canon BJC-7000. Vermutlich auch, weil es die ersten Geräte waren, auf die ich Zugriff hatte. Gefühlt ist der Scanner noch immer der schnellste – auch bei hohen Auflösungen – den ich je erlebt habe. Eine Krankheit bei dem Teil war das Nachlassen der Helligkeit der verbauten Leuchtstofflampe (vor allem, wenn man vergessen hat das Scanprogramm zu beenden). Mit LED-Beleuchtung heute kein wirkliches Problem mehr, aber Agfa zählte die glücklicherweise wohl zu den user-servicable parts: Mit einem Kugelschreiber konnte man die Glasplatte herunternehmen (und sie bei der Gelegenheit auch innen putzen), lediglich eine kleine Plastikblende verdeckte die T5-Leuchtstoffröhre, die es in jedem Elektromarkt für 8 Mark (oder Euro, Umrechnung vermutlich 1:1) gab. Weißabgleich laufen lassen und das Teil werkelte wieder für ein paar Jahre.

Der BJC-7000 hatte zwei geniale Eigenschaften: riesige Tintenpatronen und eine Fixiereinheit.

Mein Vater druckte damit Klassensätze und brauchte vielleicht vielleicht 3 oder 4 Patronen im Jahr, dank Fixiereinheit hätte man die Dokumentenauflage durch ein Wasserbecken ersetzen können. Das Papier wäre dann zwar wellig, aber der Druck blieb dank Lackschicht sauber. Die Druckqualität war für damalige Verhältnisse erstklassig – nicht nur, weil es optional auch eine 6-farbige Patrone für Halbtondruck von CMY gab.

Danach kam länger nichts und dann der Canon iP3000, mit relativ vielen Features (IIRC Duplexdruck, CD-Druck) und sehr günstig im Verhalten.

Heute habe ich allerdings einen neuen Meister gefunden – und das, obwohl ich kein Freund von Multifunktionsgeräten bin. Der Canon MG6150. Allerdings begrüßte er mich erst einmal mit einem Fehler: 5B00, Tintenrestbehälter voll. Schon länger hat er davor gewarnt, jetzt ging er final in den Streik.

Nach einem längeren Kampf, das Teil in den Servicemode zu versetzen – die Anleitung auf easyfixs.blogspot.com ist leider etwas irreführend: Man darf nicht die Powertaste beim Einstecken des Stromes halten und dann x-mal auf Stopp drücken (und danach die Powertaste loslassen), sondern muss wie folgt vorgehen (Gedächtnisprotokoll, habe das Gerät nicht hier):

  1. Unbeleuchtete Stop-Taste suchen, drücken und halten
  2. Powertaste drücken und halten
  3. Stop-Taste (noch immer unbeleuchtet) loslassen
  4. Stop-Taste n-mal (IIRC 5 oder 6x) drücken (Modellabhängig, je nachdem ob das Modell der MG6000er-Serie einen Scanner hat oder nicht), die Power- und Status-LED schalten mit jedem Druck um
  5. Power-Taste loslassen

Danach taucht der Drucker als USB-Device auf und das Service-Tool lässt sich bedienen.

EEPROM-Druck und erwartungsgemäß ist der Resttintentank bei 100,2 %, bei der nächsten Zahl muss ich stocken und frage „Vielleicht ist es ein Fehler oder ich lese es falsch, aber hat der Drucker wirklich über 27000 Seiten durch?“ – „Ja kann sein, den haben wir ja auch schon gut 10 Jahre und drucken auch regelmäßig“.

Also sollte da tatsächlich kein Bit in der Zahl gekippt sein: Respekt. Der kann was.

Meine ehrliche Empfehlung war, eine passende Wanne oder zur Not ein Backblech unter den Drucker zu legen (damit es keinen „happy little accident“ auf dem Schreibtisch gibt) und ihn so lange weiter nutzen, bis er wirklich tot ist.

Ob der stete Einsatz von Originaltinte einen Unterschied gemacht hat, kann ich nicht bewerten. Bei Tinten von Drittherstellern habe ich habe ich Erfahrungen, wobei hier natürlich auch die Frage gestellt werden muss: was ist billig und was ist günstig?