わずか300円でIoTボタンを作る方法

# こんなの見つけたよ
100円ショップで物色していたら、こんなものを見つけたよ。100円ショップなのに300円※だったけど、いろいろ遊べそうなので思わず衝動買いしてしまったよ。 (※あとで[Amazon](https://www.amazon.co.jp/Bluetooth-スマートフォン用-カメラリモコン-Shutter-ABS3-BLK/dp/B00JX70WK4)をみてみたら1円から売ってました:cry:）
<img src="https://qiita-image-store.s3.amazonaws.com/0/160451/d6e70a4e-1e21-7bfb-f85c-925f735e2bc0.png" width=40%>

Bluetoothでスマホにコマンドを送れるってことは、スマホではなくラズパイとBluetoothでつなげられれば、物理ボタンとWebを連携させるIoTっぽいことができそうだね。例えばボタンを押すとAmazonで注文できるなんちゃってDashボタンとか。今回は、LINEにメッセージをPush通知するLINEボタンをつくってみるよ。

# 準備するもの
 * Raspberry-Pi3 (BluetoothがついてればOK)
 * リモートシャッター (AB Shutter 3)

# つくりかた
## ラズパイとリモートシャッターとの接続
まずはラズパイとリモートシャッターをBluetoothでペアリングするよ。Bluetoothを使うために必要なパッケージをラズパイにインストールだ。

```bash
sudo apt-get install bluez bluetooth libbluetooth-dev build-essential
```
次はbluetoothのペアリングだ。リモートシャッターは側面のスイッチをオンにするとしばらくペアリング待ち状態になるよ。ラズパイにて`bluetoothctl`コマンドでペアリングしよう。名前が`AB Shutter3`となっているデバイスがリモートシャッターだ。

```bash
$ bluetoothctl
[bluetooth]# power on
[bluetooth]# scan on　←リモートシャッターをペアリング待ちにしておく
...
Device FF:FF:7F:F1:XX:XX AB Shutter3 ←これがリモートシャッター
...
[bluetooth]# info FF:FF:7F:F1:XX:XX
Device FF:FF:7F:F1:XX:XX
	Name: AB Shutter3       
	Alias: AB Shutter3       
	Appearance: 0x03c1
	Icon: input-keyboard
	Paired: yes
	Trusted: yes
	Blocked: no
	Connected: no
	LegacyPairing: no
	UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
	UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
	UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
	UUID: Battery Service           (0000180f-0000-1000-8000-00805f9b34fb)
	UUID: Human Interface Device    (00001812-0000-1000-8000-00805f9b34fb)
	Modalias: usb:v248Ap8266d0001
[bluetooh]# pair F:FF:7F:F1:XX:XX
```

## ボタン操作の検知
ペアリングが完了したら、今度はリモートシャッターのボタンの操作を検知するプログラムを開発するぞ！:muscle_tone2:、、と思ったら、すでに完成しているものをGitHubで見つけてしまった。。「[bluebutton](https://github.com/kinnalru/bluebutton)」というソフトウェアだ。長押しと通常押しも見分けられるようだ。Ruby2以上が必要なのでさっそくインストールしよう。

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

設定ファイルにてボタンを押されたときの動作を自分で決めることができるようだ。`~/config/bluebutton`というファイル名で下記のファイルをつくったよ。

```ini
keyup=curl -XPOST 'https://my-app.now.sh/postLineMessage'
keydown=echo DOWN
longup=echo LONG UP
longdown=echo LONG DOWN
```

ボタンが押されて離された時に、LINEへの投稿をトリガするAPI(`https://my-app.now.sh`)を叩く設定だよ。このAPIは次回以降で作っていくよ。それ以外の動作（ボタン長押しなど）は画面にログを出力するだけだよ。

```起動
$ bluebutton -d="Shutter3" -c ~/config/bluebutton
```
これで、リモートシャッターのボタンを押すとAPIにリクエストを投げるようになったよ。ボタン操作が認識されているか動作確認をしてみよう。

![Graphics Interchange Format（GIF）-2C5CA608C17A-1.gif](https://qiita-image-store.s3.amazonaws.com/0/160451/f64709e0-11db-7298-5698-ecc65bea0183.gif)

上の画像では、ラズパイにMacからログインしてbluebuttonの実行画面を表示させてるよ。10mくらい離れてもボタン操作を検知してくれたよ。
次回は、Node.jsをつかってLINEボットに投稿するAPIを開発、Now.shにデプロイし、IoTボタンを完成させるよ。

##追記
 - LINE Botに通知するための[続きの記事](https://qiita.com/vimyum/items/2226daa74444575811b5)を書いたよ。でも、あまりIoTボタンとは関係ないよ。。

 - ボタン操作が検知されたかどうかわかりづらいとのご指摘があるし、実際そのとおりだ。僕はラズパイにスピーカーを繋いで、ボタン操作検知時にラズパイに喋らせているよ。

```bash
$ npm install openjtalk
```

```js:speak.js
const OpenJTalk = require('openjtalk');
const mei = new OpenJTalk();
mei.talk('ボタンが押されたよ', 250);
```

```text:config/bluebutton
keyup=node ~/speak.js && curl -XPOST https://xxx.now.sh -d '{msg: "xx"}'
```