電話一本でスマートロックをあけてみる

  • 2021-08-17
  • 2021-08-17
  • IoT
  • 869回
  • 0件
IoT

GMOグローバルサイン・ホールディングス・企画開発部・AIシステムグループの岸本です。
今回は電話をかけてスマートロックがついた我が家の扉を開けてみようという試みになります。

はじめに

みなさんはスマートロックは使っていますか?私は使い始めてかれこれ2年ぐらいになると思います。そんな私でも一つだけ悩まされ続けている問題があります。それが インキー問題 です。

ホテルなどで鍵を部屋に置いたまま外に出てしまい、オートロックにより自動で部屋の鍵がかかり、締め出しを食らうことあります。これをインキーと呼んでおり、オートロックを有効にしたスマートロックでも例外なく同じことが起きてしまうのです。

実際に私は何回もインキーをしてしまい路頭に迷う経験をしました。なので今回は 先日インキーした際に思いついた「電話で鍵をあける」というアイデアを実装してみたので記事にしてみました。

インキーという状況

私が使用しているスマートロックはCANDY HOUSEのsesami miniになります。このスマートロックはスマートフォンのアプリから鍵の開錠・施錠を行うことができるとても便利な機能を持っています。にもかかわらずインキーするということは以下の状況が考えられます。

スマートフォンを持たずに外出している

当たり前ですね。とはいえ、ふらっとコンビニや散歩に出た時にやりがちです。
この状況で電話を使用したい時は 公衆電話を利用する 他人から電話を借りる しか私は思いつきませんでした。後者はかなり難易度が高いので前者の公衆電話を利用して鍵を開けることを目指していきたいと思います。

電話で鍵をあける仕組み

使用するもの

今回、私が使用したサービスは以下になります。

  • Sesame v2 ( +REST API )
  • Amazon connect
  • AWS Lambda
  • Node-RED *
  • Beebotte *

太字のものは電話で鍵を開ける際に必須です。* が付いたものは必須でないものの、私が実装するにあたって使用したものになります。各サービスの役割は下記の構成図を見ながら細かく説明していきます。

diagram

1. 電話を受け取る

かかってきた電話を受け取ってくれる部分が Amazon Connect になります。電話を受け取った際に暗証番号を促す音声を再生し、入力された暗証番号が正しかった場合に Lambda を通して beebotte にデータを送信するようにフローを作成します。

Lambda に直接スマートロックを開ける処理を記述すれば、beebotte や Node-RED といったミドルウェアは必要なくなりますが、スマートロックを開ける際の認証情報をLambdaに直接記述するのは少々不安です。

また、Amazon Conndect で鍵を開ける際に致命的なのが Lambda の実行時間の制限です。近場に公衆電話がある場合は良いですが、最悪のケースを考えると数十分後や開錠のスケジューリングを行いたいです。なので、鍵を開ける処理は自宅のサーバーで行うようにしました。

2. beebotteでデータをやりとりする

beebotte はMQTTのクラウドサービスになります。このサービスを使うことで簡単に AWS と 自宅サーバー の橋渡しを実現できます。

私の場合、自宅にNode-REDが家電の操作から様々な仕事をしてもらうために常時稼働しているので、beebotteのMQTTブローカーと Node-RED を接続して Amazon Connect のイベントを自宅のサーバーで受信できるようにしました。

Node-REDについて説明は割愛させていただきますが、簡単に紹介させていただきますとデータフロープログラミング型の開発環境でHTTPやMQTTなどの通信手段を簡単に使用できるすごいやつになります。

3. 鍵を開ける

私が使用する Sesame には Sesame RESTful API というものが公開されており、このAPIを使用することで自宅の鍵をどこからでも開けることが可能となっています。使用するにはトークンを取得する必要があるのでこちら を参照してください。(新しく発売されている sesame 3 のトークン取得方法は異なるようです)

Amazon Connectの発火されたイベントをもとに、HTTP で鍵を開ける処理をNode-REDで構築します。また、HTTPリクエストを投げる際に数分待ってから実行することで時間経過ののちに開錠する機能を実現できます。

各種サービスの設定

