Hyperion auf OS X Yosemite kompilieren und einrichten

Im letzten Beitrag zu Hyperion wurde erwähnt, dass RaspBerry Pi die Plattform ist, für die Hyperion ursprünglich entwickelt wurde. Deshalb wundert es nicht, dass der Installationsskript des Projekts lange Zeit nur Binaries für RPi auslieferte. Inzwischen gibt es auch Binaries für die i.mx6 Plattform (z.B. Cubox-i). Der Installationsscript wurde dann ebenfalls erweitert, sodass auch die richtige Version für diese Plattform ausgeliefert und installiert wird. Es gibt jetzt auch eine Version für Linux und x86 Architektur. Wer sich jedoch mit seinem Gerät abseits dieser Plattformen bewegt, oder wer am Code vielleicht Hand anlegen will, muss selbst zum Compiler greifen und seinen eigene Binaries bauen. Hier geht es im Speziellen um das Bauen auf und für die Macs mit OS X Yosemite.

Zum Einsteigen ist es immer hilfreich, sich zuerst die Compile How-To Datei des Projekts anzuschauen. Dort sind die wesentlichen Schritte zum Bauen von Hyperion bereits erklärt:
– Build tools installieren
– Quellcode des Projekts holen
– Hyperion Build konfigurieren
– Kompilieren
– Einrichten

Buildtools installieren:

Zuerst sollte XCode über den App Store installiert werden. Das bringt den Compiler und andere Tools wie git mit.
Hyperion macht an einigen Stellen Gebrauch von der Qt4 Bibliothek (in einem späteren Beitrag wird gezeigt wie es auch ohne geht) und CMake wird als Buildsystem verwendet. Daher müssen diese ebenfalls für OS X installiert werden. Es gibt einige Wege das zu tun, der einfachste war für mich über den Paketmanager MacPorts. Homebrew sollte aber auch funktionieren.
Falls noch nicht geschehen, muss MacPorts für OS X 10.10 Yosemite installiert werden. Mit folgenden Befehlen im Terminal werden die fehlenden Komponenten dann über MacPorts installiert:

sudo port selfupdate
sudo port install qt4-mac
sudo port install cmake
sudo port install libusb

Letzter Befehl installiert die USB Bibliothek, die für LED Gerät mit Ansteuerung per libUSB benötigt wird. Der LED-Player gibt sich dem System gegenüber als serielles Gerät aus, daher wird die USB Bibliothek eigentlich nicht benötigt. Hyperion’s Build Scripte sind jedoch nicht fein genug abgegrenzt, um den USB Support per Konfiguration komplett abzuschalten.

Quellcode des Projekts holen:

Im offenen Terminal sollte der aktuelle Ordner bereits der Home Ordner sein. Der Code wird dann am besten in ein Unterordner heruntergeladen.

git clone --recursive https://github.com/tvdzwan/hyperion.git hyperion_github
cd hyperion_github

Hyperion Build konfigurieren:

Innerhalb des Ordners mit dem Code wird ein neuer Ordner „build“ erstellt, in dem das Bauen statt findet. Bei Bedarf kann der ganzen Ordner gelöscht werden, um einen sauberen neuen Build zu starten.

Tipp: Hyperion CMake Build ist als Debug konfiguriert. Falls es auf die Größe ankommt, muss in CMakeLists.txt in Zeile 78 der Wert Debug auf MinSizeRel geändert werden.

mkdir build
cd build
cmake -DENABLE_DISPMANX=OFF -DENABLE_SPIDEV=OFF -DENABLE_V4L2=OFF -DENABLE_OSX=ON -DENABLE_PROTOBUF=OFF ..

