※この記事は chillSAP 夏の自由研究2020 の記事として執筆しています
夏だ、プールだ、アウトプットだ!
今回は、無理矢理繋げるシリーズ第4弾となります。
※過去の繋げるシリーズについてはこちら。よかったら覗いてください。
目次
- 目次
- はじめに
- 作ってみた
- 使ってみた
- おわりに
はじめに
最近の悩み
新型コロナウイルスの影響で子供の学校が休校となっていました。
学校の再開後、授業の遅れを取り戻すために変則的な時間割が組まれました。そして、学童保育を利用する日、塾がある日、何もない日との組み合わせで、帰宅時間が毎日バラバラになっていました。
子供と一緒に時間を間違えないように注意はしていたのですが、、、先日、子供が待ち合わせ場所を間違えて見当たらず、慌てて周囲を探し回るということがありました(すぐ見つかりましたが)。
そこで、簡単に子供の居場所を確認できるようにしたいなと思い、見守りシステムを作ってみました。
やりたいこと
・子供が移動したら、現在地を通知してくれる(毎日のことなので自動がいい)
・「いまどこ?」と聞くと、現在地を回答してくれる
作成にあたっての本音
「chillSAP 夏の自由研究」ってテーマだし、何かハードウェアをさわりたいな。以前から気になってるSORACOMのアレをつかって、SAPと無理矢理つなげて、それっぽくしてみるか(アレを買う口実が欲しかっただけ説)。
ということで今回も、触りたかったものと勉強しているものを無理矢理繋げます。
ビジネスっぽいこじつけ
IoTのセンサー情報と、SAPのビジネスデータを組み合わせて何かを始めてみる際にオススメ、かも
作ってみた
SORACOM、AWS Lambda、Pythonに触るのも前回の繋げるシリーズ以来です。
みなさんご存知のとおり私の知識不足のため、認証/セキュリティ/エラーハンドリングなどは弱弱です。
また、「別にSAP CP使わなくても〜」は禁句です。
できたもの
作成したのは、以下の2機能。
(1) 子供が移動したら現在地をLINEに通知する
現在地が「学校」or「通学路」or「自宅」なのかを自動で通知。詳細はGoogleマップで確認可能。
(2) SAP Convasational AI で「いまどこ?」と聞くと現在地を回答する
※テスト実行のみ
システム構成
今回の構成はこちら
詳細についてはここから説明します。
【処理1】ランドセルに入れたGPSマルチユニットより緯度/経度を定期送信
今回は、GPSマルチユニットSORACOM Editionを使います。
以下、公式サイトより引用
「位置情報(GPS)」「温度」「湿度」「加速度」の4つのセンサーと充電式バッテリーを内蔵し、 セルラーLPWAであるLTE-M通信がご利用可能なデバイスです。
これ、すんごいんですよ。以下も引用(抜粋)
-
GPS、温度、湿度、加速度を計測する4つのセンサーが内蔵
-
ソラコムのコンソールからシンプル操作で「センサー値」「取得タイミング」を設定可能
-
センサーデータはセルラー回線を利用しソラコムプラットフォームに送信
-
センサーデータは、SORACOM Harvest、SORACOM Lagoonを使用して可視可能。また、SORACOM Beam、SORACOM Funnel、SORACOM Funkを使用してクラウドサービスやサーバーにデータを連携可能
手軽にセンサーデータをソラコムのコンソールや、クラウドサービスに送信できちゃう優れものです。
GPSマルチユニットの初期設定などは、公式ドキュメントやQiitaが充実していますので、そちらを参照してください。
GPS マルチユニット SORACOM Edition : デバイスの使い方 | ユーザーガイド | SORACOM Users
(余談)SORACOM LTE-Mボタンが手元にあったので、こちらを利用して実現しようとしましたが、、、子供は、意図したタイミングでボタンを押してくれませんでしたw
※SORACOM LTE-M ボタンについてはこちら
※過去にボタンを使ったLTをやりました(無理矢理繋げるシリーズ第3弾)↓
【処理2】SORACOM Harvestで、現在地の確認が可能
現在地を把握するだけならば、SORACOM Harvestで十分です。
こんな感じで位置情報を見ることができます。
※以下、公式サイトより引用
SORACOM Harvestとは、IoT デバイスからのデータやファイルを収集・蓄積するサービスです。
今回は、現在地の通知を自動で行いたいため、SORACOM Funkを利用します。
【処理3】SORACOM Funkで、AWS Lambda実行
SORACOM Funkとは(以下、公式サイトより引用)
SORACOM Funkは、クラウドサービスの Function を直接実行できるサービスです。 クラウドリソースを活用することでデバイス側の実装をシンプルに保ち、デバイスリソースのオフロード、低電力消費化が可能となります。
SORACOM Funkを使用すると、GPSマルチユニットで取得したセンサーデータを、クラウドサービスのファンクションで利用できます。今回は、AWS Lambdaと連携します。
概要や設定方法については以下参照
SORACOM Funk を利用して AWS Lambda を呼び出し Slack へ通知する | Getting Started | SORACOM Users
【処理4】AWS Lambdaで、緯度/経度をSAPに登録(POST)
取得したGPSデータは、SAP Cloud PlatformのSAP HANA serviceを使用して保持しました。理由としては、お勉強中のSAP Cloud Application Programming Model (CAP)を使いたかったからです。
参考チュートリアル
手順は、SAP公式の以下のチュートリアルを参考に行いました。
※チュートリアルのミッション完了で、SAP CommunityバッヂもGET
あと参考にしたのは、CAPの公式サイト。シンプルで見やすいです。
ムフフ。Visual Studio Codeで、Node.jsで、、、ムフフ(仕事で使ったことない)。
検討の結果、以下の3つのテーブルと1つのビューを作成しました。
・Devices(デバイスのマスタ。名称を保持)
・Places(地名と緯度経度を紐付けるマスタ)
・Gpslogs(GPSマルチユニットから送信された緯度経度を登録する)
・Status(上記3つのテーブルを結合したビュー)
テーブル:Devices
GPSマルチユニットのデバイスごとの名称を管理。
事前にデータを登録しておきます。
テーブル:Places
GPSデータ(緯度、経度)をもとに、現在地の名称を管理。
こちらも事前にデータを登録しておきます。
場所ごとに、緯度と経度の範囲を設定し、最小値と最大値を設定。
例:自宅=三田国際ビル、学校=東京タワーの場合はこんな感じで範囲を設定。
テーブル:Gpslogs
GPSマルチユニットから送信されたデータ(緯度、経度)を登録。
※処理4は、このテーブルへの登録(POST)となります
ビュー:Status
テーブル:Gpslogsをもとに、Places、Devicesを結合したビュー。
※処理5は、このビューからのデータ取得(GET)となります
サービス定義
サービスの確認
Postmanでテスト
テーブル:Gpslogsに登録(POST)できることを確認
AWS Lambdaの設定
※POST部のみ抜粋
※環境変数(os.environ)は以下
'posturl':Postmanで実行したURL
'device':デバイスのID(今回は'101’設定)
※nowは、日本時間の現在時刻
以下のデータでテスト実行(GPSマルチユニットから送信されてくるデータを想定)
Postmanでデータが登録されていることを確認
【処理5】AWS Lambdaで、現在地名をSAPより取得(GET)
Postmanでテスト
ビュー:Statusからデータ取得(GET)できることを確認。最新の現在地を取得するため、日付/時刻の降順ソート(desc)と件数1件(top)を指定。また、デバイスID'101'を指定。
※登録された緯度経度がテーブルPlacesに存在しない場合、当処理では取得されない
AWS Lambdaの設定
※GET部のみ抜粋
※環境変数(os.environ)は以下
'geturl':Postmanで実行したURL
'device':デバイスID(今回は'101’設定)
【処理6】AWS Lambdaで、LINE Notifyを使用して現在地をLINEに通知する
GPSマルチユニットの位置情報をLINE Notifyで通知する方法については、別途Qiitaにまとめましたので、こちらをご覧ください。
AWS Lambdaの設定
メインはこんな感じに。
A. 位置情報が取得できない場合は、こんな感じでLINEに通知。
B. 実行前のデータ取得(前回登録した位置情報を取得。処理5 参照)
C. データ送信(処理4 参照)
D. 実行後のデータ取得(処理Cでの送信データがPlacesマスタに存在していれば取得できる。存在していなければ、処理Bと同じデータが取得される)
E. GoogleマップのURL編集
F. 以下の場合、日時/デバイス名称/位置情報をLINEに通知する
・GPSマルチユニットが手動で実行された場合(イベント'type'=1が手動送信)
・日付が異なる(当日の初回送信時を想定)
・場所が異なる(前回の位置から移動したと見なす)
G. 日付と時刻が同じ場合(処理BとDで同じデータを取得した場合)は、 Placesマスタに存在していない場所にいるため、日時/位置情報をLINEに通知する
【処理7】SAP Conversational AIで、現在地の確認が可能
WEB HOOKを使用して、処理5と同様にビュー:Statusからデータを取得します。
※最低限の実装のみ
※SAP Conversational AIってなに?という方は以下オススメです
参考チュートリアル
- Build Your First Chatbot with SAP Conversational AI
- Consume API Services and Call Webhooks from Your Chatbot
intent
action
処理5のGET処理と同様のURLを設定
実行結果
アプリやWeb画面には実装していません(サボり)。
※SAPUI5に実装する方法については、以下参照
ということで、作るのはここまでです。
※ちなみに最初の想定では、現在地の確認botもLINEに寄せようと思ったていたのですが、無料でできるのは公開botになりそうなので断念しました。
使ってみた
実際に一週間使ってみました。
問題
1. 室内にいる場合、位置情報が受信できないことがある
想定はしていましたが、室内では位置情報を受信できないことがたまにありました。ただ、一切取得できなくなることはなかったので、問題なし。
2. 位置情報がブレることがある
位置情報がブレてしまい、自宅にいるのに移動しているように通知される。
これは、テーブル:Placesの自宅の範囲を拡大して解決(これぐらい大きな家に住みたいな〜と思いつつ)
3. バッグが変わるとGPSマルチユニットを入れ忘れることがある
GPSマルチユニットを入れているバッグ(ランドセル、塾用バッグなど)を持ち替えた際に、GPSマルチユニットを持っていくのを忘れてしまう。
いま、ケースに入れて、バッグの外側にぶら下げることができれば、忘れにくい&位置情報も受信しやすくなるかなと。
こんな感じのケースないですかね?
よかったところ
・授業が予定よりも早く終わり、下校時間が早まったことを通知で把握できた
・作成する過程で、子供といろいろコミュニケーションを取れた
・動くものが作れたことによる達成感(自己満サイコー)
おわりに
利用した製品、サービス、技術について
- SORACOM GPS マルチユニット
- SORACOM Harvest
- SORACOM Funk(->AWS Lambda)
- SAP HANA service(SAP Cloud Platform)
- SAP Cloud Application Programing(CAP)
- SAP Convasational AI
- Visual Studio Code
- Postman
、、、普段の仕事で使っているものが、、ない
まとめ
やはりハードウェアが絡むと、作るのも使うのも、楽しいし難しいし楽しい。
また、カレンダー企画で締め切りを意識していたため、緊張感があってとてもよい感じ進められました。
次は、SAP Analytics Cloud(SAC)とか、SAP HANA Cloudとかにも繋げてみたい(冬休みぐらいには、、)。