MicroPython vs. HTTP Response Headers

Der Raspberry Pi Pico W ist pure Magie. Ein Microcontroller, in Python zu steuern, mit WLAN on board 😍 Super einfach, damit irgendwas im Netz zu machen – essentiell für IoT, looking at you, Arduino.

(Aber man muss|Außerdem kann man) viel über MicroPython lernen. Zum Beispiel, wie urequests Response-Header parst: Als Key/Value. Das ist uncool, da es durchaus Header gibt, die doppelt kommen können und sollen:

The optional replace parameter indicates whether the header should replace a previous similar header, or add a second header of the same type. By default it will replace, but if you pass in false as the second argument you can force multiple headers of the same type. For example:

Sagt PHP (replace Parameter).

The Set-Cookie HTTP response header is used to send a cookie from the server to the user agent, so that the user agent can send it back to the server later. To send multiple cookies, multiple Set-Cookie headers should be sent in the same response.

Sagt Mozilla.

Imho nicht unbedingt unseriöse Quellen, aber für MicroPython ist das trotzdem kein schlagendes Argument; Header duplicates werden weiterhin nicht unterstützt werden. Siehe meine längliche Diskussion ab hier.

Es gibt aber einen Workaround, und der ist imho nicht offensichtlich: Man kann nämlich urequests.post() mit einem Parameter parse_headers aufrufen, der erstmal ein Boolean ist – aber auch eine Callback-Funktion sein kann:

Das Fragment (ich hoffe, ich habe auf die Schnelle nichts vergessen) printed alle Cookies. HTH.

Uhrzeit auf dem Arduino

Wer auf einem Arduino die aktuelle Uhrzeit haben möchte, hat im Wesentlichen drei Optionen. Im Folgenden ein Überblick der Vor- und Nachteile, ohne Anspruch auf Vollständigkeit.

PS: Dieser Post ist eine Karteileiche, insofern kann ich (inzwischen) fast nichts mehr dazu sagen, aber vielleicht helfen die Links ja der einen oder anderen.

DS3231

Ein DS3231-Modul ist quasi eine klassische Uhr: Quarzbasiert, batteriebetrieben, ohne Funk. Beim 3231 wacht ein Temperatursensor darüber, dass eventuelle Abweichungen kompensiert werden (im Gegensatz zum DS1302, DS1307, …). Das Buzzword zu den genannten Modulen lautet “Real Time Clock” (RTC), und es gibt sie bsplw. von Adafruit oder auf Ebay aus China.

Der Vorteil ist offensichtlich: Alles in einem. Anschließen, auslesen, fertig. Allerdings wird die Zeit nur ein mal “gestellt”, und zwar beim Kompilieren. Ist die Batterie leer, oder die Gangabweichung über die Monate (Jahre?) zu groß, oder die Zeitumstellung wird nicht berücksichtigt, oder oder oder, heißt es neu zu kompilieren. Diese Lösung scheint mir die am wenigsten autarke zu sein, deshalb habe ich mich da nicht weiter mit beschäftigt.

NTP

Die für einen Softwareentwickler naheliegende Lösung ist das Auslesen eines Zeitservers. Dazu benötigt man eine Verbindung zu so einem Server, also vermutlich LAN oder WLAN. Die kostengünstigste Version (die praktischerweise auch sehr klein ist) für den Arduino lautet ESP8266, auf Ebay bekommt man welche für << 2€ inklusive Versand aus China 😄.

ABER: Die sind schon deutlich unübersichtlicher zu verwenden! Es gibt aktuell fast zwanzig verschiedene Versionen (plus Abversionen), und sie erfordern 3,3V, während die meisten (gängigen) Arduinos auf 5V basieren. Sie sind nicht mal originär für den Arduino, sondern standalone Bausteine! Es gibt Adapter, Anleitungen, etc.; man muss sich halt dieser Komplexität bewusst sein. Außerdem vermeidet man zwar das (erneute) Stellen der Uhrzeit, ist aber abhängig von genau diesem einen WLAN mit genau diesem Passwort.

DCF77

