テレワーク中の”家電話”問題をクラウドとIoTボタンで解決する

この記事は SORACOM Advent Calendar 2021 の12/22付記事となります

皆さんこん**は。
4年連続でSORACOM Advent Calendarに投稿させていただきます。

2021年の振り返り(IoT関連)

毎年Advent Calendarでは忙しくインプットする時間が無い、と言っている気がしますが、今年IoT関連では以下のアウトプットをさせていただきました。

CO2モニタリングでテレワーク環境の空気を可視化する
皆さんのテレワーク環境は仕事をするにあたり快適な環境を維持していますか? そこで業務環境を快適に保つため、二酸化炭素(CO2)の濃度を測定し一定値を超過した場合には通知するようにしたいと思います。
SORACOM Arcで自宅ネットワークをSORACOMプラットフォームに接続する
SORACOM Discovery 2021 ONLINEで発表された新サービスである、SORACOM Arcを触ってみました。 SORACOM Arcを用い工夫して自宅ネットワークとSORACOMプラットフォームとの接続を行いましたので、ご報告します。

また、SORACOM UG の運営では Explorer 2021の配信等を担当させていただき、ノウハウについてはSORACOM UGのブログに寄稿しております。

SORACOM UG Explorer 2021 配信ノウハウのまとめ
SORACOM UG Explorer 2021はYouTube Liveにて配信致しましたが、YouTube配信で活用した各種ノウハウをお伝えします。他のコミュニティイベントにおいても参考にしていただければ幸いです。

SORACOMボタンによる「作らない開発」について

私は所属企業にて若手エンジニアの育成にも関わっておりますが、エンタープライズのシステム開発を主に行っているSIerに所属している所以、どうしても若手エンジニアの方々においてはシステム開発を「重厚長大で難しく、大変なもの」と捉える 雰囲気があります。

ところが、クラウドを利用した開発においては重厚長大なものだけではありません。
いかにアイディアを最短で、及第点のモノをアジャイルに開発するのか、そういった視点も肝心だと思います。

若手の方々においては「小さくても良いので成功事例をたくさん積み上げ、自信を付けてもらいたい」と私は考えており、そのような指導を行っていますが、勝手ながら SORACOM UG Online #2 で登壇いただいたロコガイドさんの事例をよく引き合いとして紹介させていただいています。

この事例を若手メンバーに紹介すると「混雑度合いの測定はどのようにしているのですか?」と必ず質問を受けます。
通常であればAIカメラを設置して測定し分析、の流れとなるかと思いますが、設置費用が嵩み導入に二の足を踏む方も多いでしょう。そこでSORACOMボタンを配布し、受付の方に時々押してもらう、そうしたアイディアで解決しています。

技術的にはハイレベルなものではありませんが、いかにアイディアを最短で、及第点のモノをアジャイルに開発するのか、という視点では発想の転換をおこなった良い事例かと考えています。

ソラコムさんではそうした開発手法について、極力有り物を利用して「IoT開発は 作らないで利用する」といったプロモーションを行っているかと思います。
SORACOMボタンが最たる例なのではないかと個人的には思っており、今後とも推していきたいです。

テレワーク中の”家電話”問題

さて、前置きが長くなりました。

私はコロナ前から週1~2程度のテレワーク、コロナ禍の発生以降はほぼフルのテレワーク勤務を行っておりますが、私としてのテレワーク中のいちばんの難題は、勤務中に突然、家の電話が掛かってきてくることです。

お客様とのミーティングやプレゼン中、突然軽快に 森のくまさん(我が家の電話の着信音です・・・)が流れてきて何度焦ったことか・・・

そこで、クラウド技術とIoTボタンを用いて本問題を解決したいと思います

アーキテクチャ

今回はこのような構成で実現します。

どこかで見たような構成ですね。
実はこちらの記事で執筆した内容のリヴァイス版になります。

Amazon Connectで個人向け電話コンシェルジュを作る
Amazon Connectで個人用電話コンシェルジュを作成してみました。 自分のステータスを回答してくれるほか、用件を受け付けLINEで通知してくれたりしてます。 あのボタンの要素もあります。