Die letzte Zeile übergibt mehrere Konfigurations-Parameter an das Build-System CMake. ENABLE_DISPMANX=OFF  schalet die Unterstützung der API für den Zugriff auf den VideoCore des Raspberry Pi ab. Da es nicht auf dem RPi gebaut wird und diese Option standardmäßig aktiviert ist, muss sie explizit mit OFF deaktiviert werden. ENABLE_SPIDEV=OFF  gibt an, dass die Unterstützung der LED Geräte, die über den SPI Bus angesteuert werden wie die WS2801 LEDs, abgeschaltet wird. ENABLE_V4L2=OFF  schaltet die Unterstützung der USB Video-Grabber ab, ich habe keinen hier, deswegen habe ich mich auch nie damit beschäftigt, wie er auf OS X zum Laufen gebracht werden kann. ENABLE_OSX=ON  aktiviert den OS X Framegrabber, um Screenshots vom Bildschirminhalt machen zu können. ENABLE_PROTOBUF=OFF  schaltet den Protobuf server ab. Damit ist die Steuerung der LEDs über das Protobuf Protokoll möglich, ich habe allerdings nie wirklich verstanden, wofür es in Hyperion benötigt wird…
Mit einigen Warnungen, sollte CMake erfolgreich die Konfiguration quittieren:

-- Configuring done
-- Generating done
-- Build files have been written to: .../hyperion_github/build

Kompilieren:

Anschließend wird mit make  kompiliert. Falls es keine Fehler gab, sollte im Unterordner bin die fertige hyperiond Datei liegen. Per bin/hyperiond  kann ein Schnelltest gemacht werden und Hyperion sollte auf die fehlende Config Datei hinweisen:

QCoreApplication initialised
Missing required configuration file. Usage:
hyperiond [config.file]

Für den Einsatz werden die Binaries und andere Dateien in einen separaten Ordner kopiert, von wo Hyperion dann später gestartet wird. Ich lege es bei mir im Home Ordner ab.

mkdir -p ~/hyperion/bin
cp bin/hyperiond ~/hyperion/bin
cp -r ../effects ~/hyperion/
cd ~/hyperion

Einrichten:

Die Konfiguration sollte wie in Projekt-Wiki beschrieben mit HyperCon.jar (HyperCon_ssh.jar ist zwar neuer und hat auch den TPM2 Eintrag für den LED-Player, da spielt jedoch für den hier beschriebenen Weg keine Rolle) durchgeführt werden. Dabei haben OS X User hier ein Problem. Das Programm ist in Java geschrieben und erfordert die Installation der Java Laufzeitumgebung für den Mac. In Yosemite liefert Apple erstmals gar keine Java Laufzeitumgebung mit. Man würde normalerweise Java über das offizielle Paket installieren, das würde jedoch im Falle von HyperCon nichts bringen, da das Tool mit Java 6 inkompatibel ist. Man muss dafür den Java 8 Installer für OS X von Oracle verwenden. Ich hatte noch eine Linux VM mit Java 8 und habe die Konfiguration dort vorgenommen. Der schwierigste Part dabei ist die Konfiguration der LEDs, den Rest kann man per Hand in einem Editor bearbeiten.

Das Wichtigste bei der Konfiguration ist die Anordnung der LEDs, die festgelegt werden muss. Das Bild auf der rechten Seite hilft dabei, die richtigen Werte einzustellen. Die Config Datei wird per Click auf „Create Hyperion Configuration“ Button generiert. Sie kommt in den erstellten hyperion Ordner (~/hyperion). Die Anpassungen können jetzt mit einem Text Editor durchgeführt werden.
Bei OS X ist es nicht immer eindeutig, welchen Namen der LED-Player beim Anschließen bekommt. Das hängt jedes Mal vom gewählten USB Port bzw. USB Hub ab. Man findet den Namen am Einfachsten mit ls /dev/tty.usbmodem*  raus. Es kann z.B. /dev/tty.usbmodem1421 oder /dev/tty.usbmodem141111 sein.

Hier ein Beispiel des device Abschnitts der Konfigurationsdatei.

"device" :
{
    "name"       : "LED-Player",
    "type"       : "tpm2",
    "output"     : "/dev/tty.usbmodem1421",
    "rate"       : 115200,
    "colorOrder" : "grb"
}

