masato-ka's diary

日々思ったこととか、やったことの備忘録。

SORACOM LTE-M Buttonで家庭内PoCをやってみた話

1. この記事について

この記事はSORACOM LTE-M Button powerd by AWS Advent Calendar 2018 8日目の記事になる。前回このブログではSORACOM LTE-M ButtonがIoTデバイスとしてとて素晴らしいお手本となっていることを紹介した。

masato-ka.hatenablog.com

この意見は今も1mmとして変わってない。その上で、どんな素晴らしいデバイスを使ったとしてもアプリケーションとユーザとの関係を考えユースケースを実装することが価値になるということをお伝えしたい。そうでなければせっかくの素晴らしいデバイスを台無しにしてしまう。今回はおうちハック的にSORACOM LTE-M Buttonを使ってみたお話となる。

2. 検討したユースケース

今回SORACOM LTE-M Buttonを利用して実装したアプリケーションのユースケースは日用品の在庫管理ユースケースである。

これはSORACOM LTE-M Buttonをクリックするたびに日用品の在庫の数をカウントする機能を持っている。あらかじめ備蓄品の数を設定しておき、備蓄品を利用したらボタンをワンクリックする。そうすると、在庫数を減算していく仕組みである。管理している在庫数を可視化させることでリアルタイムに備蓄品の数を確認することができる。家庭内でよく使う備蓄品としてトイレットペーパやティッシュといった日用品から卵などの食品まで色々なものを割り当てることができる。今回は冷蔵庫の卵の数をカウントするEgg Counterを実装した。

2.1 ユースケースにおける課題感

ユースケースに対する課題として考えたことは、「帰宅途中に買い物をする際に冷蔵庫の中身を覚えておらず買い物に苦慮する場面」であった。 例えば夕飯の支度に卵を使いたいが、卵の残数やその賞味期限などを出先で確認することが難しい。我が家は共働きの2人暮らしである。そののため、特にこういった食品の残数について、「お互いがいつ使ったかわからない」ことから残数の把握は困難になる。

2.2 在庫の減り具合を見ることの意義

在庫状況を可視化することで上記の課題に対して、出先にて最新の在庫状況を確認することが可能となる。そのため、無駄な買い物を抑止することができる。また、可視化状況を共有することでコミュニケーションにより多重購入という悲劇を未然に防ぐ手立てともなる。

2.3 本家ダッシュボタンとの違い

本家ダッシュボタンでは似たような課題に対して、無くなる、無くなりそうなタイミングですぐに注文できるという価値を提供している。一方で現在の家の中の在庫数については管理することができない。この場合、上記に挙げた課題感に対しては対応することができない。また時系列で在庫の消費量を記録することで将来の消費予測やカイゼン活動につなげることができる。

3. Egg Counterのアーキテクチャ

ここで実際に作成したSORACOM IoT Buttonを利用した在庫管理アプリケーション、Egg Counterについて紹介する。

3.1 アーキテクチャ方針

Egg Counterのアーキテクチャを決定する上で以下の二点をポイントとしてて検討を行った。

  1. 簡便に在庫の管理を実現する機能
  2. 簡易PoCに的を絞り簡易なつくりとすること。

1についてはセンサーなどは使わずにSORACOM Buttonを、使うことで簡単に在庫の記録を行えるようにした。 2.については既存サービスを活用することで構築の手間を省いた。また利用するサービス数を絞れるように各サービスの使い方を工夫した。

3.2 構成

上記アーキテクチャ方針にしたがって以下のような構成とした。

f:id:masato-ka:20181208110531j:plain
Egg Counter アーキテクチャ

以下のように冷蔵庫から卵を取り出すごとにSORACOM LTE-M Buttonを押すことで在庫数をカウントしていく。カウントされた在庫数は Lagoon上で可視化されるようにした。データの永続化自身はSORACOM Harvestに任せ、AWS Lambdaからアクセスするようにしている。

  • ボタンに割り当てられたイベントは以下のようになっている。
ボタンイベント 動作 意味
シングル 在庫減算 卵を使った時に卵の在庫を減らす。
ダブル 在庫加算 卵の補充や誤押の際の在庫修正に利用する。
ロング 在庫のリセット 卵を新規に補充した際に設定された値に在庫を更新する。

3.3 AWS Lambda のコード

