conect+ | IoT Data Design

© conect.plus Corp. All Rights Reserved.

  • conect+

Hueとconect+をつなげてみた 〜スマート電球 Philips Hue APIの使い方

最終更新: 2019年12月5日

スマート電球 “Hue” の制御API周りについてまとめてみました。

以下の構成です。


準備編

(1) Hue API デバッグツールへのアクセス

(2) デバッグツールを使ってHueの状態を確認してみる

(3) デバッグツールを使ってHueを操作してみる

実践編(次ページ)

(4) デバッグツールを使わずにパソコンから操作してみる

(5) IoTデバイスをまとめて管理できるconect+アプリからHueを操作する


スマート電球?

スマート電球は、家中どこにいても、外出先からでもスマホなどから簡単に電源を操作できる電球(照明)で、色や明るさを変えられるものもあります。

なかでもPhilips社のスマート電球 “Hue” は、ラインナップも豊富で話題のIoT機器のひとつです。

Hueにはコントロール用の公式アプリもありますが、Hueの制御用APIを使って自分好みにカスタマイズしてみます。

Philips Hueについて → https://www2.meethue.com/ja-jp

★今回使ったHueはこちらです。

『Philips Hue White Ambiance スターターキット』

Hueの開発を行う際は、以下の公式デベロッパサイトに手順が書かれています(英語)が、

この記事では、日本語でデベロッパサイトに記載の手順を追って見ていきます。

Hue デベロッパサイト → https://developers.meethue.com/

(技術仕様などを見るにはデベロッパアカウントが必要になります。この記事はその内容の一部をまとめたものです)

はじめに、開発用のPCとHueブリッジが同じネットワーク内にあることを確認してください。

Hueのネットワーク設定は、Hueの公式アプリで行うことができます。PCとHueブリッジを接続してインターネット共有するのも手です。


(1) Hue API デバッグツールへのアクセス

★まず、下記のURLからHueブリッジのIPアドレスを確認します。

HueブリッジのIPアドレス確認 → https://www.meethue.com/api/nupnp

★次に、Hue API デバッグツールにアクセスします。

Hue API デバッグツール → http://[今確認したHueブリッジのIPアドレス]/debug/clip.html

★最後に、ユーザを作成します。

Hueブリッジの真ん中のボタンを押してから、デバッグツールで以下のように入力します。


URL: /api

Message Body: {"devicetype":"(任意の英字名)"}

ボタン: POST

Command Responseに “success” という文字と “username” が返ってくれば成功です。(JSON形式)

“username” は、どこかにメモしておきましょう。

これで、Hueの状態の確認(GET)や、Hueの操作(PUT)ができるようになりました。


(2) デバッグツールを使ってHueの状態を確認してみる

★Hueの状態を取得してみましょう。

以下のURLは、状態取得用のGETのAPIのURLです。制御用のPUTは(3)に後述します。


URL: http://[HueブリッジのIPアドレス]/api/[今得たusername]/lights

Message Body: (なし)

ボタン: GET

Command ResponseにHueランプの情報が返ってきます。このなかで、“state”の部分の各キーがHueの状態を表しています。

URLの最後に "/[電球のID]" をつけると、そのIDの電球の情報のみを得ることができます。

★キーの説明★

返ってきたランプの情報のはじめに格納されている“1”や“2”などの値は、電球のIDです。(3)で電球を操作する際にこのIDを指定します。

(※キーは、ラインナップにより異なるものも(共通のものも)あります。これはWhite Ambianceスターターセットのものです。)


“on”: 電球がONのとき“True”、OFFのとき“False”のブーリアンを格納します。

“bri”: 明るさの値です。8bit (0~255) の数値を格納します。

“ct”: 色味の値です。153~454 の数値を格納します。(色温度Kの値とは異なります)

“alert”: 電球の状態を周期的に変更するための値です。“none”, “select”, “lselect”の3種のStringを格納します。

 ↪︎“none”: デフォルトの状態

 ↪︎“select”: 電球が1回のみ明るさを変化させる

 ↪︎“lselect”: 電球が“none”を受信するまでの間、明るさを変化させる

“colormode”: 電球が現在動作しているカラーモードの種類を格納します。White Ambianceは“ct”のみをサポートしています。

“reachable”: 電球がブリッジに接続されているとき“True”、そうでないとき“False”のブーリアンを格納します。

その他のキーについては、下記デベロッパサイトのAPIページをご覧ください。(英語)

APIについて→ https://developers.meethue.com/develop/hue-api/lights-api/

(デベロッパアカウントが必要です)


(3) デバッグツールを使ってHueを操作してみる

★状態取得ができたら、Hueを操作してみます。

以下のURLは、制御用のPUTのAPIのURLです。状態確認用のGETは(2)に上述しました。


URL: http://[HueブリッジのIPアドレス]/api/[username]/lights/[電球のID]/state

Message Body: (下記します)

ボタン: PUT

Message Bodyには、(2)の「★キーの説明★」にあるキーとデータを、目的に応じて以下のように入力します。

改行は任意ですが、人間が見やすいので改行するのも良いでしょう。

