Philips Hue per Homematic Steuern

Ein weiterer Artikel zu meinem Lieblingsthema: Die Verbindung verschiedener Smarthome Systeme untereinander. Wer gerne Homematic nutzt, kann leider nicht auf die große Vielfalt an RGB LEDs zurückgreifen. Hier hilft Hue, aber leider ist die Verbindung zur CCU2 nicht so ganz einfach.

In diesem Artikel zeige ich, wie sich Hue Lampen relativ einfach über die CCU2 steuern lassen. Die Lampen können selbstverständlich weiter über die Hue-App bedient werden.

Die verschiedenen Lösungswege

Zum Ansprechen der Hue Bridge wird ein einfacher HTTP Aufruf verwendet. Dies kann natürlich aus dem Browser heraus erfolgen, oder über ein Skript der CCU2. Für die CCU2 gibt es folgende Möglichkeiten:

  • System.Exec: Dabei wird direkt über das Betriebssystem der CCU2 ein HTTP Aufruf gestartet, da das aber bei macnhen Usern zu Problemen führt, werde ich das hier nicht verwenden. Der Befehl wird offiziell auch nciht unterstützt. Wer sehen möchte wie das funktioniert, kann sich mein Tutorial zum Thema Push Nachrichten mit der CCU anschauen.
  • Über CUxD: Hierbei wird der HTTP Aufruf über die Zusatzsoftware CUxD durchgeführt. Genaugenommen bringt das CUxD PAket die Anwendung curl mit sich, welche dafür zuständig ist. Dieseen Weg verwende ich in diesem Tutorial.
  • Über ein Skript von hobbyquaker + CUxD: Es gibt noch ein Skript, welches ein paar Aufgaben übernimmt. Dazu muss allerdings das Skript manuell auf das Dateisystem der CCU kopiert werden. anschließend ruft es auch den CUxD Befehl auf. Es vereinfacht das ganze letztlich nur wenig. Diesen Weg habe ich mir bis jetzt nicht angeschaut, aber es ist nicht so komfortabel wie die Integration von Lightify in die CCU. Wen es interessiert, das Skript findet ihr bei GitHub.

Da das Skript von Hobbyquaker nur den Aufwand etwas reduziert, aber einen Eingriff in das Dateisystem und CUxD erfordert, habe ich mich für den zweiten Weg entschieden. Sollte das Skript irgendwann so weit sein, dass die Hue Lampen automatisch in der Geräteliste auftauchen, würde ich das ganze natürlich nochmal überdenken…

Erstellen eines API Keys auf der Hue Bridge

Um auf die API der Bridge zugreifen zu können, muss ein User bzw. Api Key angelegt werden. Dazu öffnet ihr folgende URL im Webbrowser: http:///debug/clip.html (natürlich mit der IP-Adresse der Bridge. Die IP Adresse sollte übrigens im Router fest zugewiesen werden, ansonsten funktioniert es irgendwann nicht mehr!