DCF77 ist das kluge Wort für eine Funkuhr. Es gibt entsprechende Module bei Pollin, Reichelt, Conrad, ELV, … (hier ein Vergleich), leider nicht aus China 🙃. Ich habe von früher noch den hier, der kann auch 5V. Das Auslesen ist nicht trivial, dafür ist man nur so wirklich autark.

Was heißt also “nicht trivial”? Nun,

  • das Signal an sich wird sekundenweise binär übertragen, aber für die Dekodierung gibt es Libraries (aktuell drei offizielle). Man benötigt mindestens eine volle Minute, bis man ein mal alle nötigen Bits empfangen hat – und das unter Idealbedingungen!
  • die verschiedenen Module unterstützen unterschiedliche Spannungen, was man bei der Planung berücksichtigen muss.
  • um ein sekundenbasiertes Signal zuverlässig zu verarbeiten, muss man zuverlässig eine Sekunde erkennen. Dazu benötigt man einen Arduino mit Quarz (halt wie in einer Uhr), die meisten haben aber keinen. Den Pro Mini gab es in einer 5V-Version (damit fällt das Modul von Pollin schon mal raus) mit Quarz, aber den Pro Mini gibt es offiziell nicht mehr… auf Ebay gibt es aber noch welche für ebenfalls deutlich unter 2€ aus China.
  • die Module sind grundsätzlich störanfällig; die Antenne sollte waagerecht ausgerichtet sein, die Leitungen kurz, Röhrenbildschirme weit weg, Z-Dioden helfen. Das macht das Auslesen des Signals nicht schneller, und das Debugging entsprechend langwierig. Im o.g. Vergleich wurden bis zu 20 Minuten gemessen, bis das Signal erkannt war!

PS: Die Library von Udo Klein rühmt sich, besonders widerstandsfähig gegen Störsignale zu sein.

hf!

Pi-hole: Reset stats

Man kann die Fritzbox konfigurieren, dass sie ihre DNS-Auflösung über den Pi-hole macht. Man kann die Fritzbox aber auch so konfigurieren, dass sie den Pi-hole mittels DHCP als DNS-Server im LAN bekannt macht – Danke, Johann. Dann (und nur dann) werden Clients korrekt aufgelöst, statt dass die Fritzbox der einzige Client ist.

Das wäre so einer der Fälle, in dem man evt. die Statistik des Pi-hole zurücksetzen möchte:

Update: Oooder man geht in der Admin Console auf SettingsSystemFlush logs 🙃

Raspberry Pi Stromversorgung

Ich habe einen 3B hier, der vermehrt “Under-voltage detected” (Code 0x00050005) meldet – dabei aber (als einziges Gerät!) über einen wertigen USB-Hub direkt am Stromnetz hängt. Der Hub hat auch schon früher Raspberrys versorgt, darunter den eigentlich hungrigeren 3B+. Was also ist los?

Es kann natürlich ein Fehlalarm, bzw. ein defekter Pi sein. Vermutlich eher unwahrscheinlich 🙂 Es kann auch der Hub sein; tatsächlich sind minderwertige Netzteile oft ein Grund für (alle möglichen!) Probleme mit dem Pi. Ich hoffte allerdings auf das Kabel; ein Punkt, den man häufig vergisst. Nicht umsonst gibt es explizite “Quick Charging”-Kabel.

Also: Gegenprobe. Weitere Kabel, sowie das “originale” Netzteil (Danke, Nathan!) statt des Hub ausprobiert. Stellt sich raus:

  1. es scheint doch am Hub zu liegen
  2. das originale Netzteil liefert 5.1V statt den im USB-Standard spezifizierten 5V

In anderen Worten: Die Foundation bescheißt. So funktioniert natürlich kein standard USB Supply 🙄  Aber wie auch immer. Was das Ganze blogbar macht, ist ein kleines Skript, das ich hier gefunden und während der Tests genutzt habe:

Es stresst den Pi so sehr, dass er mit einigen der Kabel nach ein paar Schleifendurchläufen hart abgestürzt ist! Mit dem originalen Netzteil hatte ich keine Probleme (wobei da das Kabel fester Bestandteil ist). Also: Das obige Skript ist ein guter Lasttest für einen Pi.

RetroStone

Hab die Tage meinen RetroStone erhalten – witzige Geschichte, auf dem Paket klebte Zoll-Zettel usw., aber es lag einfach im Briefkasten. Egal, hier die bisherigen Erkenntnisse, die bei Bedarf ergänzt werden:

  • Out of the box ist keine Software installiert! Man muss sich RetrOrangePi in der Version “RetroStone Pi” runterladen und installieren
  • Spiele werden bspw. per Netzwerk installiert: Per smb verbinden, Volume rom, darin liegt pro Emulator ein Unterordner, wo die reinkommen
  • Der Ordner für den klassischen Game Boy ist nicht gameboy, sondern gb
  • Emulatoren erscheinen nur im Menü, wenn ihr ROM-Ordner mindestens eine Datei enthalten (einige enthalten deshalb Dummydateien)
  • Emulationstation (oder die ganze Konsole) müssen neu gestartet werden, um die Liste der vorhandenen Spiele zu aktualisieren: Start → Quit (mit Gelb) → …
  • Die Tastenkombi, um ein Spiel zu verlassen: Select+Start
  • Startet er, aber fährt nicht (mehr) hoch, mal testweise an Strom anschließen

tbc

(Runeaudio|moOde|Volumio) mit Hifiberry Amp2 auf Raspi 3B+

Setup: Ein Hifiberry Amp2 auf einem Raspberry 3 B+.

Frage: Welches OS nutzt man jetzt? Laut Internet stehen Volumio, RuneAudio und moOde. Alle drei basieren auf demselben Ursprungsprojekt, also ene mene muh:

Rune:

None of the existing Rune images will work on the new Pi 3B+.

  • Es gibt zwar einen (Stand heute; Tendenz steigend) 48 Seiten langen Thread zu einer “Beta”- (die sind alle beta, so what) Version aus Februar 2017, mit “Ich habe diese Datei geändert”, “Ich jenes Setting auskommentiert” – also das macht schon mal nicht viel Hoffnung… und tatsächlich: 0.4-beta_20170229 funktioniert auch nicht.

Also moOde:

  • muss kompiliert werden, direkt auf dem Pi, unter Raspbian Stretch Lite in der Version vom 13.3.2018 – “No other release is guaranteed to work.” 🙄 Die aktuelle Version ist vom 18.4.2018, aber ich habe die “alte” noch Rum liegen.
  • Also: 13.3.2018 installieren, starten, /boot wird zum Glück automatisch vergrößert, moOde benötigt mindestens 2.5GB. Dann:
    1. sudo wget -q http://moodeaudio.org/downloads/mos/mosbuild.sh -O /home/pi/mosbuild.sh
    2. sudo chmod +x /home/pi/mosbuild.sh
    3. sudo ./mosbuild.sh
    4. warten. Lange. Man bekommt keinerlei Fortschrittsanzeige. Und auch keinerlei Erfolgsmeldung; irgendwann ist der Pi halt aus 🙄
  • Ein Neustart zeigt:
    • Die Installation war tatsächlich erfolgreich
    • das UI ist Mist, bzw. nicht “mobile first” (was ja ok wäre), sondern eher ein “mobile only”
    • Lautstärke hängt bei 0%, lässt sich auch nicht ändern

Angesichts des UI habe ich dann auch keine Lust, mich weiter damit zu befassen.

Also Volumio:

  • Installation problemlos; als Device wird direkt “snd_rpi_hifiberry_dacplus” zur Auswahl gestellt, das ist korrekt:

