SAPのすみっこ

SAP業界のすみっこに住んでます。すみっこから小さな声で発信します。

SAP業界のすみっこから小さな声で発信します

SORACOMとSAP Cloud Platformで子供の登下校を見守ってみた

※この記事は chillSAP 夏の自由研究2020 の記事として執筆しています

夏だ、プールだ、アウトプットだ!

 

 

今回は、無理矢理繋げるシリーズ第4弾となります。

※過去の繋げるシリーズについてはこちら。よかったら覗いてください。

  1. Alexaに話しかけてSAPサーバを起動する
  2. ドローンで品目を移動したら、SAP ERPで在庫転送する
  3. SORACOMのあのボタンでオンプレSAPを操作してみた

 

目次

 

はじめに

最近の悩み

新型コロナウイルスの影響で子供の学校が休校となっていました。

学校の再開後、授業の遅れを取り戻すために変則的な時間割が組まれました。そして、学童保育を利用する日、塾がある日、何もない日との組み合わせで、帰宅時間が毎日バラバラになっていました。

子供と一緒に時間を間違えないように注意はしていたのですが、、、先日、子供が待ち合わせ場所を間違えて見当たらず、慌てて周囲を探し回るということがありました(すぐ見つかりましたが)。

そこで、簡単に子供の居場所を確認できるようにしたいなと思い、見守りシステムを作ってみました。

 

やりたいこと

・子供が移動したら、現在地を通知してくれる(毎日のことなので自動がいい)

・「いまどこ?」と聞くと、現在地を回答してくれる

 

作成にあたっての本音

「chillSAP 夏の自由研究」ってテーマだし、何かハードウェアをさわりたいな。以前から気になってるSORACOMのアレをつかって、SAPと無理矢理つなげて、それっぽくしてみるか(アレを買う口実が欲しかっただけ説)。

 

ということで今回も、触りたかったものと勉強しているものを無理矢理繋げます

 

ビジネスっぽいこじつけ

IoTのセンサー情報と、SAPのビジネスデータを組み合わせて何かを始めてみる際にオススメ、かも

 

作ってみた

SORACOM、AWS LambdaPythonに触るのも前回の繋げるシリーズ以来です。

みなさんご存知のとおり私の知識不足のため、認証/セキュリティ/エラーハンドリングなどは弱弱です。

また、「別にSAP CP使わなくても〜」は禁句です。

 

できたもの

作成したのは、以下の2機能。

(1) 子供が移動したら現在地をLINEに通知する

現在地が「学校」or「通学路」or「自宅」なのかを自動で通知。詳細はGoogleマップで確認可能。

f:id:mahko2:20200803150444j:plain

 

(2) SAP Convasational AI で「いまどこ?」と聞くと現在地を回答する

※テスト実行のみ

f:id:mahko2:20200803153833p:plain

システム構成

今回の構成はこちら

f:id:mahko2:20200802015128j:plain

詳細についてはここから説明します。 

 

【処理1】ランドセルに入れたGPSマルチユニットより緯度/経度を定期送信

f:id:mahko2:20200802022053j:plain

今回は、GPSマルチユニットSORACOM Editionを使います。

 

以下、公式サイトより引用

「位置情報(GPS)」「温度」「湿度」「加速度」の4つのセンサーと充電式バッテリーを内蔵し、 セルラーLPWAであるLTE-M通信がご利用可能なデバイスです。

 

 これ、すんごいんですよ。以下も引用(抜粋)

  • GPS、温度、湿度、加速度を計測する4つのセンサーが内蔵

  • ソラコムのコンソールからシンプル操作で「センサー値」「取得タイミング」を設定可能

  • センサーデータはセルラー回線を利用しソラコムプラットフォームに送信

  • センサーデータは、SORACOM HarvestSORACOM Lagoonを使用して可視可能。また、SORACOM BeamSORACOM FunnelSORACOM Funkを使用してクラウドサービスやサーバーにデータを連携可能 

 

手軽にセンサーデータをソラコムのコンソールや、クラウドサービスに送信できちゃう優れものです。

GPSマルチユニットの初期設定などは、公式ドキュメントやQiitaが充実していますので、そちらを参照してください。

GPS マルチユニット SORACOM Edition : デバイスの使い方 | ユーザーガイド | SORACOM Users

