300円のリモートシャッターでSESAME miniを操作する

# はじめに
SESAME miniは公式でAmazon DashボタンやAWS IoTエンタープライズボタンを使用した
施錠・解錠の設定方法を公開しています。
　参考：[Amazon Dash Buttonでセサミを解錠する](https://ameblo.jp/candyhouse-inc/entry-12404015172.html)

しかし[AWS IoT ボタン](https://www.amazon.co.jp/dp/B075FPHHGG)は2,500円と比較的高価で気軽に導入できるものではないため、
その代替としてダイソーで売っている300円のBluetoothシャッターボタンを利用して
同様のことが出来ないかと試してみました。

# 参考文献
- [わずか300円でIoTボタンを作る方法](https://qiita.com/vimyum/items/8b7548ca8cf45383c5b0)
- [raspberry pi zero wとダイソーのリモートシャッターとrubyで遊ぶ](https://kingyo-bachi.blogspot.com/2017/12/raspberry-pi-zero-wruby.html)

# 必要なもの
- Raspberry Pi
- SESAME mini
- [Bluetoothリモートシャッター](https://www.amazon.co.jp/dp/B00JX70WK4)
    - ダイソーで購入したものを使用したのでリンク先の商品での動作確認はしていません。

# リモートシャッターとRaspberry Piの接続
vimyumさんの「[わずか300円でIoTボタンを作る方法](https://qiita.com/vimyum/items/8b7548ca8cf45383c5b0)」を参考に接続します。
ボタン操作が認識される事を確認してください。

```
sudo apt-get update
sudo apt-get install ruby
sudo gem install bluebutton
```

```
bluetoothctl
[bluetooth]$ power on
[bluetooth]$ scan on
[NEW] Device XX:XX:XX:XX:XX:XX AB Shutter3
[bluetooth]$ pair XX:XX:XX:XX:XX:XX
[AB Shutter3            ]$ trust XX:XX:XX:XX:XX:XX
[AB Shutter3            ]$ quit
```

# Sesame WebAPI使用の準備
## APIキーの取得
CANDY HOUSEの[ダッシュボード](https://my.candyhouse.co)にログインして
API settingsからSEND CODEを押して送られてきた認証コードを入力してConfirm。

API KeysでADDを押すと数秒してAPIキーが表示されます。
このKeyは後からは参照できなくなるので必ずコピーしておきましょう。

## デバイスIDの確認
Sesame Listから操作したいSesameを選択してデバイス画面に移動。
（カーソルがリンク表示になりませんがそのままクリックできます）
各デバイスの画面のURLにデバイスIDが含まれています。

```
https://my.candyhouse.co/#/sesameList/0/********-****-****-****-************
```

この****の部分の文字列をデバイスIDとして記録しておきます。

# ~/.config/bluebuttonの編集

キーを押した時にWeb APIを呼び出すように設定を変更します。
keyupでもkeydownでもどちらでもいいと思います。

```~/.config/bluebutton
keyup=echo OPEN SESAME
keydown=curl -H "Content-type: application/json" -H "Authorization : **APIキー**" -X POST -d '{"command" : "unlock"}' https://api.candyhouse.co/public/sesame/**デバイスID**
longup=echo LONG UP
longdown=echo LONG DOWN
```

閉じたい場合にはunlockの部分をlockにすれば閉じられます。
長押しと使い分けたいところなのですが長押しが発動する際は
短押しも発動してしまうので単に設定ファイルを変えるだけでは
施錠と解錠を使い分けることは出来ません。

# 起動する

```
$ bluebutton -d="Shutter3" -c ~/config/bluebutton
```

Shutter3を含む名前のデバイスのイベントをキャッチして
~/.config/bluebuttonの設定の動作をさせるオプションです。
押し込むとWebAPIが作動して離した時にOPEN SESAMEと表示が出ます。
連打するとエラーで強制終了してしまいます。
sleepの時間を長く設定すれば対処できます。

# おまけ
bluebuttonでは複数のシャッターボタンの使用は想定されていないようで
AB Shutterという名前でデバイスを検索するため同名デバイスの区別ができず
必ず1つ目にペアリングしたボタンが認識されてしまいます。

そこでこちらの記事を参考にしつつ、
デバイスを検索せずに決め打ちしてしまう方法で
2つのボタンを認識して使用しています。
　参考：[raspberry pi zero wとダイソーのリモートシャッターとrubyで遊ぶ](https://kingyo-bachi.blogspot.com/2017/12/raspberry-pi-zero-wruby.html)

```
sudo apt-get install ruby-dev
sudo gem install rest-client
```

```abshutter.rb
require 'device_input'
require 'rest-client'
require 'json'

class Bluebutton
  def initialize name
    @device = name
  end

  def run
    File.open(@device, 'rb' ) do |input|
      DeviceInput.read_loop(input) do |event|
        if event.type == 'EV_KEY'
          if event.value > 0
            key_down event
          end
        end
      end
    end
  end

  def key_down event
    puts "OPEN SESAME"
    RestClient.post 'https://api.candyhouse.co/public/sesame/[デバイスID]', {"command" => "unlock"}.to_json, { content_type: :json, :Authorization => "[APIキー]" }
    sleep 1
  end
end

device = "/dev/input/event0"

button = Bluebutton.new("/dev/input/event0")
puts "Reading events from "/dev/input/event0"..."
button.run
```

「/dev/input/event0」を「/dev/input/event1」などに変更すれば
反応するボタンを指定することが出来ます。