Integracja z Philips HUE

Konkurentem w inteligentnym oświetleniu domów dla IKEA Tradfri jest Philips HUE. W tym tutorialu chciałbym pokazać jak sterować oświetleniem HUE z systemu Grenton.

Do integracji też jest wymagane posiadanie mostka HUE, z tym, że w przypadku HUE nie potrzebujemy pośrednictwa Node-Red. Philips HUE udostępnia REST Web API, za pomocą którego można się komunikować bezpośrednio z użyciem modułu Gate Http.

API dla Philips HUE jest rozbudowane i pozwala na bardzo dużo. Jest ono dostępne na stronie https://developers.meethue.com/ , wymagana jest darmowa rejestracja jako developer aplikacji.

W przykładzie pokażę jak włączyć/wyłączyć, sterować jasnością  grupy świateł.

Wykorzystamy Groups API od "Hue API": /api/<username>/groups

  1. Na samym początku należy skonfigurować instalację oświetlenia Philips HUE za pomocą dedykowanej aplikacji mobilnej "Hue".

  2. Następnie trzeba poznać adres IP mostka HUE jaki otrzymała od routera. Trzeba się zalogować do panelu administracyjnego routera i zanotować adres IP.

  3. Mostek Philips HUE udostępnia interfejs do testowania API za pomocą przeglądarki internetowej. Interfejs jest dostępny pod adresem https://<adresip mostka>/debug/clip.html

  4. Dzięki testowemu interfejsowi możemy uzyskać nazwę użytkownika (klucz do API) na potrzeby integracji

    1. klikamy przycisk na mostku Hue
    2. w "Message Body" wpisujemy

  5. {"devicetype":"my_hue_app#gate http" }
    1. URL "/api"
    2. wysyłamy zapytanie klikając przycisk "POST"
    3. W polu "response" pojawi się nazwa użytkownika. Należy ja sobie zapisać. Będzie potrzebna.
     
  6. Teraz z użyciem tego samego interfejsu możemy pobrać informacje o grupach:

    1. URL ustawiamy na     /api/<username>/groups
    2. Message Body zostawiamy puste
    3. Klikamy GET
    4. W oknie "Command Response" otrzymamy JSON z którego możemy odczytać identyfikatory grupy i nazwy oraz pozostałe atrybuty opisujące stan w danej chwili

     

  7. W GATE HTTP tworzymy następujące cechy użytkownika:

    • hue_api_name - (string) nazwa użytkownika wygenerowana w wcześniejszych krokach
    • hue_bri_1 - (number) wartość jasności świecenia
    • hue_on_1 - (boolean) wskazanie czy światło jest włączone czy wyłączone
  8. W nazwie dobrze jest dać identyfikator grupy lub nazwę. W przykładzie używany jest identyfikator grupy 1.

    Tworzymy wirtualny obiekt HttpRequest, który będzie wykorzystany do obsługi połączenia z mostkiem Philips HUE. Konfigurujemy go następująco:

    • Host - adres IP mostka HUE
    • Path - /api
    • Method - PUT
    • RequestType i ResponseType - JSON

     

  9. Do sterowania wykorzystany zostanie Smart Panel i zdarzenia przycisków:

    • OnClick - włączenie/wyłączenie, zwiększenie/zmniejszenie jasności
    • OnHold - zwiększanie i zmniejszanie jasności
  10. Skrypt do włączania wyłączania światła Hue w grupie 1 "work room":

     

    local var = GATE_HTTP->hue_on_1
    local reqJson = nil
    
    if var == 0 then
        var = 1
        reqJson = { on = true }
    else
        reqJson = { on = false }
        var = 0
    end
    
    local path1 = "/api/".. GATE_HTTP->hue_api_name .."/groups/1/action"
    
    GATE_HTTP->hue_on_1 = var
    GATE_HTTP->hueRequest->SetPath(path1)
    GATE_HTTP->hueRequest->SetRequestBody(reqJson)
    GATE_HTTP->hueRequest->SendRequest()
     

     

    Skrypt do rozjaśniania oświetlenia, z parametrem upVar:

    local bright = GATE_HTTP->hue_bri_1
    
    if (bright + upVar) <= 255 then
        bright = bright + upVar
        GATE_HTTP->hue_bri_1 = bright
    else
        GATE_HTTP->hue_bri_1 = 255
        bright = 255
    end
    
    local hueJSON = {
    on = true,
    bri = bright
    }
    
    local path1 = "/api/".. GATE_HTTP->hue_api_name .."/groups/1/action"
    
    GATE_HTTP->hueRequest->SetPath(path1)
    GATE_HTTP->hueRequest->SetRequestBody(hueJSON)
    GATE_HTTP->hueRequest->SendRequest()
     

    Skrypt do ściemniania oświetlenia z parametrem downVar

    local bright = GATE_HTTP->hue_bri_1
    
    if (bright - downVar) >= 0 then
        bright = bright - downVar
        GATE_HTTP->hue_bri_1 = bright
    else
        bright = 0
        GATE_HTTP->hue_bri_1 = 0
    end
    
    local hueJSON = nil
    if bright == 0 then
        hueJSON = {
            on = false,
            bri = bright
        }
    else
        hueJSON = {
        on = true,
        bri = bright
        }
        
    end
    
    local path1 = "/api/".. GATE_HTTP->hue_api_name .."/groups/1/action"
    
    GATE_HTTP->hueRequest->SetPath(path1)
    GATE_HTTP->hueRequest->SetRequestBody(hueJSON)
    GATE_HTTP->hueRequest->SendRequest()

    Skrypty przyjmują parametry, które definiują wielkość o jaką rozjaśnić/ściemnić światło, oraz pilnują by nie przekroczyć wartości skrajnych