なお、我が家の電話はKDDIの「マンションプラス電話」を利用しているので、電話機の操作で電話の着信転送を行うことが可能のため、この部分の解説は省きます。
API操作でできると、自動化できて本当は良いんですけどね。

設定方法

設定方法を順を追って説明します。

なお、記事初版の段階では「留守番電話」の部分を除いて実装します。
「留守番電話」部分は追って追記します。

Amazon Connectの初期設定

現在Amazon Connectで日本の電話番号を取得する際には、サポートへの申請が必要があります。
詳細はこちらをご覧下さい
急ぎの場合は米国の電話番号をご利用下さい。国際電話になってしまいますが・・・

インスタンス作成

AWS マネジメントコンソールを開き、Amazon Connectのコンソールを開きます。
なお、東京リージョンであることを確認して下さい(日本の電話番号は東京リージョンに作成したインスタンスでしか利用できないため)

初回アクセス時には以下のような画面が出ますので「今すぐ始める」をクリックします。 

まず「Amazon Connect内にユーザを保存」を指定し、Amazon ConnectのインスタンスURLを入力します。 このURLは次章以降で開くコンソールのログインURLとなりますので、任意の名前を指定します。 入力が終わったら「次のステップ」をクリックします。

管理者の名前を決めて入力します。 自身の名前とユーザ名・パスワード・電子メールアドレスを入力し、「次のステップ」をクリックします。 パスワードは大文字・小文字・数字を含み8文字以上とする必要があります。

本インスタンスで電話の発信・着信処理を行うかどうかの選択を行います。
両方にチェックを入れ「次のステップ」をクリックします。

本記事のしくみでは発信処理は行いませんので「着信通話」のみでも問題ありません。
データストレージを指定します。 問い合わせフローのログやデータの保存先はAWSアカウントに紐付くS3バケットとなります。 デフォルトで問題ありませんので、そのまま「次のステップ」をクリックします。
確認画面が表示されます。確認し「インスタンスの作成」を選択します。
インスタンスの作成には1~2分程度の時間が掛かります。
作成が完了したら「今すぐ始める」をクリックし、次項に進んでください。

電話番号の取得

続けて電話番号の取得を行います。
前項で作成したAmazon Connectインスタンスの開始画面に切り替わるので「今すぐ始める」をクリックします。

電話番号の取得を行います。 「国/地域」からJapan(+81)を選択、タイプとして「Direct Dial」を選択すると、電話番号の欄に電話番号の候補が表示されます。 お好みの電話番号を選択し「次へ」をクリックします。

電話番号が取得できました。
発信のテスト画面が表示されますが、ここではスキップして問題ありません。

Lambda関数の設置

準備① AWS IoT Coreの”モノ”作成

自身の状態を保存できるよう、AWS IoT Coreに”モノ”を作成します。
AWS マネジメントコンソールのAWS IoT Coreコンソールをから、「管理」→「モノ」を開きます。
続いて作成→単一のモノを作成するボタンをたどります。

作成画面にて名前を入力し登録を行います。

関数① ボタンからの入力受付関数 設置

デバイスシャドウの内容を取得するだけの内容です。Python 3.8で以下のような内容としました。
ロールにはAWSIoTDataAccessのポリシーが付与されている必要があります。

import json
import boto3
iot = boto3.client('iot-data')

thingName = 'human' 

def lambda_handler(event, context):
    # 入力値取得
    clickType = event['deviceEvent']['buttonClicked']['clickType']
    status_single = event['placementInfo']['attributes']['status_single']
    status_double = event['placementInfo']['attributes']['status_double']
    status_long = event['placementInfo']['attributes']['status_long']

    # ボタンの入力タイプを取得し、ステータスを設定
    if clickType == "SINGLE":
        thingDesired = status_single
    elif clickType == "DOUBLE":
        thingDesired = status_double
    else:
        thingDesired = status_long
    
    # Shadowの状態を取得
    shadowStream = iot.get_thing_shadow(thingName = thingName)
    shadowString = json.loads(shadowStream['payload'].read().decode('utf-8'))
    thingStatus = shadowString['state']['reported']['status']

    if thingDesired != thingStatus:
        # IoT シャドウを更新
        payload = {"state": {"reported": {"status": thingDesired }}}
        response = iot.update_thing_shadow(
            thingName = thingName,
            payload = json.dumps(payload)
        )
    return