例えば、以下は

・明るさ(bri): 120

・色味(ct): 200

・点滅(alert)させる: "lselect"

・電球(on)をONにする: true

の挙動を(同時に)Hueに命令する入力です。

↓コピペ用


{ "bri":120, "on":true, "ct":200, "alert":"lselect" }

これで、パソコンから電球を操作できるようになりました!

以上が「準備編」になります。

次ページ「実践編」では、準備編でご紹介したGETやPUTのAPIを用いて、IoTデバイスをまとめて管理できるconect+アプリからHueを操作してみたいと思います。


<実践編>

前ページの「準備編」に引き続き、Hueの実践的な使い方をご紹介します。

以下の構成です。


実践編

(4) デバッグツールを使わずにパソコンから操作してみる

(5) IoTデバイスをまとめて管理できるconect+アプリからHueを操作する

準備編(前ページ)

(1) Hue API デバッグツールへのアクセス

(2) デバッグツールを使ってHueの状態を確認してみる

(3) デバッグツールを使ってHueを操作してみる


(4) デバッグツールを使わずにパソコンから操作してみる

★今度はパソコン上のプログラムからHueを操作してみます。

(前ページ(3)で、ブラウザ上のデバッグツールを使ってHueを正しく操作できることを確認してください)

Python3系のプログラムを使って操作してみます。プログラムはいたってシンプルです。


# coding: utf-8 import requests

api = 'http://[前ページで得たHueブリッジのIPアドレス]/api/[前ページで得たusername]/lights'

requests.put(api + '/[電球のID]/state', json = {[任意のJSONデータ]})

上記 “[任意のJSONデータ]” は、前ページ(3)の “Message Body” に入力したJSONデータと同様です。

以下は、上記プログラムに基づいて 電球ID=1 のHueに対して

<1> 電球(on)をONにする: true、明るさ(bri): 120、色味(ct): 153

<2> 1秒保持(スリープ)

<3> 色味(ct): 454

<4> 1秒保持(スリープ)

<5> 電球(on)をOFFにする: false

の挙動を(順番に)命令するプログラム例です。


# coding: utf-8 import requests import time

api = 'http://[前ページで得たHueブリッジのIPアドレス]/api/[前ページで得たusername]/lights'

requests.put(api + '/1/state', json = {"on":True,"bri":120,"ct":153})

time.sleep(1)

requests.put(api + '/1/state', json = {"ct":454})

time.sleep(1)

requests.put(api + '/1/state', json = {"on":False})

※Hueのラインナップにより、各パラメタの有効な数値範囲は異なるものがあります。今回使用しているのは『Philips Hue White Ambiance スターターキット』です。各キーの説明は前ページ(3)へ。

上記のプログラムを実行します。Hueが白色で点灯し、そのあとオレンジ色になって消灯すれば成功です。

いよいよIoTアプリ「conect+」を使ってHueを操作してみます!


(5) IoTデバイスをまとめて管理できるconect+アプリからHueを操作する

上述(4)のプログラムに基づいて、conect+アプリを使ってHueを操作してみます。

今回は、ON/OFF・明るさ・色味をそれぞれ操作してみます。

★まず、conect+のWeb管理画面にアクセスします。(必要な会員登録は済ませておきます。)

管理画面 → https://auth.conect.plus/signin

★次に、管理画面でconect+プロジェクトを作成します。

◆conect+プロジェクトの作成◆

conect+で新しいプロジェクトを作成し、Web APIで連携する設定を行います。(これまでのブログ等でご紹介しているconect+の設定と同様です。)

クリエイト > 編集 > 基本情報 で「WebAPI」を選択し、「製品名」(任意の名前)を入力します。ここでは「Philips Hue」と入力しました。

そのまま「センサー」の項目へ移動し、「キー」と「センサー名称」を入力します。「キー」は、後述するPythonプログラム内で用いるデバイス識別子です。「追加」ボタンを押して、最後に右上の「保存」です。「画像」の項目では、センサーの画像を登録できます(任意)。

次に、WebAPIの設定を行います。再び「クリエイト」に戻って、編集 > WebAPI 選択し、「APIキー生成」をクリックすると、この画面に遷移します。これでAPIキーを生成できました。

クリエイト > プロジェクトの画像部分をクリックでクリエイト画面です。必要なウィジェットを選択します。ウィジェットをクリックして選んだら、設定アイコン(スパナアイコン)をクリックで、どのセンサのデータを表示させるかを選択できます。「センサー(表示)」の項目に、②で追加したセンサーが表示されています。画像では、登録した「電源」のセンサが表示されています。

conect+側の設定は以上です。

★最後に、プログラム(下記)を実行します。

下記のプログラムをパソコン上で実行してみます。


プログラム概要

・ひとつのHueを操作するプログラムです。(複数のHueについても同様に実装できます。)

・3秒ごとにHueの状態を拾いに行き、拾った状態をconect+のAPIを通してconect+アプリに表示します。

・conect+アプリからの操作を受け付け、状態の変更をconect+サーバ、Hueブリッジを通してHueに反映します。

・開発環境:Mac OS X

