自作ハードとMyThingsの連携について

myThings Advent Calendar 2015の21日を担当します、E&Iの山口です。
弊社はPicotとというAndroidスマートフォンを使った高齢者や子供向けの見守り装置と管理サービスを開発していますが、今回はこれをmyThingsに接続してみたいと思います。

![IMG_20150716_125931.jpg](https://qiita-image-store.s3.amazonaws.com/0/33661/831b117c-093a-579a-9607-6595ca32825b.jpeg)

当然この製品はまだ発売前なので、一般の方が入手することはできないのですが、自作のガジェットからmyThingsに接続する例として見てください。

##目次
- Picotの説明
- myThingsでやりたいこと
- myThings接続手順
- myThingsの通知要求（トリガー
- myThingsの通知受信（アクション）

##Picotの説明
まず、今回接続するPicotですがAndroidスマートフォンと自作基板（Arduino互換）をUSBで接続する構成となってます。
![picot.png](https://qiita-image-store.s3.amazonaws.com/0/33661/62f828ed-e744-6ae6-0e24-5e6d7ae4e7de.png)

自作基板には人感センサと温度センサとスイッチの入力、あと表示用のLED出力のIFがあります。これらを使ってmyThingsでできることを考えました。
まあ、クラウドでの処理部分は独自サーバーで既に実装済みなので、今回のmyThingsはそれらの補完で自社でまだ実装できていない部分を補完するのがよさげですね。
正直な話、IFFTとかmyThingsのサービスが出てきたとき、独自で実装していたクラウド側のサービスはある程度置き換えも出来るんじゃないかと思いました（今ままでの苦労が...)。前から非常に興味があったので、今回どこまで置き換えられるか試してみます。

それではまず、今回の装置（Picot)で使える情報を整理します。
**入力情報**
- 人感センサ　   （人の検知）　アプリ内で一定時間の未検出に対するトリガ発生
- 温度センサ	室温の検出
- ボタン		なんらかの通知を行いたいとき押す
- 照度センサ　   スマートフォンの機能
- 写真＋音声録音　スマートフォンの機能

**出力情報**
- LED（ボタンに内蔵）
- 音声読み上げ　スマートフォンの機能

他にベースがスマートフォンですから、パネルへの表示やタッチパネルも当然使えます。

これらをmyThingsの機能と連携していきます。

##myThingsでやりたいこと
流石にAdvent Calendarも終盤に差し掛かると同じようなことを先に解説している人もでてきているので、ある程度ネタがかぶらないようにしないようにしないとね :sweat_smile: 。
まず、基本のトリガーの使い方はこんな感じでしょうか。
・Picotボタン押し　⇒　プッシュ通知
・Picot温度　⇒　プッシュ通知

