Sensmon couchdb

21
センサーデータストアとしてのCouchDB ~そうだ、Couchに入れよう。~ @motokazu 20101212日日曜日

Transcript of Sensmon couchdb

センサーデータストアとしてのCouchDB

~そうだ、Couchに入れよう。~

@motokazu

2010年12月12日日曜日

自己紹介

• @motokazu ( Motokazu Nishimura )

• CouchDBとの出会い

• 2年前ぐらいに出会う

• “relax”というフレーズに感銘をうける

• javascriptの世界、JSON

• その一方で、、フィジカルコンピューティング&センサーで遊び始めた

• 主にArduinoを使ってセンシング

• 家の中を効率化することが目標

2010年12月12日日曜日

本日の言いたいことはこちら。

• こんな人を対象

• とにかくデータを溜め込んで表示したい

• ただのDBではない、アプリも動く

• ドキュメント指向、mapreduce、、と悩む前に、CouchAppの使い方を覚える

• データをHTTPでやり取りしたいしか送れないならぜひ

• relaxってなに?という人

2010年12月12日日曜日

家の中をモニタリングブーム

• 生活と光熱費は、切っても切れない関係

• それならきっちり管理したい!

• 選択肢を考えてみる

• オール電化! 家を総合的に改装

• 何か計測装置を導入してモニタリング (Google PowerMater) SSL+XML

• 自分でセンサー仕込みモニタリング

2010年12月12日日曜日

ちなみに、おいくら?• オール電化 ※そもそも、借家では改造不可能

• 装置:家 :数百万~数千万

• モニタリング:テレビ

• 部分的に装置

• 装置:Google PowerMaterに繋がる電力メーターなど (日本では使えない。 数万) http://www.google.com/powermeter/about/partners.html

• モニタリング:Google PowerMater など

• 作る

• 装置: Arduino + ethernet shield + センサー  :数千円

• モニタリング: CouchDB !! (+ Couchapp)

2010年12月12日日曜日

本日のお話のスケッチ

2010年12月12日日曜日

家にサーバを置くか。まして、データベースサーバなんてマニアックすぎる

• いいえ、Relaxしましょう。

• CouchDBなら。構築なんていらない。

• 置いて起動する、ただそれだけ。

リラックス

2010年12月12日日曜日

ホームサーバSheevaplug

ACアダプタサイズのサーバARM core 1.2GHzMem: 512MB

...

※画像ははめ込みです。

SDカード差し込む

2010年12月12日日曜日

センサーデータの取得 : Arduino + センサー

• Arduinoとは

• 最近流行のナイスなマイコンボード

• ハードが苦手でもソフトウェアな気分で扱える

• 簡単にAD変換してくれる

• 0v~5vの入力を 0~1023のデジタル数値へ変換 analogReadで読む

• C言語

• Pinに繋ぐだけArduino

2010年12月12日日曜日

センサーを繋いでからCouchDBに送るまでの流れ

• センサーのVout(電圧出力)をanalog 2pinに繋ぐ

• analogReadで読み込んで、デジタルにマップ

• sprintf で jsonを作る

• strlenで content-lengthを取得

• CoucnDBにhttpで接続してjsonをPOST

sprintf(json,"{%cstime%c: %ld, %csolarpower%c: %0d.%d, %ctemperature%c: %d}", q,q,now(), q,q,(int)solarpower,solarpower1, q,q,temperature);

int solarValue = analogRead(solarPin);

sprintf(clength,"Content-Length: %d",strlen(json));

2010年12月12日日曜日

参考:送信するところ Client client(server, 5984); // connect couchdb Serial.println("connecting couchdb..."); if(client.connect()){ Serial.println("connected"); client.println("POST /sensmon HTTP/1.1"); client.println("Host: sheevabian"); client.println("Authorization: Basic xxx="); client.println("Content-Type: application/json"); sprintf(clength,"Content-Length: %d",strlen(json)); client.println(clength); client.println("Connection: Close"); client.println(); client.print(json); Serial.println("POST OK"); } else { Serial.println("connection failed"); return false; } client.stop();

2010年12月12日日曜日

CouchDBにセンサーデータを溜め込む

• センサーといえば {key:時間 , value: センシング情報}

• DBを作成 curl -X PUT http://localhost:5984/sensmon (といいながら、実際はcouchapp pushで作る)

• とにかく溜め込み、viewで扱う

{"_id":"676a376bc707cd7da0cb2c78050044c4","_rev":"1-a92b94af015ef8b1bed2df56f7e037c8","stime":1291595210,"solarpower":0.63,"temperature":22}}

2010年12月12日日曜日

センサーデータをどうやって表示するか

• データは溜め込んだ

• アプリを書く. Couchappを使うhttps://github.com/couchapp/couchapp

• couchapp generate sensmon

• ...

• couchapp push !!

2010年12月12日日曜日

sensmon のイメージ

• センサーデータをグラフとして表示する

• 日ごとのセンサーデータサマリーを表示する

sensmon sensmon-calendar

https://github.com/motokazu/sensmon

2010年12月12日日曜日

sensmon

• グラフの表示に Flotライブラリを利用  http://code.google.com/p/flot/

• とにかくデータをすべて取得 (_view/all )Flotに渡す<script src="/_utils/script/jquery.js?1.3.1"></script>...$.ajax({ type: 'GET', dataType: 'json', url: "/sensmon/_design/sensmon/_view/all", success: function(data){ $.each(data.rows, function(id, val){ // temperature var tmp = [val.value.stime, val.value.temperature]; tempd.push(tmp);

}...datasets.push({"label":"Temperature",data:tempd, yaxis: 1 });...var plot = $.plot($("#placeholder"), datasets , options);

}

2010年12月12日日曜日

sensmon-calendar

• mapreduce + group=true

$.ajax({ type: 'GET', dataType: 'json', url: "/sensmon/_design/sensmon-calendar/_view/summary_temp_day?group=true",

var key = [d.getFullYear(),(d.getMonth()+1),d.getDate()]; emit(key, doc.solarpower);

{"count":count,"max":max,"min":min,"ave":ave}

map

reduce{"count":count,"max":max,"min":min,"ave":ave}{"count":count,"max":max,"min":min,"ave":ave}{"count":count,"max":max,"min":min,"ave":ave}{"count":count,"max":max,"min":min,"ave":ave}{"count":count,"max":max,"min":min,"ave":ave}{"count":count,"max":max,"min":min,"ave":ave}{"count":count,"max":max,"min":min,"ave":ave}

rereduce{"count":count,"max":max,"min":min,"ave":ave}{"count":count,"max":max,"min":min,"ave":ave}{"count":count,"max":max,"min":min,"ave":ave}

values.forEach(function(val){ max = Math.max(max,val.max); min = Math.min(min,val.min); ave += val.ave; count += val.count; }); ave = ave/values.length; return {"count":count,"max":max,"min":min,"ave":ave};

2010年12月12日日曜日

sensmon demo

• demo : to localhost

2010年12月12日日曜日

データを持ちだす replication

• 0.11から1.X系へのレプリケーションには注意すべし

• Bad Content-Typeがでる

• 1.X のFutonなり_replicationを使って、0.11をsourceとしてレプリカするべし

アニメーションが終わらない。

2010年12月12日日曜日

次はここ!

2010年12月12日日曜日

まとめ

• 何ができるようになったのですか?

• 一人、オール電化(未来の予定)

• relaxとは結局なにですか?

• ストレス無くdbつめこみからwebアプリまでできる (でもやっぱり大規模になりすぎると、それなりのdelay)

2010年12月12日日曜日

thank you

2010年12月12日日曜日