もはやAmazonDashButtonを押すのすらもめんどくさい


この内容はGEEK GARAGE IOT vol2で発表した内容をまとめたものです。

背景

弊社では会社で物品を購入する際によくAmazonを利用しており、お茶などのよく購入する物品についてはAmazonDashButtonを使って注文しています。
しかし、AmazonDashButtonを会社で使った場合以下の3つの問題が生じます

  • 誰が押したかわからない
  • 商品が特定のものに限定される
  • てかボタン押すのめんどくさい

そこで今回はこの問題を解決するために作成したものをご紹介します。

時間の無い方のために最終完成形を先にご紹介するとこちらになります。(作ってくれた方がかっこよくしてくれました笑)

AmazonAutoOrder

なんじゃこりゃと興味を持った方は是非中身も読んでみてください

1. Amazonの注文をBot化する

まず思いついたのがこれです。このAmazonのBot化についてはこちらの投稿に詳しく書いたのでご覧ください。
システム構成は以下のような形になっており、Slackで注文コマンドを実行するとSinatraアプリが注文処理を実行して、スクショを撮って返してくれます。

こんな感じです。
商品を登録

注文

また履歴機能もつけたので注文履歴も確認できます

さてこれで解決したかった3つの問題はどうなったでしょうか?

  • 誰が押したかわからない → 履歴機能を使えば分かる
  • 商品が特定のものに限定される → 何でも登録できる
  • てかボタン押すのめんどくさい → slackに投稿するのめんどくさい ❌

初めの2つは解決しましたが最後の1つはやることが変わっただけでめんどくさいことには変わりません。

2. RaspberryPi + センサーを使って自動で発注する

最後の押すのがめんどくさいという問題を解決するためにセンサーを使って自動で発注が出来るようにします。
今回は重さセンサーを使って一定の重さ以下になったらSlackにポストするようにしました。
システム構成は先ほどのBotにRaspberryPiが加わります。

必要なものは

  • RaspberryPi本体
  • 圧力センサー
  • A/Dコンバーター
  • Wifi USBモジュール

回路についてはこちら
の投稿の回路をそのまま使わせていただきましたmm
大変助かりました。ありがとうございます。

また、今回はRaspberryPiを使いましたが、RaspberryPiはOSのインストールが必要だったり、A/Dコンバーターが内蔵されていないので回路を組まないといけなかったりとかなりハードルが高いです。
後から気づきましたが、このくらいの単純な仕組みであればA/Dコンバーターが内蔵されているArduinoやIchigoJamを使ったほうがいいかと思います。

コードはpythonを使ってこんな感じになりました。重さによってステータスを切り替えるシンプルなものです。
(ちなみにこれは新卒の営業の子にプログラムを教えて書いてもらいました。)

# -*- coding: utf-8 -*-
import wiringpi as wp
import time
import requests
import json

# SPI channle (0 or 1)
SPI_CH = 0

# pin base (above 64)
PIN_BASE=70

# GPIO number
LED_PIN = 25

# threshold
THRESHOLD = 100

SLACK_POST_URL = 'https://hooks.slack.com/services/xxxxxxxxxx'
STATUS_ENOUGH   = "enough"
STATUS_ORDERING = "ordering"
STATUS          = STATUS_ENOUGH
# setup
wp.mcp3002Setup (PIN_BASE, SPI_CH)
wp.wiringPiSetupGpio()
wp.pinMode(LED_PIN, wp.GPIO.OUTPUT)


def order():
  requests.post(SLACK_POST_URL, data = json.dumps({
    'text': u'az 注文 コーヒー',
    'username': u'raspberry pi',
    'link_names': 1,
  }))

def update_status(weight):
  global STATUS
  if(STATUS == STATUS_ENOUGH and weight <= THRESHOLD):
    order()
    STATUS = STATUS_ORDERING
    print(STATUS_ORDERING)
  elif(STATUS == STATUS_ORDERING and weight >= THRESHOLD):
    STATUS = STATUS_ENOUGH
    print(STATUS_ENOUGH)

while True:
  global STATUS
  weight = wp.analogRead(PIN_BASE) #get weight
  print("weight:" + str(weight) + STATUS)
  update_status(weight)
  time.sleep(1)

ではでは実際動いている動画を見ていただきましょう!!

AmazonAutoOrder

  • 誰が押したかわからない → 履歴機能を使えば分かる
  • 商品が特定のものに限定される → 何でも登録できる
  • てかボタン押すのめんどくさい → slackに投稿するのめんどくさい

見事に3つ目の問題も解決しましたね

最後に
現在MAMORIO社は一緒に働いてくれるエンジニアを募集しています。
今回のような業務自動化やIoTに興味のあるエンジニアの方是非一度遊びに来てください

補足

今回の発表スライド
AmazonBotifyについてのQiita
AmazonBotify Repository
第一回発表のqiita