この記事や「おとうさんいまどこメーター」を作るを読んでcloudBitで簡単なIoTを作ってみたくなり、3ヶ月の息子の子守IoTシステムを作ってみたというお話。主に cloudBit の API を扱う方法を書いてます。
今回やってみたのは、「子どもが泣いたらスマホに通知を送る」「音が鳴るおもちゃを遠隔で動かせるようにする」の2つ。
cloudBitでできること
cloudBit の詳細については冒頭にも書いたこの記事やこの記事を読んでもらうとして、cloudBit でできることをざっくりまとめると次のようになります:
- センサなどの入力をIFTTTにつなぐ (例:閉めきってるはずの部屋で動きを検知したらメールを送る)
- モーターなどの出力をIFTTTにつなぐ (例:おとうさんの居場所にあわせてメーターを動かす)
- API を使ってモーターなどの出力を動かす (例:家の冷房スイッチを出先からオンオフする)
- Pub/sub API を使ってセンサなどの入力を別のサービスやプログラムと連携させる
IFTTT を使う場合、パチパチつないで Web ページから設定するだけで IoT できてしまいます。先人の作ったものを見てるとなかなか楽しそうで、おもちゃとは言え侮れない…
cloudBitの設定
cloudBit はほかの littleBits モジュールと違って、パチパチつなげたあとにクラウドの設定が必要です。設定も簡単で、WiFiが使えるところで cloudBit を電源につなぎ、そのあとにPCやスマホから http://control.littlebitscloud.cc/ にアクセスして書いてある通りに進むだけ。
ただし、cloudBit の状態は本体の LED でしかわからないので、ここでトラブルがあると何が起きているのかさっぱりわからずハマることも…
地味なはまりポイント:ネットワーク設定
どうも cloudBit は DHCP が配る DNS を認識してないようで、ルータと DNS が別アドレスだとうまく設定できないようです。この状態だと、一見設定がうまくいったように見えても、チュートリアルなどがなにも動きません。ルータと DHCP サーバが別の場合は要注意です。
cloudBitがサポートしているWiFiネットワークの設定は littleBitsのフォーラムにまとめられています。
地味なはまりポイント:LEDの色
もう1つ地味なはまりポイントとして、設定状態が cloudBit 本体の LED の色でわかるのですが、「設定中の黄色」と「設定完了の緑色」の違いがものすごくわかりにくいです。うまくいけばLEDの色は「紫 → 黄色 → 緑」と変化するのですが、 緑っぽい黄色は設定完了できてないのでご注意を。緑になった!と思っても「いや、これは黄色といえないこともないかも…」と思えたら多分できてません。
WiFi設定がうまくいってない場合、LEDは「緑っぽい黄色 → 緑っぽい黄色で点滅」を繰り返します。
cloudBit 本体に ssh とかできたら診断も楽なんですけどね…
cloudBitで子守システムを作る
モジュールの準備と接続
littleBits/cloudBit では必要なモジュールを個別に買い集めることができますが、今回使ったのは次の3つ。
なお、Cloud Starter Bundleを買うとこのへん全部入っています。
これを「USB電源 → Sound Trigger → cloudBit → Servo」の順にパチパチつないでマウンティングボードの上に固定しています。
あとは、
- 今回はおもちゃを振って鳴らせればいいので、Servoモーターのスイッチを
turn
(電圧にあわせて角度がかわる)ではなくswing
(電圧にあわせて揺れ方がかわる) に設定 - Servoモーターの腕に音が鳴るおもちゃを固定
- Sound Triggerからの入力を IFTTT でスマホの通知 (Notification) につなぐ
- APIを使っておもちゃのついたServoを動かせるように (詳細は後述)
- 子どもの泣き声が Sound Trigger で検知できるよう調整して、ベビーベッド近くにボードを設置
これで完成。
おもちゃを動かす部分は Sound Trigger に直接つなげてしまってもいいのですが、 子どもというのは一旦泣き出すとおもちゃを動かすくらいでは泣き止まないという理由で別系統に。。
APIでcloudBitにアクセスする
IFTTT で cloudBit を使う方法は「おとうさんいまどこメーター」を作るに詳しく出ているので、ここでは API を使う方法を簡単に説明します。ごくシンプルな REST API で、ドキュメントには curl コマンドを使った簡単な例も載っています。
まず、自分の cloudBit の「Device ID」と「Access Token」を調べます:
- http://control.littlebitscloud.cc/ を開いて、右下の SETTINGS をクリック
- 下の方の ADVANCED というところにある Device ID と AccessToken をメモしておきます
(Mac OS X なら) Terminal を開いて以下のコマンドを叩くと、設定・接続がちゃんとできていれば cloudBit のデバイス情報が取得できるはずです:
$ 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)を使ってこの API を叩いてみます:
// {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 でスタティックホストしてしまえば、 世界中からあなたのおうちのおもちゃを動かせてしまう危険な IoT の出来上がり!
その他の API
子守にはあまり役に立たないのですが、cloudBit にはセンサ入力を配布・購読するための簡単な Publisher / subscriber API があります。そちらも一応試すだけ試してみたので、そのメモはこちら
後日談
このようにして完成した子守 IoT ですが、設置して約2週間後に「おもちゃは手で振ったほうが早い」という現実的な理由で撤去されてしまいました(メリーの代わりにはなりますが、うちにはメリーは別にあるので)。cloudBit は現在では「株価に応じてメーターが動く」というまったくかわいげのない IoT に作り替えられています…
注意点・Disclaimer
- API に関する情報はすべて2014年9月時点、Version 2 のAPIを使った場合のものです
- モジュールはお子さんが飲み込むと危険です。乳幼児の手の届かないところに置きましょう
- 本気の子守には役に立ちません