鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

210円のセンサー+さくらIotで冷蔵庫の開閉回数及び扉が開いていた時間をカウントする

f:id:kechiya:20170121210838j:plain

開閉は状態遷移を使った

6軸ジャイロセンサーArduinoに接続して、測定する。ジャイロyの値をとると
なんか上手くいけそうだったので以下、状態遷移を使いながら測定することにした。

閉まっている状態

ジャイロyが50以上の数値だったら、開いている状態へ遷移。開けた時刻を保存。

あいている状態

ジャイロyが-30以下の数値だったら、閉まっている状態へ遷移。
現在時刻-開けた時刻を空いていた時間として加算
開閉カウントを1加算。

さくらIotへデータを飛ばす

1分ごとに、集計値をさくらIotへ飛ばす。さくらでデータを3回位受け取った後、取れなくなってしまう。
もう少しの所まで来ているので原因を調べなくては・・・
やっぱ乾電池駆動はいけないのかな?

Websocketを作り直したら動き出した

超頻繁にやり取りしたので制限がかかっていたのか。WebSocketを作り直したら、飛ばし続けるようになりました。
あとは、電池駆動はやめてACアダプターから電源を取るようにしました。

Ambientグラフ化もできた

f:id:kechiya:20170128205611p:plain

見える化、結構楽しいですね。

金曜日の朝のNHKニュースは中小製造業の工場の見える化
自動車部品メーカーで初期コスト数百万円で部品の製造時間を見えるようにして
ネックと成っている機械を特定したという話でした。
どんな、Iotシステムを使っているんだろうか?
Node-REDなのかな。

Arduinoで1秒ごとに冷蔵庫の開け閉めをカウントして、1分ごとにデータを飛ばしたい。

1秒ごとに、集計して、1分ごとに飛ばす方法。
Arduinoにつないだセンサからの値をパソコンで記録する(1) | Ukkari blog

上記を参考に、以下のようなプログラムをしてみた。
チャンネル0に1分間の開け閉めカウントを入れてさくら通信モジュールでデータを飛ばす。

  if (acc_angle_x > 100 ){ //センサーの値を検知して開けたらフラグを立てる。要調整
    openFlg = 1;
  }
  if (nextTime < millis()) {
     nextTime = nextTime + 1000;  // Set Next analyze time
     if (openFlg == 1){
       openCount++;
       openFlg = 0;
     }
  }
  if (sakuraTime < millis()) {
    sakuraTime = nextTime + 60000;  // Set Next send time
    sakuraio.enqueueTx(0,openCount);
    sakuraio.send();
    openCount = 0;   
  }


さくらで飛ばしたデータをWebSocketでつながったBluemix上のNode-REDで受ける。
それをAmbientへ飛ばす。

f:id:kechiya:20170118075959p:plain

functionの中身

var payload = msg.payload.payload;

var data = {
    "d1" : payload.channels[0].value
};
msg.payload = data;
return msg;

これで、うまくいけば表示できるはず。

都度都度データを送ってNode-REDでデータを蓄えずに、Arduinoで蓄える。

Ambientへデータを送って、解析する方法で行こうと考えたけれど、
よくよく考えたらArduinoである程度解析し、その結果をNode-REDで受けて
Ambientへ渡すのが効率的ということに気づいた。
これならNode-REDで蓄えておく必要もなくなる。

以下は、6軸ジェイセンサーの値を100msecごとにとったグラフを
ArduinoIDEのシリアルプロッタで表示。
f:id:kechiya:20170117211623p:plain

例えば、冷蔵庫の開け閉めを適当に閾値を設けて検出。
60秒間の開け閉め回数をSakuraIotで飛ばして、Ambientで可視化すればいいのかな。

Ambientは5秒ごとで受け取るのでNode-REDでデータを蓄えておくりたい

Ambientは5秒間隔以上でないとデータを受け付けない。
よってNode-REDから1秒毎にデータを送っても間引かれてしまうことになる。
そのため、Node-REDで値を溜め込んで、5秒以上の間隔で溜め込んだデータを
まとめて送る必要がある。

まとめて送る方法、データのフォーマットは以下から

https://ambidata.io/blog/2016/06/13/bulk_send/

Node-REDのflowへ配列でデータを蓄えておく。

Node-REDでデータを蓄える方法は
context,flow,globalというところがあって、
qiita.com
場面場面、適切に使わないといけません。

さくらIot+Bluemix(Node-RED)+Ambientでグラフを描写するまで

http://sssslide.com/www.slideshare.net/sakura_pr/iot-platform-20161201

Node-REDアプリの作成

BlueMixへログイン、カタログからNode-REDスターターで
アプリ名を入力して、作成ボタンを押す
起動されるので
あとはhttpでアクセスするだけ。簡単ですね。

Node-RED エディタ

WebSocketをドラッグ&ドロップする
PathへさくらのIotのWebSocketのパスを入力
f:id:kechiya:20161224081720p:plain
とりあえず、WebSocketノードとデバッグノードをGUIでつなぎこむだけでNode-RED上で値の取得が確認できた。

次はグラフ化してみましょう

グラフ表示する外部サービスAmbientへ登録
https://ambidata.io

BlueMixからAmbientノードを作るために

qiita.com

Ambientで表示するためには

Ambientで描写するためには、チャンネルの値をd1,d2…と言う値に変えて
あげる必要がある。ここはNode-Redでのコーディングが必要になります。

さくらのデータからAmbientノード用のJSONへ変換するときに

JSONが文字列なので、そのままでは値が取り出せません。オブジェクトに変換する必要ありはまりました。
qiita.com

JSONノードの後段にfunctionノードを配置して以下のように変換関数を
コーディングしてみました。

var payload = msg.payload.payload;

var data = {
    "d1" : payload.channels[0].value,
    "d2" : payload.channels[1].value,
    "d3" : payload.channels[2].value
};
msg.payload = data;
return msg;

ジャジャジャーン。表示できました。

f:id:kechiya:20161224162329p:plain

JSONノード、Functionノードをつなげるだけで、ほぼコーディングレスでグラフ化までできることが証明されたのでありました。
以下のような感じ。

f:id:kechiya:20161224163840p:plain

あとは、本物のセンサーが届くのを待つのみ!!

さくらの聖夜2016に参加

働きがい

働きがいかぁ。自分の会社だとチャレンジする人が
あまりいない感じ。社長もいつていましたがこれは
会社から与えられないもの。社員が作り出していくもの。

働きやすさ

さくら昇給3年で2割という数字に愕然。自分は10数年で
月額2千円。極貧生活。よく辞めずにいると思う。

うまいプレゼン

うまいなプレゼン。早口ではなく落ち着いた語り口。
やつぱりすごい。

コストカツトから売上拡大へ

やっぱ新規事業ですよね。

そんな感じで刺激をもらいました。
ボツチで懇親はあんまりできず。