Ola Kae Tode Tai

すべてのエンジニアに、追い風を祈る。

Electric ImpでLEDを遠隔操作する

この投稿は Electric Imp Advent Calendar 2015 の5日目の記事です。

f:id:kironono:20151201001226p:plain

リモートからLEDを制御する

前回は、Electric ImpでLEDを点滅させるプログラムを作成しました。

ola.kironono.com

前回は、タイマーを使って一定時間ごとにLEDのONとOFFを切り替えて、LEDを点滅させましたが、今回はリモートからLEDのONとOFFを切り替えるプログラムにしてみます。

回路は前回と同じです。

f:id:kironono:20151203234528p:plain

バイスのコードを書く

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" から取得できます。

f:id:kironono:20151206154901p:plain

デプロイできたら、ウェブブラウザか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を制御してみます。