Philips Hue & Ambilight

DSCF2494

Ich habe mir kürzlich ein Set aus drei Philips Hue Lampen zur Wohnzimmerbeleuchtung besorgt. Diese kommunizieren über ZigBee mit einer Zentrale, die an das lokale Ethernet angeschlossen wird. Zum Steuern der Hue stellt Philips zwei Apps zur Verfügung. “Philips Hue” dient dazu, Presets zu definieren und durch Auswahl die Lampen entsprechend umzukonfigurieren. Das Interface ist etwas gewöhnungsbedürftig - funktioniert aber insgesamt ziemlich gut. Dann gibt es noch die App “Ambilight+hue”, die die Verbindung zwischen dem Ambilight und den Hue-Lampen herstellt. Hier lässt sich konfigurieren, wo die Lampen im Raum stehen und anschließend können sie die Ambilight-Farben annehmen, die dazu räumlich passen. Das Ganze hat allerdings zwei Nachteile. Einerseits muss das Handy/Tablet die ganze Zeit als Gateway aktiv sein und der Akku wird in kürzester Zeit leergenuckelt. Aus unerklärlichen Gründen läuft die Kommunikation nicht direkt zwischen Fernseher und Lampen. Außerdem sind die Latenzen relativ hoch (ich schätze zwischen 1 und 2 Sekunden), was den Effekt bei schnellen Action-Szenen zunichte macht. Jetzt drängt sich natürlich geradezu die Frage auf, wie man diese Lampen selbst steuern kann.

Hue steuern

Ich suchte ein Bisschen nach Projekten, die sich mit der Ansteuerung der Hue-Lampen beschäftigen und ziemlich schnell stellte sich heraus, dass die Ruby-Bibliothek Huey von Josh Simones am sinnvollsten aussieht. Nachdem ich die Lampen angeschlossen hatte lud ich also sofort das Gem runter und machte mich nach langer, langer Zeit mal wieder mit Ruby vertraut. Keine 20 Minuten später lief ein kleines Beispielprogramm, das zwischen Zufallsfarben wechselte:

IMG_1089

Ich spielte ein Bisschen mit verschiedenen Farben herum und stellte fest, dass sich manche Farben nicht so richtig einstellen ließen. Die Begründung dafür liefert Ross McKillup in seinem Blogpost:

It's not RGB What's that I hear you say? Of course it's RGB... Well it is and it isn't. The sources within a Hue are not primary Red, Green and Blue as are used in other LED lighting products; The Red is a touch more 'orange', the Green is closer to a 'lime-green' and the Blue is closer to Violet. They remind me of the intermediate colours in the ETC Selador x7 colour system. Why did Philips do this? Simple - it enables the Hue to produce much nicer whites (at any colour temperature) than a normal RGB fixture and also much nicer pastel shades, which are likely to be the most common use of Hue. The problem (from our point of view) is you can't easily map RGB colours to Hue, nor can you mix them with other LED fixtures and expect the same results. It's also why the CIE 1931 co-ordinates don't work exactly as you might expect.

Das war dann auch eine gute Gelegenheit, sich mit dem HSL-Farbraum auseinanderzusetzen, der für solche Anwendungen auch total Sinn macht (“Ich hätte gerne drei Lampen, die gleich hell und gleich gesättigt sind, aber unterschiedliche Farben haben”).

Ambilight-Daten auslesen

Im zweiten Schritt suchte ich dann nach Informationen, wie man den Zustand der Ambilight-LEDs über das Netzwerk auslesen kann. Schnell wurde ich auch hier fündig. Diesmal auf SourceForge, wo Philips die Beschreibung der joint space API gehostet hat. Darin fand sich dann eine HTTP JSON API, die mir ein breites Grinsen auf’s Gesicht zauberte. Ein HTTP-Request zu dieser URL http://192.168.0.15:1925/1/ambilight/processed liefert als Ergebnis die aktuellen Farben der Ambilight-LEDs:

<code class="language-javascript">{
    "layer1": {
        "left": {
            "0": {
                "r": 11,
                "g": 11,
                "b": 11
            },
            "1": {
                "r": 11,
                "g": 11,
                "b": 11
            },
            "2": {
                "r": 11,
                "g": 11,
                "b": 11
            }
        },
        "top": {
            "0": {
                "r": 11,
                "g": 11,
                "b": 11
            },
            "1": {
                "r": 11,
                "g": 11,
                "b": 11
            },
            "2": {
                "r": 11,
                "g": 11,
                "b": 11
            },
            "3": {
                "r": 11,
                "g": 11,
                "b": 11
            },
            "4": {
                "r": 11,
                "g": 11,
                "b": 11
            },
            "5": {
                "r": 11,
                "g": 11,
                "b": 11
            },
            "6": {
                "r": 11,
                "g": 11,
                "b": 11
            }
        },
        "right": {
            "0": {
                "r": 11,
                "g": 11,
                "b": 11
            },
            "1": {
                "r": 11,
                "g": 11,
                "b": 11
            },
            "2": {
                "r": 11,
                "g": 11,
                "b": 11
            }
        },
        "bottom": {

        }
    }
}</code>

AmbiHue

Also habe ich etwas Ruby programmiert und ein kleines Programm zusammengeknuppert, das ständig den Fernseher ausliest und entsprechend der Voreinstellungen die Lampen konfiguriert.

<code class="language-ruby">
########### Configuration #############
$HUEIP = '192.168.0.16'
$TVIP = '192.168.0.15'

# Define from which side the colors should be read
$COLOR1_SIDE = "top"
$COLOR2_SIDE = "top"
$COLOR3_SIDE = "left"

# Each side has multiple elements that are numbered clockwise
$COLOR1_NUMBER = "6"
$COLOR2_NUMBER = "0"
$COLOR3_NUMBER = "2"

# Define which Hue lamps should be used
#   :dynamic changes the color according to the TV
#   :dim sets the lamp to a dim white
#   : off ignores this lamp
$USE_HUE1 = :dynamic
$USE_HUE2 = :dynamic
$USE_HUE3 = :dim

# Define how the Hue colors should be set
#   :direct direct mapping of the colors to the hues
#   :lowpass to reduce the light flashing the brightness changes slower
$COLOR_MODE = :lowpass

# Define the power of the lowpass filter [0...1]. 1 = immediate response
$LP_FACTOR = 0.3
#######################################
</code>

Das funktioniert bei schnellen dynamischen Videos wie Trailern aufgrund des Delays nicht ganz so gut. Hier muss man vermutlich den Tiefpass-Faktor noch höher stellen - sieht dann aber auch weniger vom Effekt:

Man sieht hier sehr schön das Delay, das zwar nicht mehr ganz so groß ist, wie bei der iOS-App, aber immer noch deutlich merkbar. Zunächst dachte ich, dass der Fernseher die Geschwindigkeit beim Auslesen begrenzt. Das ist allerdings falsch. Vielmehr ist es die Hue-Bridge. Das setzen einer Lampe dauert genau 250ms. Somit komme ich bei zwei Lampen (Parallelisieren funktioniert hier leider nicht) auf eine Aktualisierungsrate von 2Hz. Zu erkennen ist auch, dass erst die rechte und dann die linke Lampe aktualisiert werden. Bei langsameren Videos wie der heute-show gefällt mir das allerdings sehr gut:

Beim Spielen wird die Atmosphäre sehr schön erweitert. Man merkt, wie der ganze Raum heller wird wenn man gen Himmel guckt und die komplette Bude brennt, wenn eine Granate geschmissen wurde. Schön wäre es, wenn ein Software-Update diese Latenzen demnächst noch ein Bisschen drücken würde. Dann wäre der Effekt echt genial. Auf jeden Fall bin ich schwer begeistert davon, wie offen diese Systeme doch sind und Philips hat wirklich einen guten Job gemacht, die Informationen so einfach wie möglich bereitzustellen. Vielen Dank dafür!

Offizielle Hue-API Source der Hue-Dokumentation auf GitHub Philips Hue Development Platform Weitere Informationen zur Hue-API