Nun sollten ein paar Eingabefelder erscheinen. Die folgenden Schritte zeigen, wie sich der API Key abrufen lässt.

  • Im Feld URL wird die vorgegebene URL /api/1234/ durch /api/ ersetzt.
  • Im Feld Message Body wird folgendes eingetragen: {„devicetype“:“ccu_zugriff#user1″}
  • Jetzt wird der Button auf der Bridge gedrückt
  • Ein Klick auf POST schickt die Anfrage los
  • Das Ergebnis sollte jetzt das Wort Success und einen Feld ‚username‚ enthalten. Der Username (bzw. API-Key) ist die zufällig aussehende Zeichenkette (ohne Anführungszeichen). Diese irgendwo hinkopieren, da sie später benötigt wird um sich gegenüber der Bridge zu authentifizieren.

Wenn alles richtig lief, sollte das ganze in etwa so aussehen:

Einrichtung des CUX-Daemon (CUxD)

Falls noch nicht geschehen, muss CUxD auf der CCU2 installiert werden. Wer das nicht möchte, kann auch darauf verzichten und System.Exec verwenden, dazu muss natürlich das Skript angepasst werden.

Zur Installation von CUxD wird das Paket wird von https://www.homematic-inside.de/software/cuxdaemon heruntergeladen (Achtung – CCU Version beachten!). Anschließend wird es über die Weboberfläche der CCU2 unter Einstellungen -> Systemsteuerung -> Zusatzsoftware hinzugefügt.

Nun muss noch ein Gerät auf der CCU2 erzeugt werden. Dazu unter Einstellungen -> Systemsteuerung -> CUx-Daemon die Weboberfläche öffnen.  Ein Klick auf Geräte in der oberen Navigationsleiste öffnet die Geräteverwaltung. Hier muss nun ein neues Gerät angelegt werden, dazu im linken Dropdown Feld den Eintrag ‚(28) System‚ auswählen und wie folgt konfigurieren:

Sollte die Seriennummer 1 schon belegt sein, muss das später im Skript angepasst werden, also merken! Der Name ist relativ egal, da das Gerät für alle Systembefehle verwendet werden kann. Es müssen also nicht zwei Geräte angelegt werden, wenn man Hue steuern möchte und auch Push nachrichten verschicken möchte.

Nach einem Klick auf ‚Gerät auf CCU erzeugen!‚ taucht ein neues Gerät im Posteingang der CCU2 auf. Dieses Wird einfach bestätigt. Weitere Einstellungen sind nicht notwendig.

Anlegen des Skripts

Nun wird noch ein Skript inklusive Aufruf angelegt. Dazu unter Programme und Verknüpfungen auf Programme & Zentralenverknüpfungen gehen. Mit einem Klick auf Neu wird ein neues Programm angelegt. Die Triggerbedingung überlasse ich euch…

Als Aktivität wird Skript ausgewählt. Ein klick auf die kleinen drei Punkte, öffnet die Skripteingabe, hier wird nun das folgende Skript eingegeben. Die IP-Adresse der Bridge und der API Key (siehe oben) müssen natürlich angepasst werden!

Um eine Lampe mit einem vordefinierten Farbwert einzuschalten, wird folgender Code eingefügt:

!Hue Lamen Einschalten
!------------------------------
!__IP Adresse der Hue Bridge
string ip_address = "192.168.1.172";

!__User ID in der Bridge
string api_key="9YqN4igBFdRpXo8kw3lhzzNIzPXFFSoJSn6488bV";

!__Auswahl der Lampe
string lamp ="1";

!__Farbeinstellungen
string reqdata="{\"on\":true, \"sat\":254, \"bri\":254,\"hue\":10000}";

!------ NICHT MODIFIZIEREN-------
string request="/usr/local/addons/cuxd/curl -X PUT -H \"Content-Type: application/json\" -d '" # reqdata # "' http://" # ip_address # "/api/" # api_key # "/lights/" # lamp # "/state/";
 dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(request);

Falls im vorherigen Schritt das CUxD Gerät nicht mit der Seriennummer 1 angelegt wurde, muss die Seriennummer im Skript entsprechend angepasst werden. Die Seriennummer ist die letzte Ziffer von CUX2801001 (vor dem Doppelpunkt).

Um die Lampe wieder auszuschalten, wird in der Variable ‚reqdata‘ einfach der on-Wert auf false gesetzt und die Farbinformationen können gelöscht werden. Man kann die Farbinformationen auch drin lassen, das Licht geht trotzdem aus ;) Sieht dann so aus:

!__Farbeinstellungen
string reqdata="{\"on\":false}";

Wer mehrere Lampen Schalten will, kann das auch in einem Skript hintereinander tun. Das würde dann z.b. so gehen:

!Mehrere Hue Lamen Einschalten
!------------------------------
!__IP Adresse der Hue Bridge
string ip_address = "192.168.2.172";

!__User ID in der Bridge
string api_key="9YqN4igBFdRpXo8kw3lhzzNIzPXFFSoJSn6488bV";


!----Lampe 1---
string lamp ="1";
string reqdata="{\"on\":true, \"sat\":254, \"bri\":254,\"hue\":10000}";
string request="/usr/local/addons/cuxd/curl -X PUT -H \"Content-Type: application/json\" -d '" # reqdata # "' http://" # ip_address # "/api/" # api_key # "/lights/" # lamp # "/state/";
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(request);

