皆さんこん**は。
4年連続でSORACOM Advent Calendarに投稿させていただきます。
2021年の振り返り(IoT関連)
毎年Advent Calendarでは忙しくインプットする時間が無い、と言っている気がしますが、今年IoT関連では以下のアウトプットをさせていただきました。
また、SORACOM UG の運営では Explorer 2021の配信等を担当させていただき、ノウハウについてはSORACOM UGのブログに寄稿しております。
SORACOMボタンによる「作らない開発」について
私は所属企業にて若手エンジニアの育成にも関わっておりますが、エンタープライズのシステム開発を主に行っているSIerに所属している所以、どうしても若手エンジニアの方々においてはシステム開発を「重厚長大で難しく、大変なもの」と捉える 雰囲気があります。
ところが、クラウドを利用した開発においては重厚長大なものだけではありません。
いかにアイディアを最短で、及第点のモノをアジャイルに開発するのか、そういった視点も肝心だと思います。
若手の方々においては「小さくても良いので成功事例をたくさん積み上げ、自信を付けてもらいたい」と私は考えており、そのような指導を行っていますが、勝手ながら SORACOM UG Online #2 で登壇いただいたロコガイドさんの事例をよく引き合いとして紹介させていただいています。
この事例を若手メンバーに紹介すると「混雑度合いの測定はどのようにしているのですか?」と必ず質問を受けます。
通常であればAIカメラを設置して測定し分析、の流れとなるかと思いますが、設置費用が嵩み導入に二の足を踏む方も多いでしょう。そこでSORACOMボタンを配布し、受付の方に時々押してもらう、そうしたアイディアで解決しています。
技術的にはハイレベルなものではありませんが、いかにアイディアを最短で、及第点のモノをアジャイルに開発するのか、という視点では発想の転換をおこなった良い事例かと考えています。
ソラコムさんではそうした開発手法について、極力有り物を利用して「IoT開発は 作らないで利用する」といったプロモーションを行っているかと思います。
SORACOMボタンが最たる例なのではないかと個人的には思っており、今後とも推していきたいです。
テレワーク中の”家電話”問題
さて、前置きが長くなりました。
私はコロナ前から週1~2程度のテレワーク、コロナ禍の発生以降はほぼフルのテレワーク勤務を行っておりますが、私としてのテレワーク中のいちばんの難題は、勤務中に突然、家の電話が掛かってきてくることです。
お客様とのミーティングやプレゼン中、突然軽快に 森のくまさん(我が家の電話の着信音です・・・)が流れてきて何度焦ったことか・・・
そこで、クラウド技術とIoTボタンを用いて本問題を解決したいと思います
アーキテクチャ
今回はこのような構成で実現します。
どこかで見たような構成ですね。
実はこちらの記事で執筆した内容のリヴァイス版になります。
なお、我が家の電話はKDDIの「マンションプラス電話」を利用しているので、電話機の操作で電話の着信転送を行うことが可能のため、この部分の解説は省きます。
API操作でできると、自動化できて本当は良いんですけどね。
設定方法
設定方法を順を追って説明します。
Amazon Connectの初期設定
インスタンス作成
AWS マネジメントコンソールを開き、Amazon Connectのコンソールを開きます。
なお、東京リージョンであることを確認して下さい(日本の電話番号は東京リージョンに作成したインスタンスでしか利用できないため)
初回アクセス時には以下のような画面が出ますので「今すぐ始める」をクリックします。
まず「Amazon Connect内にユーザを保存」を指定し、Amazon ConnectのインスタンスURLを入力します。 このURLは次章以降で開くコンソールのログインURLとなりますので、任意の名前を指定します。 入力が終わったら「次のステップ」をクリックします。
管理者の名前を決めて入力します。 自身の名前とユーザ名・パスワード・電子メールアドレスを入力し、「次のステップ」をクリックします。 パスワードは大文字・小文字・数字を含み8文字以上とする必要があります。
本インスタンスで電話の発信・着信処理を行うかどうかの選択を行います。
両方にチェックを入れ「次のステップ」をクリックします。
電話番号の取得
続けて電話番号の取得を行います。
前項で作成した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の設定を行います。
ボタンの登録は「会議脱出ボタン」の記事を参照ください。
IoT 1-Clickプロジェクトの作成にて以下の手順で実施します。
まずプロジェクト名を設定
続けてボタンや実行するLambda関数との紐付けを行います。
なお関数①ではAWS IoT 1-Clickのプレイスメント設定より紐づく状態を設定できるようにしているため、プレイスメントの設定を以下のようにします。
- シングルクリック(status_single):受話可能
- ダブルクリック(status_double):会議中
- ロングクリック(status_long):多忙
最後にIoT 1-Clickにてプレイスメントの作成を行います。
問い合わせフローの作成
続けて Amazon Connectの問い合わせフローを作成します。
ここで電話着信時の処理を制御します。
Amazon Connectのコンソールを開き、左側のメニューから「ルーティング」⇒「問い合わせフロー」を選択します。
問い合わせフローの一覧画面が表示されます。 「コンタクトフローの作成」をクリックします。
提供されている部品を組み合わせて、以下のようなフローを作成します。
- 初期設定
- Lambda関数①を呼び出してステータスを取得
- コンタクト属性を設定(Lambdaからの戻り値を格納)
- コンタクト属性を確認(ステータスにより分岐)
- 受話可能であればキューに転送
作成したフローを電話番号に紐付けて完了です。
主要部分を以下解説します。
コンタクトフローからのLambda関数の呼び出し
上記で作業でAmazon ConnectインスタンスとLambda関数の紐付けは完了しているため、その関数を指定するのみです。
コンタクト属性の設定
Lambdaからの戻り値をAmazon Connect内部の変数に格納する処理です。
コンタクト属性を確認する
Amazon Connect内部の変数を用いて分岐処理を行うことができます。
ここでステータスが「受話可能」であればキューに転送し、オペレーターで受話可能な状態となります。
動作確認/まとめ
ここまでの設定でAmazon Connectで受電できるようになりました。
Amazon Connectコンソールの右上にある電話機マークでソフトフォンを起動することができます。
状態をAvailableにすることで受話可能になり、SORACOMボタンで入力したステータスが「受話可能」(シングルクリック)であれば受電します。
「留守番電話」の件、また他にも幾つか改善項目があるため、引き続き改善して行ければと思います。
また、2022年もこのようなプチライフハックを続けて行ければと思います。
今後ともよろしくお願いします。
コメント