HEOS-Geräte per CLI steuern
Hifi-Geräte von Denon und Marantz bieten Zugriff per HEOS-CLI
Das Home Entertainment Operating System (HEOS) ist Denons nunmehr schon 10 Jahre alte System für Multiroom-Audio und Streaming im Netzwerk. Und natürlich ist es auch für die Schwester Marantz verfügbar. Die App ist eigentlich völlig in Ordnung und es gibt auch kostenpflichtige Tools für den Desktop. Viel interessanter: Es gibt eine Schnittstelle für die Konsole!
"Wie kann ich auf das Teil per Terminal zugreifen?" Ist das bei Euch auch immer die erste Frage bei neuen Geräten? Nein? Wie kommt Ihr dann nur hier hin ... ;) Egal, machen wir es kurz: Ich musste meinen alten Denon-Stereo-Verstärker ersetzen und habe mich für den Denon DRA-900H 2.2 entschieden - mehr dazu kommt demnächst. Und erfreulicherweise lässt sich auf HEOS-Geräte sehr sehr einfach per API zugreifen, nämlich per Telnet. Leider ist die Kommandostruktur eher so meh ...
Zugriff per API
Unter Windows habt Ihr standardmäßig kein Telnet mehr, unter Linux schon - gegebenenfalls müsst Ihr also nachinstallieren, zum Beispiel aus Chocolatey heraus. Und dann geht es fix:
telnet 192.168.178.148 1255
Fertig! Ihr benötigt kein Konto, kein Passwort, keinen Nutzernamen, nichts - nur die IP-Adresse Eures HEOS-Geräts. Ihr bekommt die Meldung:
Escape character is '^]'.
Diese Meldung sagt Euch, wie Ihr die Telnet-Verbindung beenden könnt. Auf einer normalen DE-Tastatur: Strg+AltGr+9 drücken, um Strg+] zu bekommen. Danach landet Ihr auf dem Telnet-Prompt, den Ihr mit Strg+D verlassen könnt.
Interessanter sind aber natürlich die Befehle. Zunächst solltet Ihr Euch die verfügbaren Player auflisten lassen, da Ihr zum Steuern die jeweilige ID benötigt:
heos://player/get_players
Die JSON-Ausgabe hier (allerdings aufgehübscht):
{
"heos": {
"command": "player/get_players",
"result": "success",
"message": ""
},
"payload": [
{
"name": "Denon DRA-900H",
"pid": -1234567890,
"model": "Denon DRA-900H",
"version": "3.34.410",
"ip": "192.168.178.148",
"network": "wired",
"lineout": 0,
"serial": "DCGJ11111111"
}
]
}
Notiert die PID oder kopiert sie in die Zwischenablage oder speichert sie in einer Variablen - und schon lässt sich etwa der Player-Status abfragen:
heos://player/get_play_state?pid=-1234567890
Wichtig: Das - gehört zur ID! Die komplette Befehlsreferenz gibt es hier bei Denons Muttergesellschaft D+M Group als PDF.
Bonus-Tipp: Angenommen, Ihr wollt einfach nur den Status auslesen, ohne eine interaktive Telnet-Sitzung zu betreten und eine komplette JSON-Ausgabe zu bekommen. Folgendes Konstrukt gibt den Status lesbar in einer separaten Zeile aus:
{ echo "heos://player/get_play_state?pid=-1234567890"; sleep 2; } | \
telnet 192.168.178.148 1255 | \
sed -r ' s/.*state=(\w+).*/\n\n\1\n\n/g '
Das {}-Konstrukt gruppiert schlicht den HEOS-Befehl und ein Sleep-Kommando, welches benötigt wird, um die Telnet-Sitzung so lange offen zu halten bis der HEOS-Befehl auch ausgeführt wird. Das sed-Konstrukt reduziert die Ausgabe dann auf das eine Wort (\w+) hinter "state=".
Und wenn es wirklich nur und ausschließlich der Status sein soll, ohne jegliche Telnet-eigenen Ausgaben:
( { echo "heos://player/get_play_state?pid=-1234567890"; sleep 2; } | \
telnet 192.168.178.148 1255 | \
sed -n -r ' s/.*state=(\w+).*/\1/p ' ) 2>&1 | \
grep -v ^Connection
Mit 2>$1 und grep wird einfach nur etwas mehr aufgeräumt - ist auch nur als Inspiration gedacht.
Mit diesen Beispielen solltet Ihr den Einstieg in eigene Spielereien schaffen. Natürlich gibt es auch "fertige" API-Integrationen: Zum Beispiel Heos CLI Client für den Terminal (hat hier nicht funktioniert) und heos-api für Node.js.