---
# System prepended metadata

title: ms公開教室　前段階 -Philips Hue 知識編-

---

# ms公開教室　前段階 -Philips Hue 知識編-
## 要件定義／実装機能
- スマート電球であるPhilips HueのAPIをPythonで叩く
- 最終目的はPana BMIを使って電球をコントロールすること
- まずPythonでHueをいじれるようになる
- 次にBMIの信号を変換するコードを書く
- 結果：BMIでHueをいじれる！

### Hueってなに？
IoT電球。いろんな色にひかる
中にコンピュータが入ってるので、それによっていろいろできます
IoTって言ってるくらいなので、何かしらの方法でそのコンピュータはインターネットに接続して通信しているはず。
規定のものはHTTPサーバーを使っている。

> HTTPサーバー：
> サーバーの中に登録されたURLについて、他のコンピュータからリクエストがあった際に通信を行うプログラム。GET（情報のダウンロード）とUPDATE（情報の更新）、PUT(情報の新登録)、DELETE（情報の消去）の信号が想定されていて、処理を行う。昔はPOST（UPDATEとPUT）だった

サーバーは電球の中にある。スマホアプリ使う時は、アプリ側がサーバーであるHueにリクエストを送っているということ。

"Pythonで叩く"というのは、PythonのプログラムでURLに対してGETとかPOSTのリクエストを送るということ。

POSTするとSUCCESSかFAILが返ってくる

### みんな大好き公式Docs
[公式の情報](https://developers.meethue.com/develop/hue-api/lights-api/)
ログインが必要。URLはhttps:/ /IPアドレスが省略されている。

### Pythonでどうやってやんねん
GETに関しては、実はPythonを使うまでもない
Google ChromeとかのアドレスバーにURLを打ち込んで仕舞えばできる
ただし、同じネットワーク（つまりWi-Fi）に繋いでいないとだめ
- private IP address: ローカルネットワークだけしかアクセス不可能
- public IP address: インターネットに繋いでいる全世界に公開

今回、Hueはprivateだから、ローカルネットワークが同じじゃないとだめなんですね〜

Pythonを使いたいなら、[Requests 人間のためのHTTP](https://requests-docs-ja.readthedocs.io/en/latest/)というライブラリを使おう
**人権をもって**PythonでHTTPのURLを叩くことができるよ！

GETしたりした時、情報はDictionaryの形でやってくる

情報をPOSTするときの方法3つ
- param: URLの後に?をつける。データをDictionaryの形で渡す　データを追加するのではなく、URLを変更する（Headerの変更）
URLは長さが決まってるので、複雑なデータは渡せないのが欠点（画像とかね）
```
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=payload)

>>> print r.url
u'http://httpbin.org/get?key2=value2&key1=value1'
```

- data: エンコードしたデータを渡したいとき。Data引数に入れれば自動でエンコードしてくれる。データ自体を渡している（Bodyの変更）

```
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> print r.text
{
  ...
  "form": {
    "key2": "value2",
    "key1": "value1"
  },
  ...
}
```

>- （参考）URL自体に情報を埋め込む
URL/~~~ という感じにできる
ただし情報を1つしか埋め込むことしかできない（Headerの変更）　サポート外

Hueは大体
```
turnon = {"on" : true}
r = requests.put("http://api/<username>/lights/<id>/state", data=turnon)
```
みたいにすればよいということです。
別のURLの時は面倒だけど毎回やろうね