はじめに
SESAME miniは公式でAmazon DashボタンやAWS IoTエンタープライズボタンを使用した
施錠・解錠の設定方法を公開しています。
参考:Amazon Dash Buttonでセサミを解錠する
しかしAWS IoT ボタンは2,500円と比較的高価で気軽に導入できるものではないため、
その代替としてダイソーで売っている300円のBluetoothシャッターボタンを利用して
同様のことが出来ないかと試してみました。
参考文献
必要なもの
- Raspberry Pi
- SESAME mini
-
Bluetoothリモートシャッター
- ダイソーで購入したものを使用したのでリンク先の商品での動作確認はしていません。
リモートシャッターとRaspberry Piの接続
vimyumさんの「わずか300円でIoTボタンを作る方法」を参考に接続します。
ボタン操作が認識される事を確認してください。
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のダッシュボードにログインして
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でもどちらでもいいと思います。
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で遊ぶ
sudo apt-get install ruby-dev
sudo gem install rest-client
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」などに変更すれば
反応するボタンを指定することが出来ます。