colorOrder grb ist bei Verwendung von ws2812 LEDs anzugeben. Damit Hyperion die Effekte abspielen kann, muss auch der Pfad in „effects“/“paths“ angepasst werden.

Mit folgenden Befehlen kann man die Werte auch über die Kommandozeile ohne Text Editor anpassen.

sed -i '' '1h;1!H;$!d;x;s#\("device" :[^}]*"name"[ ]*: \)"[^"]*"#\1"LED-Player"#' hyperion.config.json
sed -i '' '1h;1!H;$!d;x;s#\("device" :[^}]*"type"[ ]*: \)"[^"]*"#\1"tpm2"#' hyperion.config.json
sed -i '' '1h;1!H;$!d;x;s#\("device" :[^}]*"output"[ ]*: \)"[^"]*"#\1"'"$(ls /dev/tty.usbmodem*)"'"#' hyperion.config.json
sed -i '' '1h;1!H;$!d;x;s#\("device" :[^}]*"rate"[ ]*: \)[0-9]*#\1115200#' hyperion.config.json
sed -i '' '1h;1!H;$!d;x;s#\("device" :[^}]*"colorOrder"[ ]*: \)"[^"]*"#\1"grb"#' hyperion.config.json
sed -i '' '1h;1!H;$!d;x;s#\("effects" :[^}]*"paths" :[^"]*\)"[^"]*"#\1"'"$(pwd)"'/effects"#' hyperion.config.json

Tipp: Der OS X FrameGrabber verwendet bei mehreren angeschlossenen Monitoren den Hauptbildschirm, das kann man in der Konfigurationsdatei anpassen.
Im Abschnitt „framegrabber“ muss ein zusätzlicher Parameter „display“ hinzugefügt werden mit dem index des gewünschten Displays:

"framegrabber" : 
{
    "width" : 128,
    "height" : 64,
    "frequency_Hz" : 10.0,
    "display" : 1
},

Autostart:

Wenn hyperion automatisch gestartet werden soll, muss es unter OS X als Daemon (System-weit) oder Agent (User-spezifisch) registriert werden. Dazu muss eine spezielle .plist Datei erstellt und an der richtigen Stelle abgelegt werden.

Die Struktur der hyperiond.plist Datei ist wie folgt:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>Hyperion daemon</string>
    <key>RunAtLoad</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/PATH/TO/bin/hyperiond</string>
        <string>/PATH/TO/hyperion.config.json</string>
    </array>
</dict>
</plist>

Folgender Befehl kann den Pfad in der hyperiond.plist Datei automatisch anpassen:

sed -i “ „s#/PATH/TO#$(pwd)#“ hyperiond.plist

Um alles lokal zu halten, wird hier hyperiond als User Agent gestartet. Dazu wird die Datei hyperiond.plist in den Library/LaunchAgents Ordner des aktuell angemeldeten Benutzers kopiert.

cp hyperiond.plist ~/Library/LaunchAgents/

Bei der nächsten Anmeldung wird dann hyperion automatisch gestartet. Ob alles funktioniert kann man mit folgendem Befehl testen:
launchctl load ~/Library/LaunchAgents/hyperiond.plist
und hyperion beenden kann mit
launchctl unload ~/Library/LaunchAgents/hyperiond.plist

Ein Gedanke zu „Hyperion auf OS X Yosemite kompilieren und einrichten

  1. Gamadril hat hier ein spannendes technisches Kleinod abgeliefert. Riesigen Dank! Gerne würde ich in meinem Heimkino hinter der Leinwand analog zur Beschreibung einmal ein Ambilight installieren. Die Diagonale liegt bei drei Meter zwanzig, also recht ordentlich. Es ist ja doch ein gewisser Aufand an Material. Naja mal sehen ob es meine Zeit hergibt das umzusetzen – aber spannend wäre es , unbestritten 🙂
    Herzlichen Dank für die ausführliche Beschreibung und die Mitarbeit hier im Blog!

Schreibe einen Kommentar