Nature Remo+AWS+LINE Notifyで緩やかな自宅監視(2)
ここまでの流れ
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モジュールを使えるようにする。
import { DynamoDBClient, PutItemCommand, QueryCommand } from "@aws-sdk/client-dynamodb";
NatureRemo_Recordsテーブルからtimestampが過去(30秒以上前)である最初の1件を取得する。前回照度と今回照度を比較して30以上だったらLINE通知する。
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するだけ。これも極めて簡単である。
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