関数② デバイスシャドウ読み込み関数 設置

デバイスシャドウの内容を取得するだけの内容です。以下のような内容としました。
こちらもロールにはAWSIoTDataAccessのポリシーが付与されている必要があります。

import json
import boto3
iot = boto3.client('iot-data')
thingName = 'human' 

def lambda_handler(event, context):
    # Shadowの状態を取得
    shadowStream = iot.get_thing_shadow(thingName = thingName)
    shadowString = json.loads(shadowStream['payload'].read().decode('utf-8'))
    thingStatus = shadowString['state']['reported']

    return thingStatus

Connect問い合わせフローからのアクセス許可

作成したLambda関数①・③は後述するAmazon Connectの問い合わせフローから呼び出すため、Amazon Connectからのアクセス許可を与える必要があります。

AWS マネジメントコンソールのAmazon Connectのコンソールを開き、「Contact flows」→「AWS Lambda」の箇所にて、作成したLambda関数を登録することでアクセス可能となります。

AWS IoT 1-Clickでボタンと紐づけ

ボタンを押すことで関数②が実行されるよう、AWS IoT 1-Clickの設定を行います。
ボタンの登録は「会議脱出ボタン」の記事を参照ください。

SORACOM Buttonで会議脱出ボタンをつくる
先日より発売にとなったSORACOM LTE-M ButtonとTwilioサービスを利用して電話を掛ける仕組みをつくりました。 会議脱出ボタンとして活用できます。

IoT 1-Clickプロジェクトの作成にて以下の手順で実施します。
まずプロジェクト名を設定

続けてボタンや実行するLambda関数との紐付けを行います。

なお関数①ではAWS IoT 1-Clickのプレイスメント設定より紐づく状態を設定できるようにしているため、プレイスメントの設定を以下のようにします。

  • シングルクリック(status_single):受話可能
  • ダブルクリック(status_double):会議中
  • ロングクリック(status_long):多忙

最後にIoT 1-Clickにてプレイスメントの作成を行います。

問い合わせフローの作成

続けて Amazon Connectの問い合わせフローを作成します。
ここで電話着信時の処理を制御します。

Amazon Connectのコンソールを開き、左側のメニューから「ルーティング」⇒「問い合わせフロー」を選択します。

問い合わせフローの一覧画面が表示されます。 「コンタクトフローの作成」をクリックします。

提供されている部品を組み合わせて、以下のようなフローを作成します。

  1. 初期設定
  2. Lambda関数①を呼び出してステータスを取得
  3. コンタクト属性を設定(Lambdaからの戻り値を格納)
  4. コンタクト属性を確認(ステータスにより分岐)
  5. 受話可能であればキューに転送

作成したフローを電話番号に紐付けて完了です。

主要部分を以下解説します。

コンタクトフローからのLambda関数の呼び出し

上記で作業でAmazon ConnectインスタンスとLambda関数の紐付けは完了しているため、その関数を指定するのみです。

コンタクト属性の設定

Lambdaからの戻り値をAmazon Connect内部の変数に格納する処理です。

コンタクト属性を確認する

Amazon Connect内部の変数を用いて分岐処理を行うことができます。
ここでステータスが「受話可能」であればキューに転送し、オペレーターで受話可能な状態となります。

動作確認/まとめ

ここまでの設定でAmazon Connectで受電できるようになりました。
Amazon Connectコンソールの右上にある電話機マークでソフトフォンを起動することができます。

状態をAvailableにすることで受話可能になり、SORACOMボタンで入力したステータスが「受話可能」(シングルクリック)であれば受電します。

「留守番電話」の件、また他にも幾つか改善項目があるため、引き続き改善して行ければと思います。

また、2022年もこのようなプチライフハックを続けて行ければと思います。
今後ともよろしくお願いします。

コメント