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.

Pirozeda-Hat

Nachdem der Pirozeda relativ beliebt ist habe ich ein neues Design erstellt, das ein paar Punkte in Angriff nimmt die mir bis jetzt nicht so gut gefallen haben:

Folgendes ist neu:

  • Entspricht (größtenteils) den Raspberry Pi HAT-Spezifikationen (inkl. EEProm)
  • Neben dem Optokoppler kann man nun auch einen ADUM1301 verwenden
  • …oder einfach Widerstände, wenn man sich der Sache sicher ist
  • Mit ADMUM1301 oder Direktverbindung können nun hardwareseitig einfach Firmware-Updates aufgespielt und der µC resettet werden
  • Am Mikrocontroller gibt es nun zwei Status-LEDs
  • Es gibt nun eine RTC (DS1307Z)

Wer die Design-Daten vorab haben will, kann sich gerne bei mir melden. Sobald sie aufgeräumt sind, kommt natürlich alles auf die Projektseite.

Was noch ganz cool wäre, aber hinsichtlich Platz wahrscheinlich nicht mehr geht: Steckplatz für ein kleines Display und eine Status-LED könnte auch mit dem Pi verbunden sein (um auf ersten Blick den Status der kompletten Verarbeitungskette zu sehen).

(Schöne) Warteschleifenmusik

Heidewitzka, wie die Zeit vergeht. Die Wochen(enden) rasen vorbei und ja, hier gibt es leider weiterhin vergleichsweise wenig. Das liegt allerdings nicht daran, dass ich keine Lust hätte. Neben den zeitlichen Problemen spielt noch eines dazu: nach dem versumpfen des Datenloggers möchte ich keine angefangenen und niemals in einer Form weiter gemachten Projekte/Artikel mehr online stellen.

Zugegebenermaßen ist es bei der Energieerfassung ähnlich, aber: das Teil bekommt wahrscheinlich ein ordentliches Upgrade mit Raspberry Pi (oder einem anderen Embedded-Board). Der AVR ist zwar nett, weil man ihn nicht so schnell in die Knie zwingt – die Uptime ist genau ein Jahr, Unterbrechungen gab es nur durch Routerausfall (wodurch sich der AVR irgendwann wegen fehlendem Traffic resettet) und Stromausfall. Abgesehen davon verrichtet das Teil seit nun 4 Jahren fast ununterbrochen seinen Dienst. Die Reset-Taste hätte ich mir sparen können.

Für die meisten ist wahrscheinlich interessanter, was für Projekte & Artikel in Planung sind – da kann ich schon ein paar Dinge versprechen:

Es kommt ein Artikel zur „Maximalminimierung“ der Schaltung im VBus-Decoder. Der Wiki-Markup davon hat momentan knapp 12 KB und es wird noch mehr. Allerdings ist der Aufschrieb noch nicht ganz fertig und ein paar Dinge komisch/doppelt/nicht gut beschrieben. Sicher ist aber, dass das Teil kommt. Eventuell sogar mit einem Schmitt-Trigger-für-Dummies-Modus – heißt: Spannungswerte rein, „optimale“ Schaltung raus.

Zweite Dauerbaustelle (sogar schon einmal hier erwähnt): Eine Lichtsteuerung für eine Modellbahn. Ich bin immer noch schwer mit der Firmware beschäftigt, Teile der Hardware sehen schon ganz passabel aus und die Dokumentation wächst. Ersteres ist in der Struktur zwar „gewachsen“, aber nicht zwangsläufig im negativem Sinne. Der Funktionsumfang ist deutlich größer als ich am Anfang für möglich gehalten habe – (sowas ähnliches wie) PWM mit 10 Bit Auflösung bei > 100 Hz und 40 Kanälen. Die einzelnen Kanäle lassen sich absolut und relativ sowohl linear als auch logarithmisch (letzteres noch nicht optimal) setzen. Die Änderungen sind als Gruppen und in Transaktionen möglich. Dazu kommt noch ein Fader (ebenfalls transaktionsfähig, momentan aber nur lineares Fading). So wie es aussieht, passt auch noch ein Sequencer in die Firmware. Die Kommunikation läuft über ein eigenes Protokoll „oberhalb“ von RS485. Wie gut das mit der Kollisionsvermeidung und -Erkennung funktioniert, muss ich noch herausfinden.