!----Lampe 2---
string lamp ="2";
string reqdata="{\"on\":true, \"sat\":254, \"bri\":254,\"hue\":10000}";
string request="/usr/local/addons/cuxd/curl -X PUT -H \"Content-Type: application/json\" -d '" # reqdata # "' http://" # ip_address # "/api/" # api_key # "/lights/" # lamp # "/state/";
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(request);

Hinweis: Sollten mehrere Skripte verwendet werden, empfehle ich alle Variablen im zweiten Skript umzubenennen, da es sonst zu Problemen führen kann. Die Variablen werden nach Abarbeitung des Skripts nämlich nicht gelöscht. Wer viele Skripte verwendet, sollte außerdem die Variablen entfernen und direkt in den Befehl einsetzen.

Ermitteln des Farbwerts

Um den Farbwert anzupassen muss die Variable reqdata in dem Skript angepasst werden. Das Feld hue gibt die Farbe vor, bri, die Helligkeit und sat die Sättigung. Zum ändern, einfach die Zahlen anpassen. Eine Hilfestellung zu den Farben (hue) gibt es hier: https://www.developers.meethue.com/documentation/core-concepts. Helligkeit und Sättigung lassen sich von 0-254 einstellen.

Ermittlung der Lampennummern

Um eine Übersicht über alle Lampen zu bekommen, wird einfach folgende URL aufgerufen:

http://<ip der bridge>/api/key>/

Die Antwort lässt sich mit einem JSON-Beautifier ganz gut anschauen. Dort finden sich alle Einstellungen, Softwareversionen und Lampen. Ich verwende übrigens ein Notepad++ Plugin, um JSON Daten anzuschauen. Damit erhalte ich über Strg+Shift+Alt+J eine Baumansicht.

Fazit

Wer schon im Besitz von Philips Hue ist, hat mit diesem Skript eine super Möglichkeit, seine bestehenden Lampen per Homematic zu Steuern. Wer über eine Neuanschaffung nachdenkt, sollte vielleicht auch mal einen Blick auf Lightify von Osram schauen. Diese Lampen lassen sich direkt mit der CCU (natürlich mit Umweg über das Gateway) verbinden. Diese Möglichkeit kommt direkt von eQ-3. Wie das geht habe ich hier beschrieben.

