Okay, was ist Volumio?

Kurz gesagt, ist Volumio ein open-source, Software-basierter Netzwerk Audio Player.
Wie ähnliche Lösungen, bspw. RuneAudio, ist Volumio primär dafür konzipiert, spezielle HiFi-Module (DACs) zu verwenden, die auf Mini-Computern wie dem Raspberry Pi eingesetzt werden um damit preiswerte aber klanglich hochqualitative, netzwerkfähige Audiogeräte zu realisieren. Und auch wenn es die audiophilen Leser hier erschüttern sollte: Selbstverständlich ist es ebenso möglich, billige Aktivboxen oder einfach Kopfhörer direkt am 3,5mm Klinkenausgang eines Raspberry’s einzustöpseln um dem Musikgenuß mit Volumio zu frönen.

Unter der Haube ist Volumio ein JEOS das auf Linux basiert und zusätzlich spezielle Software an Bord hat (in erster Linie natürlich audio-bezogen). Dieser JEOS-Ansatz bewirkt, dass Volumio mit einem eigenen Betriebssystem daher kommt und nicht auf Eignung eines beliebigen Betriebssystems des Endanwenders oder dessen Konfiguration angewiesen ist. Ferner kann Volumio auf unterschiedlicher Hardware eingesetzt werden – von populären geräuscharmen und energieeffizienten micro-Computern wie Raspberry PIs, Tinkerboxen oder Odroids bis hin zu gewöhnlichen PCs oder Laptops.

Dadurch, dass Volumio sich ausschließlich auf Audiowiedergabe richtet, wurde es ohne die Notwendigkeit eines physischen Bildschirms konzipiert um seine Aufgaben zu erledigen.
Daher ist es sowohl sehr schlank hinsichtlich seiner Speicheranforderungen als auch sehr flink und stabil was die Steuerung der Hardware des eingesetzten Geräts angeht.
Diese Faktoren prädestinieren Volumio dazu, einen leisen, lüfterlosen, stromsparenden, billigen, angestaubten alten Raspberry in einen netzwerkfähigen Audioplayer zu verwandeln.

Selbstverständlich gibt es Tricks, Kniffe und Anleitungen wie man Volumio dazu bringen kann LCD/LED oder gar Touchbildschirme zu steuern oder physische Regler für Lautstärke oder Wiedergabesteuerung. Grundsätzlich wurde es aber für eine headless Nutzung konzipiert, also ohne die Notwendigkeit eines physischen Bildschirms. Stattdessen erfolgt sämtliche Steuerung über ein web-basiertes Interface. Übrigens ein wirklich hübsches:

Bildschirmfoto des Volumio Web-Interface mit in Desktop- und mobiler Ansicht

Volumio’s Web-Interface in Desktop- (links) und mobiler (rechts) Ansicht.

Und wo ist das Problem?

Einfach gesagt wird Volumio also über einen Webbrowser gesteuert.
Im Normalfall startet man das Gerät (sofern dieses nicht ohnehin 24/7 auf einem stromsparenden Raspi läuft) und ruft das Web-Interface auf um irgendeine Wiedergabe zu starten. Später wird das Gerät entsprechend ausgeschaltet oder die Wiedergabe angehalten. Und das war’s auch schon. Und es funktioniert vorzüglich.

Und das ist auch alles was man braucht …in 90% der Fälle.

Das Problem der fehlenden 10%

Für meine Zwecke hat das „headless“ Prinzip auch einen kleinen Haken.
Ich verwende Volumio als home office Musikplayer: Wenn ich an meinem Schreibtisch vorm Bildschirm sitze steht daneben ein vormals überschüssiger alter Raspi 2B mit einem Paar kleiner Aktivlautsprecher mit USB-Stromversorgung der Webradio spielt. Oder meine „Work“-Playliste auf Spotify. Super. Aber was, wenn ich mal kurz schnell den Ton stumm stellen muss? Oder viel schlimmer: Was, wenn ich ein Lied überspringen möchte das ich nicht mag?

Einen Knopf drücken klappt dann nicht. So etwas müsste ich eben notgedrungen über das Web-Interface machen.

Wie schon erwähnt spielt Volumio bei mir nur, weil ich sowieso quasi daneben sitze. Natürlich könnte ich dann ganz einfach das Web-Interface in einem eigens dafür genutzten Browserfenster oder Browsertab während der Zeit geöffnet lassen. Das würde mir aber trotzdem nicht ermöglichen, dass ich Volumio schnell zum Schweigen bringen oder die Playlist steuern könnte, etc. Und das Wechseln zu einem anderen Fenster oder Browsertab während ich gerade etwas lese oder schreibe bedeutet: Unterbrechung. Ablenkung.

Von daher benötige ich eine andere Methode um Volumio schnell und einfach zu steuern.

Die Idee

Was ich erreichen möchte ist, dass bestimmte Tastenkombinationen meiner Desktop-Tastatur „einen Befehl“ an Volumio senden zum Stummschalten, Pausieren, Verändern der Lautstärke und so weiter. Denn wenn Volumio läuft sitze ich ohnehin an meinem Rechner. Mit der Tastatur direkt vor mir. Also simpel und effektiv. Der nächste Schritt wäre demnach zu schauen, ob es da Möglichkeiten gibt, so etwas zu bewerkstelligen.

Die Optionen

Aus meiner Vergangenheit als Softwaretester kenne ich etliche Wege um webbasierte Anwendungen zu automatisieren. Ich könnte problemlos etwas stricken, dass durch Volumio’s Web-Interface navigiert und die entsprechenden Elemente bedient. Das würde aber etwas sperrig werden und einen unverhältnismäßigen Aufwand mit sich bringen. Glücklicherweise ist das aber auch gar nicht nötig. Volumio’s Entwicklern sei Dank.

  1. Erstens gibt es für Volumio einen command-line client, also ein kleines Programm mit dem der laufenden Volumio-Instanz auf dem selben Rechner Befehle gesendet werden können. Da dieser Client naturgemäß auf dem gleichen Gerät wie Volumio selbst läuft, wäre bei diesem Ansatz zunächst die Hürde zu nehmen wie man diesen Client von einem anderen Rechner aus ansprechen kann. Auch das wäre bestimmt machbar, aber immer noch ziemlich aufwendig. Und irgendwie klingt das der Lösung, die von hinten durch die Brust in’s Auge trifft, oder?
  2. Zweitens, und hier fängt’s an Spaß zu machen, verfügt Volumio über eine „Programmierschnittstelle“, eine API, die sowohl eine websocket als auch eine REST Variante unterstützt.

Nachdem ich mich eine Weile mit dem Websocket-Dingsbums beschäftigt hatte wurden mir 2 Dinge klar: Zum einen mein zu begrenztes Verständnis wie das umzusetzen wäre. Und zum zweiten, dass auch dieser Ansatz viel zu kompliziert wäre für das, was ich eigentlich erreichen möchte: Einen Befehl irgendwohin zu senden. Also schaute ich mir an, wie es um das REST API bestellt war. Und nach 5 Sekunden war mir klar, dass dieses REST API der einfachste Weg (für die nicht-Entwickler unter uns) sein musste um Volumio extern zu steuern..

Die Lösung: Volumio’s REST API

Im Prinzip muss ich ja nur wissen, welchen Befehl ich an Volumio senden muss – und wie. Richtig?
Nun, der Teil mit dem „wie“ ist einfach. Dafür nutzt man curl.

  • Bei Linux ist curl oft bereits vorinstalliert. Wenn nicht helfen apt-get, dnf, pacman, …
  • Bei Macs sollte curl auch vorinstalliert sein. Ich bin mir aber nicht sicher.
  • Bei Windows habe ich keine Ahnung. Angeblich ist es ab Windows-10-irgendwas an Bord.

Wenn alle Stricke reißen ist da immer noch curl.haxx.se als letzte Rettung.

Der Teil mit dem „was“ erschließt sich aus der bereits erwähnten Dokumentation der REST API. Sie enthält Beispiele für alle grundlegenden Befehle zur Steuerung der Wiedergabe und noch viel mehr.

Angenommen man möchte das Umschalten zwischen Wiedergabe und Pause erreichen… und das Volumio-Gerät ist unter der IP-Adresse 192.168.1.22 erreichbar… dann ergäbe sich daraus der folgende Befehl:

curl "http://192.168.1.22/api/v1/commands/?cmd=toggle"

Während meiner Versuche mit den API Befehlen ist mir aufgefallen, dass die von der Dokumentation verwendete einfach curl-Syntax in einigen Fällen nicht funktioniert. Durch Einschließen des API-Befehls in Anführungszeichen konnte ich diese Probleme aber umgehen. Ebenso könnte es sich schwierig gestalten, Playlisten über curl zu steuern deren Name ein Leerzeichen enthält. Ich bin mir nicht sicher ob es sich hierbei um einen Fehler in der Software handelt oder die Dokumentation vielleicht nicht mehr aktuell ist.

Jedenfalls: Das war’s! Ein kurzer Einzeiler und fertig. Los, probieren Sie es selber in einem Terminal (oder DOS-Fenster) aus. Denken Sie aber daran, die IP-Adresse auf Ihre Gegebenheiten anzupassen. Natürlich können Sie statt der IP-Adresse auch einfach den Hostnamen des Volumio-Players angeben (der volumio.local lauten sollte sofern Sie das nicht während der Installation geändert haben).

Die nächsten Schritte

Damit haben wir eine Vorlage, die sich für alle gewünschten Befehle verwenden lässt. Der einfachste Weg um sie einzusetzen ist in meinem Fall (ich verwende gnome), in den Systemeinstellungen eigene Tastenkombinationen zu definieren und dort den jeweiligen Befehl zu hinterlegen. Je nach eingesetztem Betriebssystem, Distribution oder Display Manager gestaltet sich das unterschiedlich.

So sieht es auf meinem Fedora System mit Gnome aus:

Bildschirmfoto des deutschen Einstellungsdialog von Fedora32 für Tastenkombinationen

Der Einstellungsdialog von Fedora32 für Tastenkombinationen

Bildschirmfoto des Dialogs zur Erstellung einer eigenen Tastenkombination die einen curl Befehl auslöst

Anlegen einer eigenen Tastenkombination zur Auslösung eines curl Befehls für Volumio

Ich bin mit dieser Lösung vollauf zufrieden. Besonders was die Reaktionszeit dabei betrifft:
In meinem Fall wird eine hörbare Reaktion von Volumio in weniger als 1 Sekunde erreicht.

Sicherlich steckt da noch viel mehr Potential drin, aber für’s erste habe ich damit genau das erreicht was ich wollte.
Für alles, was komplexer als vor/zurück/start/pause und Lautstärkeregelung ist, kann ich immer noch auf Volumio’s exzellentes Web-Interface zurückgreifen weil diese Sachen nicht so häufig benötigt werden.

Einschränkungen

Wie beschrieben, sind alle grundlegenden Funktionen im REST API verfügbar.
Die Websocket API bietet noch viel mehr Möglichkeiten, beispielweise Verwaltung von Playlisten oder Musikbibliothek.
Davon abgesehen gilt es aber zu beachten, dass einige der in der REST API Dokumentation aufgeführten Funktionen nicht wie beschrieben funktionieren. Das kann an Fehlern liegen, an aktuell in Entwicklung befindlichen Änderungen, veralteter Dokumentation oder einer Kombination all dessen. Oder auch, weil ich es nicht (richtig) verstanden habe.

Beispielsweise wollte ich ursprünglich eine Tastenkombination haben, um einen bestimmten Webradio Sender zu laden und wiederzugeben. Das funktionierte allerdings irgendwie nicht und gab mir seltsame Fehlermeldungen zurück. Wie sich herausstellte, war (ist) das zum Zeitpunkt dieses blogs ein bekannter und dokumentierter Fehler bei Volumio.
Ich konnte das Problem jedenfalls für mich lösen, indem ich über Volumio’s Web-Interface eine Playliste anlegte die diesen Webradiosender enthielt und dann einfach den Befehl verwendete, mit dem eine Playlist geladen und abgespielt wird.

Es würde mich freuen wenn dieser Artikel jemandem konkret hilft – und auch, wenn er einfach nur dazu anregt sich mit curl, Volumio oder auch hilfreichen Tastenkombinationen zu beschäftigen. Viel Spaß damit!


Diesen Artikel teilen:
Facebooktwitterlinkedinmail

Links und weiterführende Lektüre:

Bild- und Urheberrechtsnachweise (siehe auch hier):