上記で紹介した各種サービスの設定について説明していきます。Amazon Connect で Lambda を使用したフローを作成する都合上

  1. beebotte
  2. AWS Lambda
  3. Amazon Connect
  4. Node-RED

の順に説明していきます。

beebotte の設定

beebotte のアカウントを持っていない場合は作成しましょう。無料プランだと下記のような条件でした。(2021/8/15 執筆時点)

  • Unlimited Channels
  • 50,000 Messages/day
  • 5,000 Persistent Messages/day
  • 3 Months History
  • SSL Encryption

認証情報の取得

beebotteのダッシュボードから「Account Settings」→「Access Management」で API KeySecret Key を取得することができます。

後ほど必要なのでコピーしておいてください。

チャンネルの作成

スマートロックの開錠・施錠のデータを受け取るチャンネルを作成します。beebotte上で下記のように作成しました。

beebotte_001

また、beebotteのダッシュボードから「Channels」→「sesame」(作成したチャンネル名)をクリックして Channel Token を取得することができます。こちらも後ほど必要なのでコピーしておきます。

チャンネルのテスト

beebotte では Web上でデータの送受信を確認することができます。ダッシュボードから「Console」をクリックして簡単なテストを行ってみます。

Secrete Key を入力して SubscribePublishに先ほど作成したチャンネルの名前とリソース名を入力して「Subscribe」ボタンを押すとチャンネルの受信が始まります。次に Publish の Data に “open” を入力して 「Publish」ボタンを押すと右側の Messages に配信されたデータの情報が表示されます。表示されたデータが正しければ beebotte の設定は終了です。

beebotte_002

AWS Lambda の設定

AWS Lambda で beebotte にメッセージを配信する関数をPythonで作成します。AWSのコンソールからLambdaを選択しましょう。

関数の作成と必要なモジュールのインポート

Lambdaの管理画面から「関数の作成」をクリックして関数を下記の設定で作成します。今回は”amazonConnectToBeebotte”という名前で作成します。

lambda_001

今回は beebotte にメッセージを配信するためにPython用のSDKを使用します。そのため、Lambdaにモジュールを配置する必要があるのでzipでまとめて Lambda にアップロードします。

zipファイルの作成

zipファイルを作成する際に ローカル環境の Python のバージョンが Lambda で指定したバージョンと異なるとLambdaを実行する際にインポートエラーを起こすことがあるので注意してください。

python -V
# Python 3.7.11

