SORACOM LTE-M Button と AWS IoT Core の ThingShadow で「呼び出しシステム」
SORACOM LTE-M Button と AWS IoT Core の ThingShadow で「呼び出しシステム」:
それは展示会場で担当者が不在だった時ですよね。呼び出したいけどどうすれば?という問題を「あのボタン」で解決しようとした試みです。
JAWS FESTA 2018 OSAKA でお披露目しました。
こんな感じのSPA (Single Page Application) です。
あのボタン「SORACOM LTE-M Button」を押すと、担当者に Slack のメンションが飛びます。
また、担当者が「OK ...」と Slack 上でメッセージ送信すると「現場急行中!」となる仕組みです。
名前のとなりに状況が表示されてますね。
考え方ですが、担当者を "モノ" として扱い、そのステータス (= Shadow) を MQTT over Websocket でブラウザに表示するという仕組みです。
各担当者は、このように「モノ」扱いです。もちろんソラコムはそういう会社じゃないですよ!便宜上、やむを得ず、しかたなく、断腸の思いでこのような実装になってるだけです!
aws-iot-core-things.png
Shadow はこの通りです。
大きく2系統あります。
Slack の Incoming Webhook を利用しています。
メンションを飛ばす方法は SlackのIncoming Webhooksでメンションを飛ばす方法 に助けていただきました。
同時に Shadow を「呼び出し中...」に update します。これは Websocket を通じてブラウザにリアルタイムでpushされます。
Slack の Outgoing Webhook を利用しています。
トリガーキーワードに "ok" を指定し、担当者は
受けは API Gateway です。Slack からは
その後 Shadow を「現場急行中!」に update します。先ほど同様、ブラウザにリアルタイム push されます。
Shadow が「現場急行中!」や「呼び出し中...」のままだと格好悪いので、一定期間で「呼び出しOK!」に戻してあげたかったので、Lambda 関数を作っています。
各 Lambda 関数から呼び出される形のコードです。
しかも
WIP
さっきまで作ってた。
そのうちコードは公開します。
EoT
展示会で困る事
それは展示会場で担当者が不在だった時ですよね。呼び出したいけどどうすれば?という問題を「あのボタン」で解決しようとした試みです。
こんな感じ
JAWS FESTA 2018 OSAKA でお披露目しました。こんな感じのSPA (Single Page Application) です。
あのボタン「SORACOM LTE-M Button」を押すと、担当者に Slack のメンションが飛びます。
また、担当者が「OK ...」と Slack 上でメッセージ送信すると「現場急行中!」となる仕組みです。
名前のとなりに状況が表示されてますね。
実装
考え方ですが、担当者を "モノ" として扱い、そのステータス (= Shadow) を MQTT over Websocket でブラウザに表示するという仕組みです。各担当者は、このように「モノ」扱いです。もちろんソラコムはそういう会社じゃないですよ!便宜上、やむを得ず、しかたなく、断腸の思いでこのような実装になってるだけです!
aws-iot-core-things.png
Shadow はこの通りです。
アーキテクチャ
大きく2系統あります。
1系統目: SORACOM LTE-M Button から Slack へ!
Slack の Incoming Webhook を利用しています。メンションを飛ばす方法は SlackのIncoming Webhooksでメンションを飛ばす方法 に助けていただきました。
同時に Shadow を「呼び出し中...」に update します。これは Websocket を通じてブラウザにリアルタイムでpushされます。
2系統目: Slack から AWS IoT Core の Shadow を更新
Slack の Outgoing Webhook を利用しています。トリガーキーワードに "ok" を指定し、担当者は
ok ...
と入れてもらうようにしました。受けは API Gateway です。Slack からは
Content-Type:application/x-www-form-urlencoded
で送信されるので、本来は API Gateway 上で JSON 化したかったのですが、私には難しかったので Lambda proxy としてそのまま Lambda 関数に引き渡し、その関数内(Python3.6)上で urllib.parse.parse_qs(event['body'])
としてパースする軟弱実装です。その後 Shadow を「現場急行中!」に update します。先ほど同様、ブラウザにリアルタイム push されます。
共通してやってること
Shadow が「現場急行中!」や「呼び出し中...」のままだと格好悪いので、一定期間で「呼び出しOK!」に戻してあげたかったので、Lambda 関数を作っています。各 Lambda 関数から呼び出される形のコードです。
しかも
time.sleep(sec)
をつかうという実装。。。これでいいのかな。
TIPS
Lambda 関数から Lambda 関数を呼ぶ
boto3.client("lambda").invoke
WIP
あとがき
さっきまで作ってた。そのうちコードは公開します。
EoT
コメント
コメントを投稿