概要
自宅玄関扉にスマートロックであるSesami4を導入中。 自宅のSesamiのステータスを送ってくれるLINE BOTを作る。 (IFFFTでもできそうだけど拡張性等も加味して今回は自力で)
背景・課題
- Sesamiのステータスを監視し、自宅からの締め出しを防止したい
- 電池残量確認のためわざわざSesamiアプリを見たくない
使用した言語・サービス
- Javascript
- Sesami Web API
- LINE Messaging API ※ LINE Notify APIは2025年3月31日サービス終了となったためNG
- Cloudflare Workers
開発フロー
Sesami Web APIのテスト
SESAME Bizに登録し、APIキーとUUIDを取得
curlしてみる
curl -H "x-api-key: {your APIキー}" https://app.candyhouse.co/api/sesame2/{your UUID}
Responseがあることを確認する
LINE Messaging API使用準備・APIテストまで
Providerを作成
Provider=開発者やサービス提供者の単位 個人開発の場合、 {YourName}開発 などでOK
Create a new channel
channel = LINE BOTとして動かすアカウントそのもの
channel typeはMessaging APIを選択
選択すると公式アカウントの作成にページに飛ぶので作成を進める
Messaging APIの使用には、公式アカウントの作成が必須です
※ 公式アカウントとはいっても外部非公開にできますので、プライベートな使い方ができます
公式アカウントの作成後、Messaging API の使用を有効にする
※ Providerの選択が求められるので、先ほど作成したものを選択
該当のアカウントをQRコードから友達登録
LINE Developersに戻り、上記のchannelとしてMessaging APIが表示されているので、Messaging APIタブに表示されているQRコードを読み取り友達登録をしておく
Channel access tokenを発行
Messaging APIタブ最下部からtokenを発行できる 発行し控えておく
curlしてテストメッセージを送ってみる
curl -X POST https://api.line.me/v2/bot/message/push \ -H "Content-Type: application/json" \ -H "Authorization: Bearer {Your アクセストークン}" \ -d '{ "to": "{Your ユーザーID}", "messages":[ { "type":"text", "text":"テストメッセージです!" } ] }'
※ユーザーIDは、LINE Developersの該当のChannelのBasic settingsタブ内 下部に記載あります
該当のLINEアカウントでメッセージが確認できればOK
Cloudflare workers実装
いよいよ実装に入ります
ターミナルにて、wranglerのインストール・Cloudflareログイン等を行う
プロジェクト作成
wrangler init {アプリ名}
TEMPLATEや言語が選択できるので、今回は下記を選択
├ What would you like to start with? │ category Application Starter │ ├ Which template would you like to use? │ type Scheduled Worker (Cron Trigger) │ ├ Which language do you want to use? │ lang JavaScript
Typescriptも選択可能です
環境変数を追加
各種APIキー等は環境変数で管理しましょう
開発用:プロジェクトルート直下の.dev.varsファイル
# .dev.vars LINE_ACCESS_TOKEN=hogehoge
本番用:
wrangler secret put
コマンド# 例 wrangler secret put LINE_ACCESS_TOKEN *# プロンプトが表示されるので、値を入力*
で環境変数を管理できます
今回は下記の5つを環境変数化します
LINE_ACCESS_TOKEN
LINE_USER_ID
SESAME_API_KEY
SESAME_DEVICES
- 機器名
- UUID
$ wrangler secret put SESAME_DEVICES *? Enter a secret value: › { "sesami-1": { "uuid": "{sesami-1のUUID}", "name": "sesami-1" }, "sesami-2": { "uuid": "{sesami-2のUUID}", "name": "sesami-2" } }*
{今回のアプリ名}_ACCESS_TOKEN
今回の通知アプリのアクセストークンとして扱う
私は例としてSESAMI_LINE_NOTIFY_ACCESS_TOKENで命名
予測されにくいランダムな文字列で大丈夫です
通知アプリを実装
サンプルとして下記で公開
デプロイ
wrangler deploy
確認
wrangler.tomlで設定したスケジュールに合わせて配信されていることを確認
今後修正・追加したい機能
- SlackやDiscordへの通知
- 特定の期間開錠された状態だったらアラート通知
- LINEのチャット機能からSesamiのステータスを取得できるように
- バッテリー残量が少なくなった場合に分かりやすく警告が出るようにする
- LINEのチャット機能で施錠・解錠をできるようにする(セキュリティは頑張る)