mkdir lambda_beebotte
pip install beebotte -t ./lambda_beebotte
touch ./lambda_beebotte/lambda_function.py
zip -r ./beebottePackage.zip ./lambda_beebotte/*

Lambda のコード編集画面から「アップロード元」→「.zipファイル」をクリックして作成されたzipファイルをアップロードします。

lambda_002

アップロードが完了したらディレクトリ構造を以下のようにしてください。

lambda_003

lambda_function.py には Amazon Connect から渡されたデータを beebotte に配信するスクリプトを記述します。

import json
from beebotte import *

API_KEY = "YOUR API KEY"
SECRET_KEY = "YOUR SECRET KEY"

CHANNEL = "sesame"
RESOURCE = "action"

def connect_beebotte():
    return BBT(API_KEY, SECRET_KEY)

def lambda_handler(event, context):
    bclient = connect_beebotte()

    # Amazon Connect から渡されたデータを取得
    data = event["Details"]["Parameters"]["data"]

    bclient.write(CHANNEL, RESOURCE, data)

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

モジュールの用意と lambda_function.py への記述が完了したら「Deploy」ボタンをクリックしましょう。”Changes deployed” と表示されていれば問題ありません。

関数のテスト

Lambdaのテスト機能を使用して、Amazon Connect から データが渡された状況を再現して実際に beebotte のコンソールでデータが渡されたかを確認してみしょう。

「Test」ボタンの隣の「▼」を押して「Configure test event」をクリックします。するとテストイベント作成画面が表示されるので以下のJSONを渡すテストを作成します。

{
    "Details":{
        "Parameters":{
            "data":"lambda-test"
        }
    }
}

作成できたら「Test」ボタンを押して、作成したテストケースを実行します。実行後に beebotte のコンソールに戻って Read API から「Read Data」ボタンをクリックして”lambda-test”という内容のメッセージが出力されれば Lambda と Beebotte の繋ぎこみが完了です。

lambda_004

Amazon Connect の設定

インスタンスの生成

AWSのマネージメントコンソールにサインインし、Amazon Connect を選択し 「今すぐ始める」をクリックすると、Amazon Connect のインスタンス生成画面になります。

amazon_connect_001

「Amazon Connect内にユーザーを保存」を選択し「アクセスURL」は好きなものを設定して問題ありません。次のステップの管理者は現在のアカウントを使用したいので「スキップ」を選択しましょう。

次のステップの「テレフォニーオプション」は今回電話を受け取ってもらえればよいので、着信の項目のみチェックしました。

amazon_connect_002

次のステップの「データストレージ」もログなどの保存先を指定したいわけではないので、そのまま「次のステップ」をクリックします。すると、下記のような確認画面になるので「インスタンスの作成」をクリックしましょう。

amazon_connect_003

インスタンスの作成中は「Amazon Connect のセットアップ」というポップアップが表示されます。作成が終わると「今すぐ始める」というボタンが表示されるのでクリックして”ようこそ”と表示されたらインスタンスの作成完了です。必要な場合は適宜言語を日本語に変えてください。

amazon_connect_004

電話番号の取得

Amazon Connect の初期画面から「今すぐ始める」をクリックすることで電話番号を取得することができます。今回はすぐ取得できる米国の電話番号で進めます。

amazon_connect_005

「次へ」を押すと少し時間が経ってから取得した電話番号に電話をかけてテストする画面が表示されますが、今回はスキップするので「Skip for now」をクリックしましょう。

amazon_connect_006

Amazon Connect のダッシュボードに戻れば電話番号の取得完了です。

作成したLambda関数を許可する

AWS のマネージメントコンソールに戻り、Amazon Connect を選択してインスタンス一覧の画面に移動します。先ほど作成したインスタンスが存在するので、インスタンス名をクリックしてインスタンスの設定画面に移動します。

amazon_connect_007

インスタンスの設定画面から「問い合わせフロー」→「AWS Lambda」→「関数」を選択することで作成したLambda関数をAmazon Connect内で使用できるようになります。先ほど作成した”amazonConnectToBeebotte”を選択して「Add Lambda Function」をクリックしましょう。

amazon_connect_008

上記の図のように追加されていれば完了です。

問い合わせフローの作成

Amazon Connect では用意されたノードを繋いでいくだけで簡単にIVR(Interactive Voice Response)を実現することができます。

試しにとても単純な問い合わせフローを作成する例を書きましたが、読み飛ばしても問題ないので折りたたんでいます。フローの作成方法が1から気になる方はクリックして覗いてみてください。

挨拶して電話を切るフローの作成

挨拶して電話を切るフローの作成

かかってきた電話を受け取って日本語で「こんにちは、せかい」と応答しして電話を切るだけのフローを作成してみます。Amazon Connect のダッシュボードから「ルーティング」→「問い合わせフロー」→「コンタクトフローの作成」とクリックして1からフローを作成します。

フローの編集画面が表示されてから、以下の4つのノードを作成して上から順番に繋げてみます。

  • エントリポイント (最初から存在しています)
  • 音声の設定 (設定)
  • プロンプトの再生 (操作)
  • 切断(終了/転送)

amazon_connect_flow_001

これだけでフローとして完結していますが、日本語で応答するには “音声の設定ノード” をクリックして日本語に設定する必要があります。

amazon_connect_flow_002

また、指定したプロンプト(音声)を再生するには “プロンプトの再生ノード” をクリックして設定します。Amazon Connect では事前に .wav ファイルなどをアップロードして再生もできますが、今回はテキストから自動で生成された音声を再生してもらいます。

amazon_connect_flow_003

最終的に作成されたフローは以下になります。”HelloWorld” という名前を付けて「公開」をクリックしましょう。
amazon_connect_flow_004

電話番号と問い合わせフローを紐づける

Amazon Connect のダッシュボードから「ルーティング」→「電話番号」をクリックしてから、先ほど取得した電話番号をクリックして、紐づいている問い合わせフローを変更します。

amazon_connect_009

先ほど作成した “HellowWorld” を選択して保存を押したら紐づけ完了です。実際に電話をかけてテストしてみてください。

暗証番号入力フローの作成

4桁の暗証番号を入力して合っていたらLambda関数を呼ぶフローを作成します。

4桁の入力を受け取る

今回は “顧客の入力を取得するノード” を4個繋げることで実現しました。入力した際に再生されるプロンプトには最初から用意されている Beep.wav を使用して 分岐を 0~9 まで作成したノードを繋げます。

amazon_connect_flow_006

分かりずらいですが、1234と順番に押さないと切断されてしまうフローになっていることが確認できると思います。

Lambda関数を実行する

左のリストから「統合」→「AWS Lambda 関数を呼び出す」を引っ張ってくることで、Lambdaノードを生成できます。設定は以下のようにしました。

amazon_connect_flow_007

関数入力パラメーターに {“data”:”open”} を指定することによって Lambda 側では以下のコードで”open”を取得できるようになります。

data = event["Details"]["Parameters"]["data"]
最終的に完成したフロー

amazon_connect_flow_005

なんだか複雑に見えますが、4桁の入力とLambdaの実行の両端にプロンプトの再生を挟んでいるだけになります。作成できた問い合わせフローは適当に名前をつけて、取得した電話番号と紐づけておきましょう。

また、執筆時が夏だったので応答の自動音声は某ミステリーホラー風にしてみました。

  • 電話受付時 : 「人を呪わば穴二つ、あなたの晴らせぬ恨み、晴らします」
  • Lambda関数の実行(成功): 「この恨み、地獄へ流します」

夜中にインキーして公衆電話越しでこれを聞くことになると思うとワクワクしちゃいますね。

Node-RED の設定

beebotte で作成したMQTTブローカーのチャンネルに接続して、家の鍵を開錠する処理を記述します。ここに関してはMQTTのメッセージを受け取ってREST APIを実行できれば何でも良いと思います。また、Node-RED自体のインストール方法については割愛するのでニュアンスだけでも図で伝わるよう心掛けます。

MQTTブローカーからメッセージを受信する

Node-REDでMQTTブローカーに接続するには mqtt-inノードを使用します。mqtt-inノードをダブルクリックして「新規に mqtt-broker を追加」をクリックして beebotte のURLとUserを入力します。

  • URL : mqtt.beebotte.com (ポート:1883)
  • USER : コピーしておいたChannel Token(token_から始まります)

無事に設定できると mqtt-inノードの下に “接続済” と表示されます

mqtt-in ノード でメッセージを確認する

mqtt-inノードに関数ノードを繋いでメッセージ内容を確認してみます。フローデータは折りたたんでいるので適宜コピーしてNode-REDにインポートしてみてください。

flow data


[{"id":"3d9b7c9c.b75944","type":"mqtt in","z":"5f4e0ca3.5c5b74","name":"","topic":"sesame/action","qos":"2","datatype":"json","broker":"d22e1135.a9eea","x":130,"y":140,"wires":[["3df0e8a4.e60d58"]]},{"id":"a6834c32.d6b4f","type":"function","z":"5f4e0ca3.5c5b74","name":"Beebott event name","func":"node.status({\n fill:\"green\",\n shape:\"dot\",\n text:${msg.date} - ${msg.payload.data}\n});\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":480,"y":140,"wires":[[]]},{"id":"3df0e8a4.e60d58","type":"moment","z":"5f4e0ca3.5c5b74","name":"Date","topic":"","input":"","inputType":"date","inTz":"Asia/Tokyo","adjAmount":0,"adjType":"days","adjDir":"add","format":" YYYY-MM-DD hh:mm:ss","locale":"ja-JP","output":"date","outputType":"msg","outTz":"Asia/Tokyo","x":290,"y":140,"wires":[["a6834c32.d6b4f"]]},{"id":"6e9f882f.540a58","type":"comment","z":"5f4e0ca3.5c5b74","name":"受信したメッセージのログ","info":"","x":490,"y":100,"wires":[]},{"id":"d22e1135.a9eea","type":"mqtt-broker","z":"","name":"sesame channel","broker":"mqtt.beebotte.com","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]

フローを作成したら、作成したLambda関数のテストケースを再度実行してください。再度Node-REDに戻ってみると下記の図のように受信した内容を確認することができます。

node-red_001

Sesame RESTul APIを実行する

私が使用している sesame mini の API仕様はこちらに記述されており、そちらに則りNode-REDでhttp-requestノードを設定します。

まず [GET] /sesames でデバイスIDを取得します。簡単にNode-REDで組んでみるとこんな感じでしょうか。

flow data


[{"id":"1d11db84.e1aa64","type":"inject","z":"5f4e0ca3.5c5b74","name":"Get device list","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":290,"y":60,"wires":[["e7d2f519.857a68"]]},{"id":"e7d2f519.857a68","type":"template","z":"5f4e0ca3.5c5b74","name":"Set header","field":"headers","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{\n \"Authorization\":\"YOUR_TOKEN\"\n}","output":"json","x":470,"y":120,"wires":[["2eb60171.0289ce"]]},{"id":"2eb60171.0289ce","type":"change","z":"5f4e0ca3.5c5b74","name":"Set url","rules":[{"t":"set","p":"url","pt":"msg","to":"https://api.candyhouse.co/public/sesames","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":450,"y":160,"wires":[["ccf1d8c.4a4b928"]]},{"id":"ccf1d8c.4a4b928","type":"http request","z":"5f4e0ca3.5c5b74","name":"","method":"GET","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":650,"y":160,"wires":[["45fbb725.091d48"]]},{"id":"45fbb725.091d48","type":"debug","z":"5f4e0ca3.5c5b74","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":850,"y":160,"wires":[]},{"id":"30e6bacb.8c4006","type":"comment","z":"5f4e0ca3.5c5b74","name":"tokenをヘッダーに設定","info":"","x":260,"y":120,"wires":[]},{"id":"4e26af73.fee62","type":"comment","z":"5f4e0ca3.5c5b74","name":"REST API の URL 指定","info":"","x":260,"y":160,"wires":[]}]

node-red_003

「Get device list」をクリックするとNode-RED右側のメッセージ欄にデバイス一覧が表示されるので使用しているsesameのデバイスIDをコピーしておきます。

次に開錠するには [POST] /sesame/{device_id} {“command”:”unllock”} を投げれば良いとのことなので、以下のような形にしてみました。

node-red_004

flow data


[{"id":"cef7185.4661fe8","type":"http request","z":"5f4e0ca3.5c5b74","name":"","method":"POST","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":670,"y":500,"wires":[["338d67ab.f6fde8"]]},{"id":"8693b72e.d0f278","type":"comment","z":"5f4e0ca3.5c5b74","name":"開錠するJSONをBodyに設定","info":"","x":240,"y":380,"wires":[]},{"id":"e2f0bc3a.b4149","type":"template","z":"5f4e0ca3.5c5b74","name":"Set command","field":"payload","fieldType":"msg","format":"json","syntax":"mustache","template":"{\n \"command\":\"unlock\"\n}","output":"json","x":480,"y":380,"wires":[["f4421a24.da14d8"]]},{"id":"f4421a24.da14d8","type":"template","z":"5f4e0ca3.5c5b74","name":"Set header","field":"headers","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{\n \"Authorization\":\"YOUR_TOKEN\"\n}","output":"json","x":470,"y":420,"wires":[["ae34d7b6.e8ffb8"]]},{"id":"a38c196a.d9dc08","type":"change","z":"5f4e0ca3.5c5b74","name":"Set url","rules":[{"t":"set","p":"url","pt":"msg","to":"\"https://api.candyhouse.co/public/sesame/\" & deviceID","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":450,"y":500,"wires":[["cef7185.4661fe8"]]},{"id":"ac0447d0.88e9d8","type":"comment","z":"5f4e0ca3.5c5b74","name":"tokenをヘッダーに設定","info":"","x":260,"y":420,"wires":[]},{"id":"5e6db707.71fcd8","type":"comment","z":"5f4e0ca3.5c5b74","name":"REST API の URL 指定","info":"","x":260,"y":500,"wires":[]},{"id":"ef0ee7c5.fbe548","type":"inject","z":"5f4e0ca3.5c5b74","name":"Open Sesame !","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":280,"y":320,"wires":[["e2f0bc3a.b4149"]]},{"id":"3521f89f.e02538","type":"comment","z":"5f4e0ca3.5c5b74","name":"POST","info":"","x":650,"y":460,"wires":[]},{"id":"338d67ab.f6fde8","type":"function","z":"5f4e0ca3.5c5b74","name":"Show http status code","func":"if(msg.statusCode 200){\n node.status({\n fill:\"green\",\n shape:\"dot\",\n text:${msg.statusCode} is OK!\n });\n}\nelse{\n node.status({\n fill:\"red\",\n shape:\"dot\",\n text:${msg.statusCode} is error.\n }); \n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":880,"y":500,"wires":[[]]},{"id":"7d6dbbcb.5ec1b4","type":"comment","z":"5f4e0ca3.5c5b74","name":"ステータスコードの表示","info":"","x":890,"y":460,"wires":[]},{"id":"ae34d7b6.e8ffb8","type":"change","z":"5f4e0ca3.5c5b74","name":"Set device ID","rules":[{"t":"set","p":"deviceID","pt":"msg","to":"YOUR_DEVICE_ID","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":460,"wires":[["a38c196a.d9dc08"]]},{"id":"e2ef60e6.bf677","type":"comment","z":"5f4e0ca3.5c5b74","name":"device ID を設定","info":"","x":280,"y":460,"wires":[]}]

「Open Sesame !」をクリックすると家の鍵が空くことが確認できました。

各パーツの連結

残る作業はmqtt-inノードとスマートロックを開錠するノードたちを連結するだけになります。開錠するまで10分待つノードを忘れずに間に挟んでくださいね。さもないと、電話してからすぐにスマートロックが開錠してしまうので超神速で自宅に戻る羽目になってしまいます。最終的に出来上がったフローは以下になります。

node-red_005

役者は揃った

電話で1本で鍵を開けるだけなのに長い道のりですが、これで Amazon Connect → AWS Lambda → beebotte → Node-RED → スマートロック(sesame)という順番でイベントを繋ぐことができました。あとは電話をかけてみるのみです。

国際電話をかける場合は+を010に変えるか0ボタンを長押しして+を入力して、Amazon Connect に表示されている番号をそのまま入力することで電話をかけることができます。

実際に電話かけてみると…..

自動音声の読み上げのせいか雰囲気も十二分にあります。Node-REDを見てみると…..

node-red_006

しっかり、beebotteからのメッセージを受信してdelayノードで待っています!(24時ジャストじゃないのが悔しいですが。)

10分後…….しっかりと家の鍵が空くことを確認しました!

さいごに

Amazon Connect は簡単にコールセンターを構築できるサービスとなっており、電話をかけてLambdaを実行するのみで使用するには多機能すぎるので、もう少し簡単な実現方法があるかもしれません。とはいえ、Amazon Connect と AWS Lambda の繋ぎこみはとても簡単で、他にも個人レベルで何かに使えるのでは?と考えてしまうぐらいには面白かったです。

ただ、まだ難点が一つあります。それは法改正により Amazon Connect で日本の電話番号を取得するには書類をいくつか提出しなければいけません。やや面倒なのでこのままで良いか…と思ったのですが 国際電話に対応した公衆電話 は体感ですが少ないです。近場の公衆電話は全滅でした。なので、実際に使用するまでもう少し時間がかかりそうです。

また、電話をかけてから恨みを地獄に流してもらうまで、思いのほかスムーズに感じましたが、Lambda で使用しているbeebotte製の SDK は requests を使用しているようなので、python用のmqttモジュールを使用して Lambda → beebotte 間もMQTTで配信できればもう少し早くなるかもしれません。

ここまで記事にすると長かったのですが、実装自体はそんなに高度なことはせずに手を動かしてすんなりと出来上がってしまいました。これをきっかけにNode-REDやBeebotteを活用したおうちIoTに挑戦してみるのも面白いので、ぜひ実際に触っていただけると嬉しいです。

最後に….スマートフォンはちゃんと持ち歩きましょう。長々とありがとうございました。