AWS Lambda: 1関数で1台のobnizを管理する

1時間に1度など、定期実行を行う場合にはサーバーレスを使うと便利なことがあります。

obnizとサーバーレスを組み合わせる場合にはいくつか注意点が必要です。

起動がかぶらないようにする

サーバーレスの特徴として多重起動が非常に簡単 というものがあります。obnizも複数のプログラムから1つのobnizを制御する ということは可能ですが、数に制限があったり(1つのobnizにつき同時に5プログラムまで)、プログラムの書き方に考慮が必要だったりしますので、深く理解するまではそのような使い方をしないことをおすすめします。つまり、lambdaのプロセスが複数同時に起動しないように制御する必要があります。

lambdaの設定で同時実行数がありますので、こちらを1にします。そうすると、2個めを起動しようとした場合はエラーとなり、起動しなくなります。

制限時間を考慮する

lambdaの関数が起動したあとにobnizへの接続、認証が行われるため、その分時間がかかります。obnizとの接続に1秒程度かかることがありますので、その後のデータ取得等の時間を考えると5秒程度は時間を確保することをおすすめします。

接続できない場合を考慮する

obnizは常にオンラインになっているわけではなく、電波状況によってはオフラインになっていることもあります。オフラインの可能性を考慮してプログラムを作る必要があります。

具体的な実装

たとえば、AWS lambdaを使い、温度センサのデータを取得する場合を考えます。

lambdaからデバイス間は自動的に接続されるので、APIゲートウェイなどを置く必要はありません。別途、URLでアクセスしたいなど、必要な場合においてください。

const Obniz = require("obniz");

exports.handler = async (event) => {

    // 手動で接続するのでauto_connectを無効にする
    const obniz = new Obniz("obniz_id_hiere", {auto_connect: false, access_token: targetObniz.accessToken});

    // obnizに接続する。 3秒以内につながらないときはタイム・アウトする
    const connected =  await obniz.connectWait({ timeout: 3 });
    if (!connected) {
        // obnizがofflineのときの処理
        const response = {
            statusCode: 404,
            body: JSON.stringify({error: "obniz is not online"}),
        };
        return response;
    }

    //初期化
    const tempSensor = obniz.wired("LM35DZ", { gnd:0 , output:1, vcc:2});
    const temp = await tempSensor.getWait();

    //終了時にobnizと切断する(これをしないと接続セッションが残ったままになる)
    obniz.close();

    const response = {
        statusCode: 200,
        body: JSON.stringify({temp}),
    };

    return response;
};