cloudBitのAPIを使って子守りIoTを作る


[この記事](http://www.gizmodo.jp/2014/07/littlebitsdiy.html)や[「おとうさんいまどこメーター」を作る](http://qiita.com/kazunori279/items/7dbbb525ab0cf6d5d9b5)を読んで[cloudBit](http://littlebits.cc/cloud)で簡単なIoTを作ってみたくなり、3ヶ月の息子の子守IoTシステムを作ってみたというお話。主に cloudBit の API を扱う方法を書いてます。

![IMG_20140921_132230.jpg](https://qiita-image-store.s3.amazonaws.com/0/2758/d38f7f0e-ff27-a49a-9896-e90a67896b6b.jpeg "IMG_20140921_132230.jpg")

今回やってみたのは、「子どもが泣いたらスマホに通知を送る」「音が鳴るおもちゃを遠隔で動かせるようにする」の2つ。

# cloudBitでできること

cloudBit の詳細については冒頭にも書いた[この記事](http://www.gizmodo.jp/2014/07/littlebitsdiy.html)や[この記事](http://qiita.com/kazunori279/items/7dbbb525ab0cf6d5d9b5)を読んでもらうとして、cloudBit でできることをざっくりまとめると次のようになります：

* センサなどの入力を[IFTTT](http://ifttt.com/)につなぐ (例:閉めきってるはずの部屋で動きを検知したらメールを送る)
* モーターなどの出力を[IFTTT](http://ifttt.com/)につなぐ (例:おとうさんの居場所にあわせてメーターを動かす)
* API を使ってモーターなどの出力を動かす (例:家の冷房スイッチを出先からオンオフする)
* Pub/sub API を使ってセンサなどの入力を別のサービスやプログラムと連携させる

IFTTT を使う場合、パチパチつないで Web ページから設定するだけで IoT できてしまいます。[先人の作ったものを見てると](http://littlebits.cc/projects/cloud#results)なかなか楽しそうで、おもちゃとは言え侮れない…

# cloudBitの設定

cloudBit はほかの littleBits モジュールと違って、パチパチつなげたあとにクラウドの設定が必要です。設定も簡単で、WiFiが使えるところで cloudBit を電源につなぎ、そのあとにPCやスマホから http://control.littlebitscloud.cc/ にアクセスして書いてある通りに進むだけ。

ただし、cloudBit の状態は本体の LED でしかわからないので、ここでトラブルがあると何が起きているのかさっぱりわからずハマることも…

## 地味なはまりポイント：ネットワーク設定

どうも cloudBit は DHCP が配る DNS を認識してないようで、ルータと DNS が別アドレスだとうまく設定できないようです。この状態だと、一見設定がうまくいったように見えても、チュートリアルなどがなにも動きません。ルータと DHCP サーバが別の場合は要注意です。

cloudBitがサポートしているWiFiネットワークの設定は [littleBitsのフォーラム](http://discuss.littlebits.cc/t/what-wifi-network-setups-are-supported/1192)にまとめられています。

## 地味なはまりポイント：LEDの色

もう１つ地味なはまりポイントとして、設定状態が cloudBit 本体の LED の色でわかるのですが、「設定中の黄色」と「設定完了の緑色」の違いがものすごくわかりにくいです。うまくいけばLEDの色は「紫 → 黄色 → 緑」と変化するのですが、 **緑っぽい黄色は設定完了できてない**のでご注意を。緑になった！と思っても「いや、これは黄色といえないこともないかも…」と思えたら多分できてません。

WiFi設定がうまくいってない場合、LEDは「緑っぽい黄色 → 緑っぽい黄色で点滅」を繰り返します。

cloudBit 本体に ssh とかできたら診断も楽なんですけどね…


# cloudBitで子守システムを作る

## モジュールの準備と接続

littleBits/cloudBit では必要な[モジュールを個別に買い集める](http://littlebits.cc/bits)ことができますが、今回使ったのは次の3つ。

* [cloudBit (USB電源つき)](http://littlebits.cc/bits/cloudbit)
* [Sound Trigger (音センサ)](http://littlebits.cc/bits/sound-trigger)
* [Servoモーター](http://littlebits.cc/bits/servo)

なお、[Cloud Starter Bundle](http://littlebits.cc/bundles/cloud-starter-bundle)を買うとこのへん全部入っています。

これを「USB電源 → Sound Trigger → cloudBit → Servo」の順にパチパチつないで[マウンティングボード](http://littlebits.cc/accessories/mounting-board)の上に固定しています。

![IMG_20141004_133804.jpg](https://qiita-image-store.s3.amazonaws.com/0/2758/469d7188-b095-f6a4-4b1d-c523c2463409.jpeg "IMG_20141004_133804.jpg")


あとは、

1. 今回はおもちゃを振って鳴らせればいいので、Servoモーターのスイッチを `turn` (電圧にあわせて角度がかわる)ではなく `swing` (電圧にあわせて揺れ方がかわる) に設定
1. Servoモーターの腕に音が鳴るおもちゃを固定
1. Sound Triggerからの入力を IFTTT でスマホの通知 (Notification) につなぐ
1. APIを使っておもちゃのついたServoを動かせるように (詳細は後述)
1. 子どもの泣き声が Sound Trigger で検知できるよう調整して、ベビーベッド近くにボードを設置

これで完成。

おもちゃを動かす部分は Sound Trigger に直接つなげてしまってもいいのですが、 **子どもというのは一旦泣き出すとおもちゃを動かすくらいでは泣き止まない**という理由で別系統に。。


## APIでcloudBitにアクセスする

IFTTT で cloudBit を使う方法は[「おとうさんいまどこメーター」を作る](http://qiita.com/kazunori279/items/7dbbb525ab0cf6d5d9b5)に詳しく出ているので、ここでは API を使う方法を簡単に説明します。ごくシンプルな REST API で、[ドキュメント](http://developer.littlebitscloud.cc/api-http)には curl コマンドを使った簡単な例も載っています。

まず、自分の cloudBit の「Device ID」と「Access Token」を調べます：

1. http://control.littlebitscloud.cc/ を開いて、右下の SETTINGS をクリック
1. 下の方の ADVANCED というところにある **Device ID** と **AccessToken** をメモしておきます


(Mac OS X なら) Terminal を開いて以下のコマンドを叩くと、設定・接続がちゃんとできていれば cloudBit のデバイス情報が取得できるはずです:

```bash:Terminal
$ curl -i -XGET \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Accept: application/vnd.littlebits.v2+json" \
  https://api-http.littlebitscloud.cc/devices/YOUR_DEVICE_ID
```

`YOUR_ACCESS_TOKEN` と `YOUR_DEVICE_ID` のところは 2. でメモした AccessToken と Device ID の文字列で置き換えて下さい。

Windows の人は http://www.hurl.it/ のような任意の HTTP request を発行できるサイトを使って試してみるといいかも。

## cloudBitを制御するWebアプリを作る

https://api-http.littlebitscloud.cc/devices/YOUR_DEVICE_ID/output という URL に POST すると、出力モジュールに流す電圧をクラウドから制御することができます。

この URL はどこからでもクロスドメインアクセスできるようなので、ここでは手っ取り早く[XHR (XMLHttpRequest)](http://www.w3.org/TR/XMLHttpRequest2/)を使ってこの API を叩いてみます：

```javascript:cloudbit.js
  // {deviceID, accessToken} で指定されるデバイスに
  // value パーセントの値を duration ミリ秒出力する。
  function outputToCloudBit(deviceID, accessToken, value, duration) {
    var xhr = new XMLHttpRequest();
    xhr.open(
        'POST',
        'https://api-http.littlebitscloud.cc/devices/' + deviceID +'/output',
        true);
    xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
    xhr.setRequestHeader('Accept', 'application/vnd.littlebits.v2+json');
    // Content-Type がないと 415 Unsupported Media Type
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4)
        console.log(xhr.responseText);
    }
    // JSON stringify じゃないと 400 Bad Request
    var params = JSON.stringify({percent: value, duration_ms: duration});
    xhr.send(params);
  }

```

`value` は電圧強度を示すパーセントで、0 から 100 の範囲をとります。`duration` は出力する長さをミリ秒で指定します。出力しっぱなしにするには -1 を指定します。

あとは HTML で適当な UI をつけて上記のコードが呼ばれるようにして、例えば Dropbox や [Google Drive でスタティックホスト](http://nanapi.jp/74641/)してしまえば、 **世界中からあなたのおうちのおもちゃを動かせてしまう危険な IoT** の出来上がり！

## その他の API

子守にはあまり役に立たないのですが、cloudBit にはセンサ入力を配布・購読するための簡単な Publisher / subscriber API があります。そちらも一応試すだけ試してみたので、そのメモは[こちら](http://qiita.com/kinu/items/f9d7c056b079f820db22)

# 後日談

このようにして完成した子守 IoT ですが、設置して約2週間後に「おもちゃは手で振ったほうが早い」という現実的な理由で撤去されてしまいました(メリーの代わりにはなりますが、うちにはメリーは別にあるので)。cloudBit は現在では「株価に応じてメーターが動く」というまったくかわいげのない IoT に作り替えられています…

![IMG_20141005_225451.jpg](https://qiita-image-store.s3.amazonaws.com/0/2758/cf83c8ce-56d9-510e-1422-c59a02c14b3b.jpeg "IMG_20141005_225451.jpg")


# 注意点・Disclaimer

* API に関する情報はすべて2014年9月時点、Version 2 のAPIを使った場合のものです
* モジュールはお子さんが飲み込むと危険です。乳幼児の手の届かないところに置きましょう
* 本気の子守には役に立ちません