If the software you’re using doesn’t provide the Amp2 as an output option, you should use the HiFiBerry DAC+ driver as the Amp2 is basically a DAC+ with an integrated power stage.

  • Aber: Lautstärkeregelung funktioniert wieder nicht!? Dieses mal hängt sie auf 100% 😐
  • Das UI hat ebenfalls Probleme: Es ist webbasiert und startet im Chromium, der dabei schon mal eine Fehlermeldung bringt, man hätte beim letzten mal nicht alle Tabs geschlossen. Hilfetexte sind hin und wieder leer. Ein WLAN, das auf 2.4 und 5 GHz sendet, wird doppelt angezeigt (ja, das liegt primär an den Einstellungen im Router, aber andere UIs bekommen das auch hin)
  • Es gibt “Plugins”, die sich aus dem Webinterface heraus installieren lassen – theoretisch. Das Plugin für TouchPanels etwa kann man nicht installieren, ohne vorher auf der Kommandozeile tätig zu werden. Warum? Das scheint mit 2.444 behoben zu sein!
  • Hat man das Touchpanel-Plugin installiert, bootet man aber automatisch in das Webinterface, wie kommt man dann in die Kommandozeile? Etwa per SSH, das aktiviert werden muss: Eine Datei “ssh” in der “boot”-Partition anlegen, oder unter http://volumio.local/dev/. User/Passwort sind volumio/volumio

Aber zurück zur Lautstärkenregelung: Laut Entwickler vom Hifiberry ist das ein Problem von Volumio, zumal alsamixer funktioniert. Und tatsächlich: Das Problem ist (indirekt) das UI. Man muss unter “Playback Options” → “Volume Options” → “Mixer Control Name” von “Analog” auf “Digital” wechseln und speichern. Das Pop Up a la “Alles gespeichert und neu gestartet” muss man ignorieren und den Pi neustarten.

Dann geht’s.

Raspberry Pi als Spotify-Client, reloaded: Pi MusicBox

Nachdem despotify nicht mehr läuft, war es lange ruhig um die Idee. Bis ich vor einigen Tagen über Pi MusicBox gestolpert bin. Und, was soll ich sagen: Läuft wie ‘ne 1. Und:

  • hat dazu einen Webserver gleich mit an Board, der ein (mobiltaugliches) Interface (in iPhone-Optik) raushaut
  • hat last.fm-Support mit dabei
  • unterstützt iTunes-Streaming und Wifi
  • zumindest auf den ersten Blick ist es absolut transparent, woher der Track kommt. Sprich: Man hat alle Quellen in einer Suche vereint
  • klingt in 320kbps über HDMI an meinem Yamaha absolut bombe! 🙂

Basiert auf Mopidy, was ich ebenfalls noch nicht kannte. Mopidy kann wohl auch Soundcloud, was ich im Pi-Interface (und auch im Config-File) nicht sehe.

Was mir fehlt, ist die Möglicheit, das Gerät aus dem Webinterface heraus runterzufahren. Und, gut zu wissen, der SSH-Zugang ist nicht pi/raspberry, sondern root/musicbox… Shutdown dann per “shutdown -h now”, wie gehabt

[UPDATE] Über USB-WLAN (der Stick zu 7,77 € auf Ebay oder 8,84 € auf Amazon) funktioniert das ziemlich out-of-the-box, allerdings musste ich in /etc/network/interfaces die Zeile auto wlan0 einkommentieren (Quelle). Den WLAN-Key muss man übrigens ohne Bindestriche oder Leerzeichen hinterlegen.

Raspberry Pi als Spotify-Client [UPDATE]

Update Juli 2013: Besser ist die “Pi MusicBox

Der Prozessor des Raspberry ist mit seinen 700 MHz nicht eben schnell – bisher habe ich den Desktop noch nicht ausprobiert, aber ich habe mir sagen lassen, dass schon Surfen keinen Spaß macht. Habe ich aber auch nicht vor 🙂 Denn der Prozessor ist zum Beispiel explizit in der Lage, HD-Videos zu rendern – wohlgemerkt lüfterlos. Das prädestiniert ihn als Media Center. Gut, HD-Videos kann mein Bluray-Player auch, aber ich will mal ausprobieren, wie sich der Raspberry als Spotify-Client schlägt. Das kann mein Bluray-Player (oder irgendwas anderes in meinem Heimkino) nämlich nicht.

Also, ich habe Raspbian “wheezy” installiert, und setze funktionierendes LAN voraus:

Es gibt eine Anleitung von Hexxeh, die funktioniert aber nicht. Zuerst kann ich die angegebenen Pakete nicht installieren – irgendwo ist …/libmpg123-0_1.14.2+svn20120622-1_armhf.deb eingetragen, online ist aber (Stand 5.10.12) nur libmpg123-0_1.14.4-1_armhf.deb 🙁 Für die Akten: Man lade libmpg123-dev_1.14.4-1_armhf.deb und libmpg123-0_1.14.4-1_armhf.deb runter, schiebe sie per FTP-Programm (SFTP-Verbindung wählen; User “pi”/Passwort “raspberry”) auf das Gerät nach “/home/pi/”, und installiere sie manuell:

Aber das genügt nicht; ich einen bekomme fehlende vcos_platform_types.h und vcos_platform.h und ilclient.h. Nach gut zwei Stunden (denn man beachte den Lösungsansatz für das erste Problem: zweistellig viele Files editieren; sowie die Unübersichtlichkeit des zweiten Links) gebe ich auf, und versuche einen anderen Weg – der geht zum Glück ziemlich straight forward:

Zuerst installiere ich Subversion (Quelle):

Dann ziehe ich mir die despotify-Sourcen (Quelle) plus einiger Libs (Quelle: README-Datei) direkt, und compiliere sie:

Im Wesentlichen war es das! Man sollte sich nun mittels

einloggen können.

Achtung #1: Die userid ist nicht der Username! Sondern die Nummer, die man unter anderem hier findet (man sieht sie auch, wenn man eine Support-Anfrage stellt) – Danke, @moritzmoro. Achtung #2: Laut FAQ von despotify geht das nur mit Premium-Accounts! Sowas habe ich nicht (mehr), deshalb breche ich hier bis auf Weiteres ab. In den kommenden Tagen werde ich zwei Dinge updaten: Ich werde mein Raspberry frisch aufsetzen, und die obige Anleitung prüfen – ich habe doch so einiges installiert heute, und möchte vermeiden, dass etwas davon wichtig war, aber hier vergessen wurde. Zweitens werde ich (hoffentlich) meinen Spotify-Account, der momentan mit meinem Facebook-Konto verbunden ist, in einen “richtigen” umwandeln können, und diesen auf Premium upgraden.

UPDATE: Richtig, mit einem Premium-Accoount kann man sich einloggen. Der Login dauert recht lange, aber es geht:

Anmerkungen:

  • Während ich als Nicht-Premium-User tatsächlich die User-ID benutzen musste, um wenigstens brauchbare Fehlermeldungen zu bekommen, kann ich als Premium-User ganz normal meinen Usernamen verwenden
  • Wenn das Passwort Sonderzeichen enthält, können diese mit Backslash (“”) escaped werden
  • Das ganze rockt! Das Raspberry hat überhaupt keine Probleme mit dem Decoding von 320kb
  • Man kann nur sehr unkomfortabel nach etwas anderem als Tracks suchen
  • Mein erster Song war standesgemäß “Tom’s Diner” von Suzanne Vega, dem ersten MP3 🙂
  • Sound geht über HDMI raus, Steuerung läuft nach wie vor über SSH – mit dem passenden Client geht das dann auch vom Handy (für’s Windows Phone nutze ich gerade The SSH Client Pro)
  • Als nächstes brauche ich trotzdem ein Webinterface oder so, für meine Freundin.
  • Außerdem steht ein Langzeit-Test an, mal sehen, wie warm das Raspberry wird
  • Das Raspberry spielt weiter, wenn man bsplw das Notebook mit dem SSH-Terminal in den Ruhezustand fährt. Kehrt man “zurück”, dauert es eine Weile, bis wieder der aktuelle Status angezeigt wird – aber er kommt!
  • UPDATE: Inzwischen gibt es eine Version vom Raspberry mit 512MB RAM – ich habe die mit 256, und es läuft prime. Wie oben erwähnt, habe ich den Desktop aber auch nie gestartet, und für eine Konsolenanwendung genügen 256 dicke
  • UPDATE Februar 2013: Offenbar gab es eine Protokolländerung, die den von Prime beschriebenen “segmentation fault” hervorruft 🙁