Dashボタンでウォーターサーバーの備品注文をできるようにしてみた

TOWNでは、ウォーターサーバーが置いてあり、誰でも好きなだけ飲めるようになっています。
割とペースが早く、早ければ1日1パック(10L)以上の勢いでなくなるのです。

この水の注文、定期便で頼めば自動で来るのですが、意外と消費量がバラバラなので、個別注文を行っているのです。
で、個別注文の場合には電話オンリー・・・。
大量に購入して置いておくのも手かもしれませんが、置き場が邪魔になります。
となると、ストックの量も少なく、ほぼ毎日のようになくなるので、頻繁に電話をかけることになるわけです。

めんどくさい!\(^o^)/

ので、どうにかならんものかと思って販売会社さんに相談したところ、メールでも対応してくれるということ。
ふむ。電話よりは手間ではないけれど、注文する時にはテンプレな文章を送り続けることになる・・・
ということは送信部分は自動化が可能・・・。やりましょう。

出来上がったもの

わかりやすいように先に実現したDashボタンを押した時の動画を貼っておきます。
管理画面はslackに用意していて確認ができるようになっています。

1回目、シングルクリックをし水のカウントが1up、
2回目、ダブルクリックをし紙コップのカウントが1upしています。

通常のアマゾンDashボタンとは違いAWS IoT Enterprise Buttonはシングルクリック、ダブルクリックそして今回は使用していませんが長押しの三動作に対応しています。
なので、水と紙コップのカウントを一つのボタンで済ませています!!

Dashボタンでウォーターサーバーの備品注文をできるようにしてみた

さて、上まででどんなものが出来上がったかはお伝えしましたが、ここからは作るまでの流れに関して説明していきたいと思います。

作り出す前に、ウォーターサーバーの備品の注文に関しては以下の注意事項があります。

<注文時の注意点>

  • 水は1個減る度に送るとほぼ毎日送ってほぼ毎日くることになるので、それはそれで受け取りが面倒なので2個で注文
  • 水飲むための紙コップは単体で注文できず、水と同時に注文する必要がある。

この注意点を満たしている必要があります。


上の注意事項を満たすため、下記のような注文フローで実装を考えました。

<注文フロー>

  • ストックを使う度にDashボタンシングルクリックでbotに教える。水が1個以上になった場合にはメールを送れる。
  • コップのストックが切れたら、水と一緒に注文(水1:コップ1でも注文)

まぁ、使ったらDashボタン押せばbotが覚えてくれて送ってくれるって流れです。

そして実際つくった管理するSlackのメッセージがこれ。

現状のDashボタンが押された回数が確認できます。
万が一押し間違いがあった場合にはこちらでリセットなどをかけて修正が可能です。


管理サーバーに現状の値、発注履歴を記録するための仕組みは以下のように考えました。

<処理フロー>

  • DashボタンをシングルクリックするとDBが更新され、Slackの表示も更新されます。(限界値が水は5個、紙コップは1個)
  • メールボタンをクリックすると注文メールが送信されDBが初期化され、注文履歴がcsv形式のファイルに保存されます。
  • ゴミ箱(リセットボタン)をクリックすると発注予定DBが初期化されます。

そしてこの注文、処理フローのAWSとSlackとDashボタンの構成はこんな感じ。

次から内部のコードのお話なのでサクッと読みたい人はココをクリックしてください

作り方

  1. Slack appとAWS API GatewayとLambda関数とS3バケットを作ります! これはslackのボタンを押した時の情報をlambdaで受け取ろうとしたら、躓いた話で詳しく紹介しているので、この記事を参考に作ってください。
  2. SESの設定はSES+S3+Lambdaを使ってサーバーレスでメールを転送するを参考にしてください。
  3. 上記のものが揃ったら、最初だけslack apiのchat.postMessageを使ってなんでも良いのでメッセージをPOSTしておき、そのtsを控えておきます。このtsをもとに条件分岐を行って削除するメッセージを指定します。

実際のLambdaのコード

全処理を同Lambdaで受けているので長い分に。classの中身は除外してメインなとこだけ。



こんなかんじになりました。一個目のif、else文でpayloadに入ってきた情報がDashボタンを押したのか、Slackのボタンを押したのか識別しています。そして、二個目のif、elif文でボタンごとの動作を指定しています。ちょっと長すぎるので載せていないコードはこちらにあります。

ボタン操作

slackに表示された管理画面より、最終的なメールを送信することができます。

(2個以上の時に自動注文を走らせることもできますが、お金が関わる問題なので一応人間が確認しておくるように・・・)

水が0の時にメールを送信しようとすると…

メールを送信できません!水0で送信されても業者さんへの迷惑メールになってしまうので笑

水1、紙コップ1の時

送信内容の確認画面が表示されます。文面が変になってないかを確認して、OKを押せば宅配業者にメールが届きます。

リセットボタン(ゴミ箱)をタップorクリックした時

ボタンを誤って操作した場合にはこちらのボタンから個数をリセットして修正が可能です。

送信してみた

確認画面から送信、自分と発注先の2つに飛ぶようにしておいたので、

自分に届いたのは確認できていたのですが、相手側の迷惑メールになってないか不安に思いつつ待っていると、

おぉ!届いた!すべて問題なし!通常窓口ではなくメール対応してもらったためか受付を通したというより個人のやりとりのような感じ。

なので、自動返信ではないメールも来ると思うので、確認のため返信もSlackで通知来るようにしておきます。

IFTTTを使って特定のアドレスからGmailに来たメールをSlackに転送

こちらの手順でメールをSlackに通知するように変更しました。

終わりに

これで電話しなくて済む!!!

slackのボタン付きメッセージのボタンをクリックすると

が出てくる話はまた別の記事にて(Slackbotが自分だけに何か言ってくる)

2019/02/07 追記解決方法がわかったのでリンクを貼っておきます。
Darn – that didn’t work. Feel free to give it another go. 解決方法 API Gateway+Lambda

お金の話

今回かかっている料金を開発メンバーの一人が調べてくれました。
「Dashボタンでウォーターサーバーの備品注文をできるようにしてみた」のお値段

2018/12/13 追記

無事、宅配業者が来て、水と紙コップ「ホルダー」を持ってきてくれました。

・・・うん。日本語的にそうだよね。紙コップの替えと文言を修正・・・。散々テストでも表示してたのに、なぜ文章に違和感を覚えなかったんだろう。

開発メンバー

  • r.kato – 主にSlackボタン機能,lambdaの骨組み,SES作成
  • s.nagasawa – 主にlambdaによるS3のDB読み書き,log保存機能作成