GPS マルチユニット SORACOM Edition と SORACOM Harvest Data で簡単に可視化する | Getting Started with GPS マルチユニット SORACOM Edition | SORACOM Users

 

(余談)SORACOM LTE-Mボタンが手元にあったので、こちらを利用して実現しようとしましたが、、、子供は、意図したタイミングでボタンを押してくれませんでしたw 

※SORACOM LTE-M ボタンについてはこちら

※過去にボタンを使ったLTをやりました(無理矢理繋げるシリーズ第3弾)↓

 

【処理2】SORACOM Harvestで、現在地の確認が可能

f:id:mahko2:20200802022309j:plain

現在地を把握するだけならば、SORACOM Harvestで十分です。

こんな感じで位置情報を見ることができます。

※以下、公式サイトより引用

SORACOM Harvestとは、IoT デバイスからのデータやファイルを収集・蓄積するサービスです。

Harvest概要

 

今回は、現在地の通知を自動で行いたいため、SORACOM Funkを利用します。

 

【処理3】SORACOM Funkで、AWS  Lambda実行

f:id:mahko2:20200802022535j:plain

 SORACOM Funkとは(以下、公式サイトより引用)

SORACOM Funkは、クラウドサービスの Function を直接実行できるサービスです。 クラウドリソースを活用することでデバイス側の実装をシンプルに保ち、デバイスリソースのオフロード、低電力消費化が可能となります。

 

SORACOM Funkを使用すると、GPSマルチユニットで取得したセンサーデータを、クラウドサービスのファンクションで利用できます。今回は、AWS Lambdaと連携します。

 

概要や設定方法については以下参照

SORACOM Funk を利用して AWS Lambda を呼び出し Slack へ通知する | Getting Started | SORACOM Users

 

【処理4】AWS  Lambdaで、緯度/経度をSAPに登録(POST) 

f:id:mahko2:20200802023947j:plain

 

取得したGPSデータは、SAP Cloud PlatformのSAP HANA serviceを使用して保持しました。理由としては、お勉強中のSAP Cloud Application Programming Model (CAP)を使いたかったからです。

 

参考チュートリアル

手順は、SAP公式の以下のチュートリアルを参考に行いました。

※チュートリアルのミッション完了で、SAP CommunityバッヂもGET

f:id:mahko2:20200802143007p:plain

 

あと参考にしたのは、CAPの公式サイト。シンプルで見やすいです。

capire - home

 

ムフフ。Visual Studio Codeで、Node.jsで、、、ムフフ(仕事で使ったことない)。

f:id:mahko2:20200802144631p:plain

 

検討の結果、以下の3つのテーブルと1つのビューを作成しました。

・Devices(デバイスのマスタ。名称を保持)

・Places(地名と緯度経度を紐付けるマスタ)

・Gpslogs(GPSマルチユニットから送信された緯度経度を登録する)

・Status(上記3つのテーブルを結合したビュー) 

 

テーブル:Devices

GPSマルチユニットのデバイスごとの名称を管理。

f:id:mahko2:20200802144925p:plain

事前にデータを登録しておきます。

f:id:mahko2:20200802145048p:plain

 

テーブル:Places

GPSデータ(緯度、経度)をもとに、現在地の名称を管理。

f:id:mahko2:20200802145222p:plain

こちらも事前にデータを登録しておきます。

f:id:mahko2:20200802145954p:plain

 

場所ごとに、緯度と経度の範囲を設定し、最小値と最大値を設定。

 

例:自宅=三田国際ビル、学校=東京タワーの場合はこんな感じで範囲を設定。

f:id:mahko2:20200802151206p:plain

 

テーブル:Gpslogs

GPSマルチユニットから送信されたデータ(緯度、経度)を登録。

※処理4は、このテーブルへの登録(POST)となります

f:id:mahko2:20200802151453p:plain

 

ビュー:Status

テーブル:Gpslogsをもとに、Places、Devicesを結合したビュー。

※処理5は、このビューからのデータ取得(GET)となります

f:id:mahko2:20200802152023p:plain

 

サービス定義

f:id:mahko2:20200802152640p:plain

 

サービスの確認

f:id:mahko2:20200802153842p:plain

 

Postmanでテスト

