sensmon couchdb
Post on 14-Jul-2015
2.493 Views
Preview:
TRANSCRIPT
自己紹介
• @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日日曜日
家にサーバを置くか。まして、データベースサーバなんてマニアックすぎる
• いいえ、Relaxしましょう。
• CouchDBなら。構築なんていらない。
• 置いて起動する、ただそれだけ。
リラックス
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日日曜日
データを持ちだす replication
• 0.11から1.X系へのレプリケーションには注意すべし
• Bad Content-Typeがでる
• 1.X のFutonなり_replicationを使って、0.11をsourceとしてレプリカするべし
アニメーションが終わらない。
2010年12月12日日曜日
まとめ
• 何ができるようになったのですか?
• 一人、オール電化(未来の予定)
• relaxとは結局なにですか?
• ストレス無くdbつめこみからwebアプリまでできる (でもやっぱり大規模になりすぎると、それなりのdelay)
2010年12月12日日曜日
top related