▼ プログラム(クリックで展開)



# coding: utf-8
import json
import requests
import pprint
import sys
import re
import time

# POSTfrom pytz import timezone
from datetime import datetime

def getdata(url):   # Hueとconect+で共用
    response = requests.get(url[0])
    if response.status_code == 200:
        jdict = response.json()
        return jdict

def parse(jdict):
    api_key = '[conect+のAPIキー]'
    valueof = []
    onoff_ = jdict['1']['state']['on']
    brightness_ = jdict['1']['state']['bri']
    colourtemp_ = jdict['1']['state']['ct']

    onoff = 1 if onoff_==True else 0    # ON:1,OFF:0
    valueof.append(['onoff',onoff])
    brightness = int(((brightness_+1)/254)*100)  # %表示へ変換
    valueof.append(['brightness',brightness])
    colourtemp = int(((colourtemp_+1-153)/301)*100)
    valueof.append(['colourtemp',colourtemp])
    print('STATE:',valueof)
    length = len(valueof)
    for j in range(length):
        post_data(api_key, 'Hue1', valueof[j][0], now_time_str(), valueof[j][1])

def control(jdict,url):
    # getしたデータのキーの最新10を取得
    data = []
    tmpdata = []
    for t in range(10):
        tmpdata.append([jdict['sensingDatas'][t]['key'],jdict['sensingDatas'][t]['value1']])
    
    # 前から見つけて行って最新のものをそれぞれdataに格納
    flag_onoff = 0
    flag_brightness = 0
    flag_ct = 0

    for t in range(len(tmpdata)):
        if(flag_onoff==0):
            if(tmpdata[t][0]=='onoff'):
                data.insert(0,[tmpdata[t][0],int(tmpdata[t][1])])
                flag_onoff = 1
        if(flag_brightness==0):
            if(tmpdata[t][0]=='brightness'):
                data.insert(1,[tmpdata[t][0],int(tmpdata[t][1])])
                flag_brightness = 1
        if(flag_ct==0):
            if(tmpdata[t][0]=='colourtemp'):
                data.insert(2,[tmpdata[t][0],int(tmpdata[t][1])])
                flag_ct = 1
        if(flag_onoff + flag_brightness + flag_ct == 3):
            break

    for i in range(len(data)):
        if(data[i][0]=='onoff'):
            # on/offに切り替え
            if data[i][1] == 1:
                ctrlstates(url,'on',True)
            elif data[i][1] != 1:
                ctrlstates(url,'on',False)
        elif(data[i][0]=='brightness'):
            # 明るさを切り替え
            bright = int((int(data[i][1])*254/100)) # parseの逆算
            ctrlstates(url,'bri',bright)
        elif(data[i][0]=='colourtemp'):
            # 色温度を切り替え
            colour = int((int(data[i][1])*301/100)+153) # parseの逆算
            ctrlstates(url,'ct',colour)

def post_data(api_key, device_id, data_key, sensing_at, value):
    url = "https://api.conect.plus/v1/" + api_key + "/data"
    response = requests.post(
            url,
            json.dumps({
                    'deviceUuid':device_id,
                    'key':data_key,
                    'sensingAt':sensing_at,
                    'value1':value}),
    headers = {'Content-Type': 'application/json'})


def ctrlstates(ctrurl,data_key,value):
    requests.put(ctrurl,json = {data_key:value})

def now_time_str():
    return datetime.now(timezone('UTC')).strftime("%Y-%m-%d %H:%M:%S")

if __name__ == '__main__':
    print('')
    dataurl = ['http://[HueブリッジのIPアドレス]/api/[username]/lights','dataurl']
    ctrstate = ['https://api.conect.plus/v1/[conect+のAPIキー]/data?deviceName=[conect+でのデバイス名]','ctrstate']
    ctrurl = 'http://[HueブリッジのIPアドレス]/api/[username]/lights/[電球のID]/state'

    loop_counter = 0
    while True:
        parse(getdata(dataurl)) # Hueのデータ取得、parseの中でconect+にpost
        print('Input in: ',end='')
        for i in range(3,0,-1): 
            time.sleep(1) 
            sys.stdout.write(str(i)+' ') 
            sys.stdout.flush()
        time.sleep(1)
        print('')
        control(getdata(ctrstate),ctrurl)

        loop_counter += 1
        if(loop_counter%100==0): print('###',loop_counter,'loop ###') # プログラムループ回数を100回ごとにprint

プログラムが正しく動作している時のターミナル出力です。これで、conect+でHueの操作ができるようになりました!

最後に、スマートフォンのconect+アプリを使って動作の確認をしてみます。アプリ右上のクリップアイコンをタップし、上記プログラムmain関数内で指定した “[conect+でのデバイス名]” を入力すれば完了です 。(画像は先日リリースしたAndoroid版を使用しています!)

以上、Philips HueのAPIについてと、conect+との連携方法を解説いたしました。

conect+を使えば、これまでのブログでご紹介してきたように様々なデバイスでとてもカンタンにIoTを実現できます。

IoTアプリにご興味のある方は、是非conect+をお試しください。

66回の閲覧