Lambdaのコードは以下のリポジトリに掲載している。

github.com

CloudFormationを使いデプロイすることができる。今回は先日のAWS reInventで公開されたIntteliJ IDEAWS Toolkits pluginを使って開発を進めた。

Lamda ファンクション本体は以下のようにクリックに応じて各イベント処理にディスパッチするコードのみになっている。

def lambda_handler(event, context):

    click_type = event['deviceEvent']['buttonClicked']['clickType']
    if click_type == "SINGLE":
        do_single_click_event()
        logger.info("Called single click event.")
    if click_type == "DOUBLE":
        do_double_click_event()
        logger.info("Called double click event.")
    if click_type == "LONG":
        do_long_click_event()
        logger.info("Called Long press event.")
    return {"result":"success"}

SINGLEクリックイベントのメソッドではSORACOM APIから現在の在庫数を取得するget_latest_remainingメソッドを実行し、在庫の減算を行なっている。減算した結果をpersistent_remainingHarvestのAPIで送っているようにしている。

def do_single_click_event():
    latest_remaining = get_latest_remaining()
    remaining = latest_remaining - 1 if latest_remaining > 0 else 0
    persistent_remaining(remaining)

ダブルクリックやロングについても加算、リセットのみが違うだけで動きは同じである。ソラコムのAPIについてもオーソドックスにアクセスすれば問題ない。この部分は今年ソラコム側でセルラー回線以外へサービスの対応を進めているため、実現できるようになった。

参考2では記載されていないが、参考1で入れたデータを取得するためのエンドポイントはhttps://api.soracom.io/v1/data/Device/{DEVICE ID}?sort=desc&limit=1となる。詳細は上述のGitHubのコードをご覧いただきたい。

4. 改善ポイント

4.1 AWS Lambdaに渡すキーの多さ

SORACOMHarvestの WEB APIとSORACOM APIのDATA APIを使うことで、AWS Lambdaは以下の4つの情報を持つことになる。 これらはAWS Lambdaに環境変数として設定している。SORACOM Harvestへデータを送信するためにはAWS Lambdaをデバイスと登録してキーを払い出す必要がある。SORACOM Buttonが出てきたタイミングでボタンの情報をHarvestに連携するために従来のSORACOM APIとHarvestのAPIを一緒にしてもいいと思う。AWS側にDB持たせればいいというのはごもっとも。

キー名 説明 用途
バイスID SORACOM Inventoryから払い出されたデバイスID SORACOM Harvestへデータを送る際に利用
バイスシークレット SORACOM Inventoryから払い出されたデバイスのシークレットキー SORACOM Harvestへデータを送る際に利用
Authキー SAMユーザのAuthキー SORACOM Harvestからデータを取得する際に利用
AuthキーID SAMユーザのAuthキーID SORACOM Harvestからデータを取得する際に利用

4.2 AWS Lambdaの環境変数

環境変数の値として記号を含む文字列を設定するとエスケープされてしまう。また、環境変数から文字列として取り出した場合、エスケープされた文字列が取り出されるため、エスケープを除去する必要がある。今回の場合、SORACOM Inventoryで払い出したデバイスシークレットキーに「=」が含まれており、これが「\」でエスケープされていた。そのため、以下のようなコードでエスケープ文字を除去した。

KEY_NAME = os.environ['key name'].replace('/','')

5. ユーザレビュー

仕組み自体の構築は1〜2時間で完了し、いざ家庭内 PoCとして投入してみた。

5.1 ユーザの感想

意気揚々と仕組みの説明と使い方、意義を説明した結果ユーザから「めんどくせぇ」という感想をいただいた。UXへの敗北である。「ボタンを押す煩わしさ>卵の個数がわかるメリット」の図式が出来上がったために発生した問題だ。前述したように、仕組みやデバイスが良くてもそれを活用するアプリケーションの価値に問題があった。

6. まとめ

SORACOM LTE-M Buttonは非常に優れたデバイスである。しかし、それを活かすユースケースをしっかりと作り込むべきだろう。今回は卵を取り出すという行為に無理やりボタンを押すという行為を繋げてしまい、ユーザへの手間を増やす結果となった。SORACOM LTE-M Buttonを活かすためには。ボタンを押すという行為がユースケースで無理なく出てくることが重要じゃないかと思う。良いデバイスなだけに見落としやすい。