テーブル:Gpslogsに登録(POST)できることを確認

f:id:mahko2:20200802153551p:plain

 

AWS Lambdaの設定

※POST部のみ抜粋

※環境変数(os.environ)は以下

 'posturl':Postmanで実行したURL

 'device':デバイスのID(今回は'101’設定)

※nowは、日本時間の現在時刻

f:id:mahko2:20200802160136p:plain

 

以下のデータでテスト実行(GPSマルチユニットから送信されてくるデータを想定)

f:id:mahko2:20200802155326p:plain

 

Postmanでデータが登録されていることを確認

f:id:mahko2:20200802155705p:plain

 

【処理5】AWS  Lambdaで、現在地名をSAPより取得(GET)

f:id:mahko2:20200802023947j:plain

 

Postmanでテスト

ビュー:Statusからデータ取得(GET)できることを確認。最新の現在地を取得するため、日付/時刻の降順ソート(desc)と件数1件(top)を指定。また、デバイスID'101'を指定。

※登録された緯度経度がテーブルPlacesに存在しない場合、当処理では取得されない

f:id:mahko2:20200802162359p:plain

 

AWS Lambdaの設定

※GET部のみ抜粋

※環境変数(os.environ)は以下

 'geturl':Postmanで実行したURL

 'device':デバイスID(今回は'101’設定)

f:id:mahko2:20200802161904p:plain

 

【処理6】AWS  Lambdaで、LINE Notifyを使用して現在地をLINEに通知する 

f:id:mahko2:20200802163204j:plain

GPSマルチユニットの位置情報をLINE Notifyで通知する方法については、別途Qiitaにまとめましたので、こちらをご覧ください。

  

AWS Lambdaの設定

メインはこんな感じに。

f:id:mahko2:20200803163431p:plain

 

A. 位置情報が取得できない場合は、こんな感じでLINEに通知。

f:id:mahko2:20200803164418j:plain

 

B. 実行前のデータ取得(前回登録した位置情報を取得。処理5 参照)

 

C. データ送信(処理4 参照)

 

D. 実行後のデータ取得(処理Cでの送信データがPlacesマスタに存在していれば取得できる。存在していなければ、処理Bと同じデータが取得される)

 

E. GoogleマップのURL編集

 

F. 以下の場合、日時/デバイス名称/位置情報をLINEに通知する

 ・GPSマルチユニットが手動で実行された場合(イベント'type'=1が手動送信)

 ・日付が異なる(当日の初回送信時を想定)

 ・場所が異なる(前回の位置から移動したと見なす) 

f:id:mahko2:20200803165540p:plain

 

G. 日付と時刻が同じ場合(処理BとDで同じデータを取得した場合)は、 Placesマスタに存在していない場所にいるため、日時/位置情報をLINEに通知する

f:id:mahko2:20200803165432p:plain

 

【処理7】SAP Conversational AIで、現在地の確認が可能

f:id:mahko2:20200803170621j:plain

WEB HOOKを使用して、処理5と同様にビュー:Statusからデータを取得します。

※最低限の実装のみ

 

※SAP Conversational AIってなに?という方は以下オススメです

 

参考チュートリアル

 

intent

f:id:mahko2:20200803172552p:plain

 

action

処理5のGET処理と同様のURLを設定

f:id:mahko2:20200803172922p:plain

f:id:mahko2:20200803172832p:plain

 

実行結果

f:id:mahko2:20200803153833p:plain

アプリやWeb画面には実装していません(サボり)。

※SAPUI5に実装する方法については、以下参照

 

ということで、作るのはここまでです。

 

※ちなみに最初の想定では、現在地の確認botもLINEに寄せようと思ったていたのですが、無料でできるのは公開botになりそうなので断念しました。

 

使ってみた

実際に一週間使ってみました。

問題

1. 室内にいる場合、位置情報が受信できないことがある

f:id:mahko2:20200804114007j:plain

想定はしていましたが、室内では位置情報を受信できないことがたまにありました。ただ、一切取得できなくなることはなかったので、問題なし。

 

2. 位置情報がブレることがある

位置情報がブレてしまい、自宅にいるのに移動しているように通知される。

f:id:mahko2:20200804115033j:plain

 

これは、テーブル: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とかにも繋げてみたい(冬休みぐらいには、、)。