27 Kommentare
  1. Bernd
    Bernd sagte:

    Hallo … darf man hier Fragen ???
    Ich würde gerne alles in die „SWITCH|CMD_SHORT bzw. LONG“ Zeile eines CUX Gerätes schreiben …
    Da müsste dan ungefähr wie folgt aussehen … funktioniert als Script im Programmen jedoch nicht wenn ich es im CUX Gerät eintrage.

    string curlcmd=“/usr/local/addons/cuxd/curl –request PUT –data ‚{\“on\“:true}‘ http://192.x.x.x/api/key-key-key-key/lights/12/state„; dom.GetObject(„CUxD.CUX2801001:1.CMD_EXEC“).State(curlcmd);

    Also die kurzform wäre … kann mir hierbei jemand helfen ?
    Ich möchte gerne HUE Lampen und Gruppen (incl. bri / sat / Werte) mit einem CUX Gerät schalten.

    Antworten
  2. Til
    Til sagte:

    Moin!

    Ich würde gerne auch auf diesem Wege verschiedene Regeln von zB. Motion Sensoren ändern. Konkret die Zeit einer Regel, dass der „Nachtmodus“ auch wirklich erst bei Nacht aktiviert wird, sprich wenn zB. alle Smartphones im Bett aufgeladen werden oder so.

    Manuell über die Hue API im Browser bekomme ich das hin, jedoch leider nicht als JSON Script über die CCU.

    Manuell über den Browser funktioniert es so:

    URL: /api/8Yr91Z2Ta9coSwSFx4E9FfimNiIrRbMbfaUrwa5D/rules/1

    Massage:
    {„conditions“: [
    {
    „address“: „/sensors/5/state/status“,
    „operator“: „lt“,
    „value“: „1“
    },
    {
    „address“: „/config/localtime“,
    „operator“: „in“,
    „value“: „T20:00:00/T05:30:00“
    },
    {
    „address“: „/sensors/4/state/dark“,
    „operator“: „eq“,
    „value“: „true“
    },
    {
    „address“: „/sensors/3/state/presence“,
    „operator“: „eq“,
    „value“: „true“
    },
    {
    „address“: „/sensors/3/state/presence“,
    „operator“: „dx“
    }
    ]
    }

    Über die CCU müsste es doch eigentlich so funktionieren, oder nicht?

    string request=“/usr/local/addons/cuxd/curl -X PUT -H \“Content-Type: application/json\“ -d ‚“{„conditions“: [
    {
    „address“: „/sensors/5/state/status“,
    „operator“: „lt“,
    „value“: „1“
    },
    {
    „address“: „/config/localtime“,
    „operator“: „in“,
    „value“: „T20:00:00/T05:30:00“
    },
    {
    „address“: „/sensors/4/state/dark“,
    „operator“: „eq“,
    „value“: „true“
    },
    {
    „address“: „/sensors/3/state/presence“,
    „operator“: „eq“,
    „value“: „true“
    },
    {
    „address“: „/sensors/3/state/presence“,
    „operator“: „dx“
    }
    ]
    }“‚ http://192.168.178.49/api/8Yr91Z2Ta9coSwSFx4E9FfimNiIrRbMbfaUrwa5D/rules/1;
    dom.GetObject(„CUxD.CUX2801001:1.CMD_EXEC“).State(request);

    Irgendwas mache ich falsch, die Formatierung im Script dann vielleicht?
    Vielen Dank im voraus!

    Antworten
  3. Dan
    Dan sagte:

    Bei mir kommt IMMER diese Fehlermeldung
    egal ob
    {„devicetype“:“ccu_zugriff#user1″}

    oder
    {“devicetype“:“ccu_zugriff#user1″}

    Hat jemand ne Idee?

    Antworten
  4. Sebastian
    Sebastian sagte:

    Hallo Philipp,

    erst mal Danke für dein Skript. Das lief im Gegensatz zu den anderen auf anhieb. Super.

    Aber mir fehlt von einem alten Skript, das ich (warum auch immer) grad nicht mehr ans Laufen bekomme, die Faderzeit um die Lampe von ihrem jetzigen Zustand auf den neuen zu dimmen. Das konnte ich sonst mit der Transion Time angeben.

    Geht das mit deinem Skript auch irgendwie?

    Wäre super, wenn du mir hier helfen könntest.

    LG Sebastian

    Antworten
  5. Hannes
    Hannes sagte:

    Das Script läuft super, nur die Ikea-Lampen machen probleme, da dort ja die Farbe über xy gesteuert wird.
    Kannst du mir vielleicht sagen wie die werte ansprechen kann? Also ein kleines Beispiel-Script wäre super da ich nicht wirklich fitt in diesem Bereich bin.
    Danke im Voraus.

    Antworten
  6. Frank
    Frank sagte:

    Hallo zusammen,
    gibt es eine Möglichkeit die Lampen zu dimmen? Ich finde hierzu keinen Parameter.
    Nur zur Info: Mit dem Parameter ct kann man die Farbtemperatur (color temprature) einstellen. Vielleicht hilft das jemanden.
    VG, Frank

    Antworten
    • Frank
      Frank sagte:

      Beispiel zur Farbtemperatur:
      string reqdata=“{\“on\“:true, \“sat\“:44, \“bri\“:219,\“hue\“: 33848, \“ct\“:467}“;

      Antworten
      • Philipp
        Philipp sagte:

        Hi Frank, du kannst in der Zeile mit den Farbenstellungen, die Variable bri (brightness) anpassen (die Zahl hinter bei). Zulässig sind Werte zwischen 0 und 254. Also das hier:

        reqdata=“{\“on\“:true, \“sat\“:254, \“bri\“:254,\“hue\“

        Antworten
        • Frank
          Frank sagte:

          Hallo Philipp, vielen Dank für die rasche Antwort. Ich möchte aber nicht einen festen Wert einstellen, sondern, wenn ich lange auf eine Taste drücke, das Licht langsam heller bzw. dunkler wird. Also so, wie bei einem Dimmer.
          Hast Du da eine Idee?
          Vg Frank

          Antworten
  7. gonzo
    gonzo sagte:

    Nabend , ich hatte ständig auch den *Type2* fehler egal was ich machte … ich kam so ans Ziel :)

    {„devicetype“:“1234567890″}

    Antworten
  8. hdser
    hdser sagte:

    Hallo,

    ich habe die HUE Einbindung erfolgreich umgesetzt und Schalte jetzt über die Funk-Tasterschnittstelle von Homematic meine HUE-Lampen.
    Was mich daran stört ist, das das HUE-Leuchtmittel nur sehr sehr langsam hochgedimmt wird, ich habe hierzu aber noch keinen passenden Befehl oder Konfig gefunden.

    Danke vorab für Tipps/Anregungen

    Antworten
    • Philipp
      Philipp sagte:

      Hi,
      Die HUE API scheint keine Veränderung der Rampenzeit zuzulassen. Habe eben nochmal gesucht. Du wirst wohl damit leben müssen… Sorry.

      Gruß
      Philipp

      Antworten
  9. Thomas
    Thomas sagte:

    Hallo ich habe eine Lampe mit nur Weißtönen
    2700k Warmweiß
    4400k Neutralweiß
    6500k Tageslichtweiß

    Allerdings schaffe ich es nicht die veschiedenen Weißwerte zu setzen. Egal wie ich die Werte hier setze : \“sat\“:254, \“bri\“:254,\“hue\“:10000}

    Antworten
  10. Stephan
    Stephan sagte:

    Hallo,
    hatte die gleiche Fehlermeldung wie Peter.
    Die oben angegebene Eingabe (strg c):
    {„devicetype“:“ccu_zugriff#user1″}
    änderte ich auf:
    {„devicetype“:“ccu_zugriff#user1″}
    –> Habe “ statt „ vor devicetype eingetragen und alle nachfolgenden Gänsefüßchen überschrieben. Erst danach funktionierte das Anlegen des Nutzers. Ich benötigte allerdings 1h, bevor es endlich lief :-(
    Trotzdem Danke für Deine Mühe – hoffe nur, dass die nachfolgende Anleitung ohne weitere Bugs anzuwenden ist.

    Grüße vom Niederrhein

    Stephan

    Antworten
  11. Matthias
    Matthias sagte:

    Hi Phillip,
    da bei mir die ersten drei CuX Kanäle schon belegt sind, kann ich doch auch über :4 schalten, oder muss es zwingend die :1 sein?

    Antworten
    • Philipp
      Philipp sagte:

      Klar, geht mit allen. Ich habe das nicht großartig erwähnt um nicht zu verwirren. Wer etwas fitter ist, checkt das schon.

      Du brauchst aber nur ein exec device anlegen. Das kannst du dann immer wieder verwenden. Du brauchst nicht für jedes script ein eigenes anlegen.

      Antworten
  12. Christian
    Christian sagte:

    Hallo Philipp,

    super Anleitung! Das Skript funktioniert super!

    Habe zwei Fragen dazu:
    Ist es auch möglich, anstatt der einzelnen Lampen eine Gruppe von Lampen anzusteuern (die Hue-Bridge fasst ja mehrere Lampen in Gruppen zusammen) … das könnte ein paar Code-Zeilen sparen.

    Ich würde gerne auf einen Toogle einrichten (1. kurzer Tip Lampe an und 2. kurzer Tip Lampe aus), um die beiden Tasten eines Schalters z.B. unterschiedlichen Lampen zuzuordnen. Geht das?

    Viele Grüße
    Christian

    Antworten
    • Philipp
      Philipp sagte:

      Hi,
      das mit den Gruppen geht nach meinem Verständnis nicht. Über die API sieht man halt nur einzelne Lampen.

      Toggeln ist möglich, dazu musst du per Script vorher den Zustand auslesen und dann den jeweils anderen setzen. Wie man generell den Zustand eines Geräts über eine API ausliest, habe ich hier beschrieben: https://technikkram.net/2017/05/zustand-eines-yamaha-receivers-per-homematic-auslesen Das Script muss natürlich angepasst werden, insbesondere der Teil, an dem der String zerlegt wird.

      Hoffe, du kannst mit der Antwort was anfangen ;)

      Antworten
      • Jonas
        Jonas sagte:

        Hallo Philipp
        Vielen Dank für deinen Artikel. Damit war es äussert einfach und angenehm, um die Steuerung meiner Hue Lampen einzurichten.
        Ich habe das Script noch etwas erweitert, so dass auch das Toggeln möglich ist. Hierbei wird einfach im Zustand der Lampe mittels Grep noch „on: true“ gesucht. Dies ist keine wirklich saubere Lösung, funktioniert bei mir jedoch mit der CCU-2 und einer Philips Hue Bridge der 2. Generation.

        Hoffe, das Script ist lesbar, ansonsten habe ich es auch unter Github abgelegt: https://gist.github.com/jrenggli/dcb6893b4b6c317341e871f15d512c20

        !Hue Lampe ein-/ausschalten
        !------------------------------
        !__IP Adresse der Hue Bridge
        string ip_address = "192.168.2.172";
         
        !__User ID in der Bridge
        string api_key="9YqN4igBFdRpXo8kw3lhzzNIzPXFFSoJSn6488bV";
         
        !__Auswahl der Lampe
        string lamp ="1";
         
        !__Farbeinstellungen
        string reqdata_on="{\"on\":true, \"sat\":254, \"bri\":254,\"hue\":10000}";
        string reqdata_off="{\"on\":false}";
         
        !------ NICHT MODIFIZIEREN-------
        string request="/usr/local/addons/cuxd/curl -s -X GET -H \"Content-Type: application/json\" http://" # ip_address # "/api/" # api_key # "/lights | grep -o '\"on\":true' && /usr/local/addons/cuxd/curl -X PUT -H \"Content-Type: application/json\" -d '" # reqdata_off # "' http://" # ip_address # "/api/" # api_key # "/lights/" # lamp # "/state || /usr/local/addons/cuxd/curl -X PUT -H \"Content-Type: application/json\" -d '" # reqdata_on # "' http://" # ip_address # "/api/" # api_key # "/lights/" # lamp # "/state";
        dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(request);
        
        Antworten
  13. Peter
    Peter sagte:

    [
    {
    „error“: {
    „type“: 2,
    „address“: „“,
    „description“: „body contains invalid json“
    }
    }
    ]

    Antworten
    • Stephan
      Stephan sagte:

      Hallo,
      hatte die gleiche Fehlermeldung wie Peter.
      Die oben angegebene Eingabe (strg c):
      {„devicetype“:“ccu_zugriff#user1″}
      änderte ich auf:
      {„devicetype“:“ccu_zugriff#user1″}
      –> Habe “ statt „ vor devicetype eingetragen und alle nachfolgenden Gänsefüßchen überschrieben. Erst danach funktionierte das Anlegen des Nutzers. Ich benötigte allerdings 1h, bevor es endlich lief :-(
      Trotzdem Danke für Deine Mühe – hoffe nur, dass die nachfolgende Anleitung ohne weitere Bugs anzuwenden ist.

      Grüße vom Niederrhein

      Stephan

      Antworten
      • Stephan
        Stephan sagte:

        SRY – Muss natürlich
        änderte ich auf:
        {„devicetype“:“ccu_zugriff#user1″}
        heißen.
        Nachtrag: Das Skript funktioniert – Nochmals Danke ;-)
        @Philipp:
        Bitte den Doppelpost löschen

        Antworten
        • Stephan
          Stephan sagte:

          Boah Ey – Das erste Gänsefüßchen wird hier im Blog beim Absenden immer nach unten gesetzt, es sei denn man nutzt den Ascii Code?

          {“devicetype“:“ccu_zugriff#user1″}

          Last Try …

          Antworten

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert