この投稿は Electric Imp Advent Calendar 2015 の5日目の記事です。
リモートからLEDを制御する
前回は、Electric ImpでLEDを点滅させるプログラムを作成しました。
前回は、タイマーを使って一定時間ごとにLEDのONとOFFを切り替えて、LEDを点滅させましたが、今回はリモートからLEDのONとOFFを切り替えるプログラムにしてみます。
回路は前回と同じです。
デバイスのコードを書く
led <- hardware.pin9; led.configure(DIGITAL_OUT, 0); function setLedState(state) { server.log("Set LED to state: " + state); led.write(state); } agent.on("set.led", setLedState);
前回同様、PIN9に繋がったLEDを制御するので、PIN9をデジタル出力に設定して、初期状態LOWを設定しています。
setLedState
という関数を定義して、引数として渡された state
をPIN9の出力状態にそのまま反映させています。
agent.on("set.led", setLedState);
agent.on
はデバイスとエージェントでメッセージをやり取りするためのAPIです。エージェントからメッセージ set.led
を受け取ると関数 setLedState
をコールします。
エージェントのコードを書く
server.log("Turn LED On: " + http.agenturl() + "?led=1"); server.log("Turn LED Off: " + http.agenturl() + "?led=0"); function requestHandler(request, response) { try { if ("led" in request.query && request.query.led == "1" || request.query.led == "0") { local ledState = request.query.led.tointeger(); device.send("set.led", ledState); response.send(200, "OK\n"); } else { response.send(400, "Bad Request\n"); } } catch (ex) { response.send(500, "Internal Server Error: " + ex + "\n"); } } http.onrequest(requestHandler);
最初の server.log
はエージェントのHTTP URLをログに出力しています。エージェント用のURLはデバイスをモデルにアサインしたときに、自動的に割り当てられます。
http.onrequest
APIでエージェントURLにアクセスされたときに呼び出される関数を設定します。
requestHandler
関数ではクエリストリングに led
が指定されているか、また、その値が1か0かを判定して条件に一致していれば device.send
APIを呼び出しています。
device.send
はエージェントからデバイスにメッセージを送信するためのAPIで、デバイス側のコードの agent.on
で受信されます。メッセージを送信する際に、 ledState
としてクエリストリングに指定されていた値を渡しています。
response.send
でHTTPレスポンスを返すことができます。正常に処理出来た場合は、 200 OK を返します。
デバイスを遠隔操作する
"Build and Run" を押して、エージェントとデバイスのプログラムをデプロイします。
Electric Impのエージェント用のURLはWebIDEの "agent link" から取得できます。
デプロイできたら、ウェブブラウザかcURLでエージェントを叩いてみます。
$ curl -XGET https://agent.electricimp.com/XXXXXXXX?led=1 OK
$ curl -XGET https://agent.electricimp.com/XXXXXXXX?led=0 OK
クエリストリングに led=1
を渡したときにLEDが点灯、 led=0
を渡すとLEDが消灯すれば成功です!
簡単ですが、Electric Impを使ってリモートからデバイスを遠隔操作するためのプログラムを紹介しました。 ImpCloudによって簡単なものであれば、サーバーを自分で用意する必要もなく出来上がるのはお手軽でいいですね。
今回はエージェントのURLを直接叩くことによってデバイスを制御しましたが、次回はWebページを表示してボタン等でLEDを制御してみます。