🏡

Nature Remo+AWS+LINE Notifyで緩やかな自宅監視(2)

2023/12/24に公開

ここまでの流れ

Nature Remo+AWS+LINE Notifyで緩やかな自宅監視(1)
Nature Remo が検知した自宅の照度を Nature Remo Cloud API を使ってLambda関数「NatureRemo_Save」により取得し、DynamoDB「NatureRemo_Records」テーブルに保存する機能を実装した。

今回の記事では AWS Lambda関数を定期的に実行し、照度に変化があった場合に LINE Notify APIでスマホに通知する部分を実装する。

LINE Notify API トークンを発行

LINE Notifyにログインし、マイページから「トークンを発行する」ボタンからパーソナルアクセストークンを発行する。

  • トークン名: NatureRemo
  • 通知を送信するトークルーム: 1:1でLINE Notifyから通知を受け取る

続いて、先ほど作成したトークンを環境変数として設定しておく。
「Lambda > 関数 > NatureRemo_Save > 環境変数の編集」にて下記の通り設定する。

  • キー: LINE_NOTIFY_TOKEN
  • 値: LINE Notify APIトークン

トリガーの追加

NatureRemo_Saveの「関数の概要」で「+トリガーを追加」をクリックする。
「ソースを選択...」から「EventBridge (CloudWatch Events)」を選択して下記のように設定して追加する。

  • Rule: Create a new rule
  • Rule name: RepeatPerMinute
  • Rule type: Schedule expression, rate(1 minute)

これで、1分毎にNatureRemo_Save関数が呼び出されて照度がNatureRemo_Recordsテーブルに蓄積されるようになった!

照度の変化があったらLINEで通知する

あとはもう一息。NatureRemo_Save関数内で、最新の照度をNatureRemo_Recordsへ追加するついでに、前回取得した照度をテーブルから取得して比較する。
照度に変化があった場合はLINE Notify APIで通知する。ただし、部屋に入る日光による照度の変化は無視したいので、ここはチューニングが必要な部分であるが、おおむね30くらいの照度の変化は無視して問題なさそう。

以下のコードは前回の記事からの変更箇所のみ。まずはDynamoDBへクエリを発行して項目を取得するためのQueryCommandモジュールを使えるようにする。

index.mjs
import { DynamoDBClient, PutItemCommand, QueryCommand } from "@aws-sdk/client-dynamodb";

NatureRemo_Recordsテーブルからtimestampが過去(30秒以上前)である最初の1件を取得する。前回照度と今回照度を比較して30以上だったらLINE通知する。

index.mjs
    response.on("end", async () => {
      // *** ここから追加 ***
      // テーブルから前回追加した項目を取得
      const queryCmd = new QueryCommand({
        TableName: "NatureRemo_Records",
        KeyConditionExpression: "#dv = :dv AND #ts < :ts",
        ExpressionAttributeNames: {
          "#dv": "device",
          "#ts": "timestamp"
        },
        ExpressionAttributeValues: {
          ":dv": { S: "Remo" },
          ":ts": { N: (Math.floor(Date.now() / 1000) - 30).toString() },
        },
        ScanIndexForward: false,
        Limit: 1
      });
      const ret = await db.send(queryCmd);
      if (ret.Count < 1)
        return;
      // 前回照度と今回照度を比較
      const _il = parseInt(ret.Items[0].il.N, 10);
      const  il = data[0].newest_events.il.val;
      if (Math.abs(_il - il) < 30)
        return;
      lineNotify("\n照度変化しました\n" + _il + " → " + il);
    });

最後に、LINE通知のためのLineNotifyというfunctionを実装する。
LINE Noify API Documentの「通知系」のところを見て、所定URLにOAuth認証付けて「message=XXX」をPOSTするだけ。これも極めて簡単である。

index.mjs
function lineNotify(aMsg) {
  const url = "https://notify-api.line.me/api/notify";
  const options = {
    method: "POST",
      headers: {
      "Content-type": "application/x-www-form-urlencoded",
      "Authorization": "Bearer " + process.env.LINE_NOTIFY_TOKEN
    }
  };
  const req = https.request(url, options);
  req.write("message=" + aMsg);
  req.end();
}

動作確認

Lambda関数の単体実行で問題なければ、さあ実機でテストしよう。Nature Remoに物を被せて意図的に照度を下げたり、実際に電気を消してみて、1分以内にLINEに通知が来たら大成功!!

ひとまず当初やりたかった緩やかな自宅監視はこれで完成したが、次回に引き続き、照度の変化をグラフでモニタリングできるようにする予定。

つづきの記事はこちら
Nature Remo+AWS+LINE Notifyで緩やかな自宅監視(3)

Discussion