# 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の時は面倒だけど毎回やろうね