Dritte Bausteille: Ich hab bei mir in der Arbeit einen elektrisch höhenverstellbaren Tisch für daheim ergattern können. Leider bewegt die Elektronik ihn nur um einen Zentimeter. Erste Idee war, alles neu zu machen, damit aber ein Ende in Sicht ist, soll bei dem Teil erst einmal die Grundfunktion wiederhergestellt werden. Also: Reparatur und etwas Reverse Engineering. Artikel ist schon in der Entstehung, allerdings noch nicht sonderlich fortgeschritten.

Warum der Pi abschmiert

In meinem Artikel „Zeitraffer mit Linux“ habe ich geschrieben, dass wohl die Kamera oder deren Treiber irgendwann abstürzt – das ist so nicht ganz richtig. Zwar Macht die Kamera nach den „Abstürzen“ komische Dinge (die LED bleibt dauerhaft an), aber sie ist nicht die Ursache.

Nachdem der Raspi – nachdem ich ein weiteres Script für ein kleines Experiment, das Daten aus dem Internet zieht – sehr zuverlässig abstürzte, wagte ich einen Blick in die Systemlogs (an die ich anfangs gar nicht dachte). Demnach ist wohl weder die Kamera noch deren Treiber schuld, sondern der Ethernet-Chip (oder dessen Treiber).

Der Beheld lt. Community: sudo rpi-update. Das brachte zwar eine deutliche Besserung (obwohl mein Image gar nicht woo alt war…) Aber noch keine endgültige Lösung.

Eine weiterer Tipp im offiziellen Forum ist per Cronjob einen Ping auf eine bestimmte Adresse (am besten das Gateway im Netzwerk) ausführen lassen – falls nichts zurückkommt: reboot. Rabiat, sollte aber funktionieren – zumindest solange man am Netz hängt. Fehlt das Netzwerk oder aus irgendwelchen Gründen das Gateway, hat man ein Reboot-Perpetuum-Mobile gebaut. Ich habe noch nichts clevereres gefunden, werde aber meine Augen offen halten (müssen).

Ein Tag

Die Lernzeit ist ja üblicherweise die kreativste.

Aus Frust habe ich letztes Wochenende meine Webcam (eine Logitech C310) an den Raspberry Pi gedengelt und lasse ihn mit fswebcam seitdem jede Minute ein fortlaufend numeriertes Bild aufnehmen. Die Dateien wurde Anfangs (aus Bequemlichkeit) in die Dropbox geschoben (ja, für so einen Quatsch verwende ich das), mittlerweile tröpfeln die Jpegs aber auf einen angeschlossenen USB-Stick.

Die Fotos sehen dann ungefähr so aus:

img_0723

Der Blick von meinem Büro aus in Richtung Westen, der Wetterhahn auf der Garage weiß Bescheid.

Nach der Übertragung auf den PC fügt ffmpeg alle Einzelaufnahmen zu einem Film zusammen, was dann wie folgt aussieht:

2013-06-13.mp4 (ein paar Frames fehlen noch, aber da verpasst man nix)

Am ersten Tag habe ich schon gemerkt, dass die Kamera die direkte Sonne abbekommt und war schon kurz davor, die Sache abzubrechen. Nach dem Ansehen der Bilder und keinem Auffinden von „Brandspuren“, ließ ich das Teil weiterlaufen.

Heute nun habe ich dann doch leichte Abnutzungserscheinungen entdeckt:

img_1304

Meine Bildbearbeitungskünste sind in der Hinsicht leider nicht allzu groß, aber dank der Pfeile erkennt man glaube ich, was gemeint ist (der Streifen darunter ist ein Kondensstreifen, der verschwindet zum Glück wieder)

Merke: Im Jahr 2013 sind Bildsensoren zwar resistenter gegen direkte Sonneneinstrahlung, trotzdem muss man es nicht herausfordern.

Die Kamera wird nun ein wenig gedreht – damit so etwas nicht mehr so schnell passiert.

Die genaue Beschreibung von dem „Projektchen“ folgt, wenn ich wieder Zeit dafür hab.