Picotは高齢者、子供向けの見守り装置ですが、myThingsの提供しているチャンネルの中ではFitBit、JAWBONEなどの健康管理機器との連携は有用そうです。
ということで、接続できるものはないかと机の上をゴソゴソ探していたらとりあえずFitBit、JAWBONE、SHINEが見つかりました！
![IMG_20151221_170801.jpg](https://qiita-image-store.s3.amazonaws.com/0/33661/a1401e3d-f7fb-ba7f-e7b3-3f75d6b89d26.jpeg)

FitBitからは歩行の未検出期間経過のトリガが出てきますので、これをPicotのシステムに取り込みます
・FitBit　歩行未検出トリガー　⇒　Picot取得

またJAWBONEでは寝たこと起きたことのトリガーも取得できるようなので、これも取り込んでみます
・JAWBONE　起床トリガー　⇒　Picot取得

これは高齢者のライフログとして取得して見守りに利用するためですね。これらのガジェットを自分で開発するのは大変なので、つなげることができるものは積極的に利用していきたいものです。

##myThings接続手順
myThingsの接続手順については、他の人が丁寧に説明してくれているので、手順どうりに設定していけば完了するはずです。（**完了するはずです** ）

[myThingsをはじめよう - Part5: 「天気・災害」のトリガーを「IDCF」のアクションがHTTPで受信する](http://qiita.com/masato/items/e7edac534d9aa95d8fb8)
[【写真で解説】自作デバイス（ESP8266）をmyThingsにつなぐまで！](http://qiita.com/wamisnet/items/50ea5dbb4ec634154e3e)

一通り設定が終わればIDCFサーバーに５つのトリガーとアクションが登録されますので、これを使って装置との連携を行います。トリガとアクションのUUID、とトークンは接続時の情報で使用しますので忘れずに記録しておいてください。

##myThingsの通知要求（トリガー）
まず基本の自作装置からトリガーを発行する例です。
IDCFチャンネルサーバー上で動作しているMeshbluにメッセージを送り、IDCFチャンネル経由でmyThingsにトリガーがかかります。
Picotのボタン押したらプッシュ通知が出るようにしたいので、Androidアプリのプログラムのボタン押下リスナ内で、myThingsのトリガー要求を出します。最近のIoT系の通信はMQTTが主流のようですが、PicotのサーバーがMQTT対応でなくREST APIで動作していたためとりあえず、REST APIで実装してみます。もちろんMQTTもJavaのライブラリを使えば簡単にAndroidから送信することができますよ。

REST API
　POST http://{IDCFのIPアドレス}/data/{トリガのUUID}
　パラメーター（認証情報）
　meshblu_auth_uuid={trigger-1のUUID}
　meshblu_auth_token={trigger-1のTOKEN}

実際にコールしている部分のAndroidコードはこんな感じ~~（http.doPostはAndroidのPOST通信を実装した独自クラスの関数です）~~
（追記 2015.12.22) MeshbluへのPOSTの方法を勘違いしてました。headerに認証用のuuid、tokenを入れなければなりませんでした :sweat_smile: 

```
// HTTP POST
    	HttpPost httpPost = new HttpPost("(サーバーのIPアドレス)/data/(トリガー１のuuid)");
    	// パラメータを設定
    	try {
		//ヘッダーに認証情報追加
		httpPost.setHeader("meshblu_auth_uuid", "トリガー１のuuid");
    		httpPost.setHeader("meshblu_auth_token", "トリガー１のtoken");
	    	
	    	DefaultHttpClient client = new DefaultHttpClient();
	    	HttpResponse httpResponse;
			httpResponse = client.execute(httpPost);
	    	// ステータスコードを取得
	    	int statusCode = httpResponse.getStatusLine().getStatusCode();
	    	// レスポンスを取得
	    	HttpEntity entity = httpResponse.getEntity();
	    	sRet = EntityUtils.toString(entity);
	    	// リソースを解放
	    	entity.consumeContent();
	    	// クライアントを終了
	    	client.getConnectionManager().shutdown();
	    	// 

		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
```
自作基板でArduinoやmbed,PICでも同じようにHTTPのPOSTでOKです。

実際にmyThingsでこのトリガーを使うためにはAndroidまたはiPhoneのアプリでトリガーとアクションを定義します。
トリガー　⇒IDCF 割り当てるトリガー　trigger1
アクション　⇒プッシュ通知

設定が終了したら動作確認をしてみます。ボタンを押したらプッシュ通知が届けばOKです。
myThingsは15分周期でトリガー情報を見に行っているので、最大15分の遅延で通知が届くはずです。
それまで待てないせっかちな人は、myThingsアプリで手動更新を実行しましょう。

~~と、ここまで書いてなんですがAndroidからのPOSTが"no token provided"になってしまいましたorz。
IDCFサーバーからcurlで直接ポストした時には、ちゃんとメッセージが飛んできたのでサーバー側の設定は問題無いみたいですが。~~
```
curl -X POST -d "" http://（サーバーIPアドレス）/data/(トリガー１のuuid) --header "meshblu_auth_uuid: {トリガー１のuuid}" --header "meshblu_auth_token: {トリガー１のtoken}"
```

~~仕方ないのでAndroidからMQTT実装して再度試してみます。まあ、アクションの実装にはプッシュで通知が受け取れるMQTTが向いているので、MQTTでの実装が正解ですかね。この作業は今日(21日)中に終了しそうにないので、確認でき次第追記します。~~
これで、ボタンを押した時の通知をプッシュ通信でできるようになりました。同じように、他のアクションに温度センサーの上限通知、人感センサの一定時間未検出警告のトリガーを割り当てることにします。



##myThingsを使った感想など##
前からmyThingsは興味があって自社システムとの連携をやりたいと思っていつつも色々ドタバタしてできずじまいになってました。今回Advent Calendarの話があったので、流石にちゃんとやらないとということでいろいろmyThingsを触ってみました。
正直な感想としては、こういったサービス自体を連携でき、かつ自作のアプリまでも対応できるサービスは大変便利だということがわかりました。同じようなサービスでIFTTTが既にありますが、そういえばこれの比較記事もまとめてありました。
[myThingsとIFTTTの比較から考えるDIY文化とメーカームーブメント](http://bohemia.hatenablog.com/entry/2015/12/09/222230)
現状ではスタート時期が早いIFTTTの方が連携できるサービス、装置が多いので使いやすいのは事実です。が、日本初のサービスのメリットを活かして、日本人向けのサービスとの連携とかが増えてくればさらに使いやすくなりそうなので今後に期待です。

自作の装置を簡単に他の装置、サービスと連携するのには大変便利ですが、自社のサービスの保管的な意味で未対応な連携の部分をmyThingsを使うというものいいなと思いました。

ということで、中途半端な記事ですいませんでしたー（後でちゃんとMQTTのところ更新かけます）。