netatmo Weather Stationのデータをajaxで取得する

# 追加 2015/8/14

2週間ほど使用した結果、これ以外に持っている熱中症計や温湿度計との差が気になり、室外モジュールを室内モジュールのそばに並べて運用してみた。
![Screenshot_20150804-213207.png](https://qiita-image-store.s3.amazonaws.com/0/78540/d61a5700-ed67-b414-76da-e2df37ed9701.png)
温度で0.8℃程度違っていたため、初期不良として交換してもらった。

交換した結果が以下。(同じ所で並べて測定)
![Screenshot_20150814-101947.png](https://qiita-image-store.s3.amazonaws.com/0/78540/aa8e9fcb-dd6d-09e8-9132-e0138210b2ab.png)
差は少し縮まった程度。精度に関してはあまり期待しないほうがいいかも。

# 追加2 2015/8/14

最後に書いた過去履歴の取得は、[](https://my.netatmo.com/app/station)のデバイス設定画面からxls/csvで範囲などをダウンロード可能だった。
![settings_down.png](https://qiita-image-store.s3.amazonaws.com/0/78540/fc9cbb9b-1b90-465b-c337-d1b942b8064b.png)

***

# netatmo Weather Stationとは

簡単に言うと､パーソナルアメダス｡

詳しくは以下参照｡
[室内＆屋外の気温・湿度・CO2等を計測して詳細な天気情報を出してくれる「netatmo ウェザーステーション＆雨量計」レビュー](http://gigazine.net/news/20140829-netatmo/)
[netatmo Weather Station](https://www.netatmo.com/ja-JP/product/weather-station)
[netatmo Weather map](https://www.netatmo.com/weathermap/bounds/35.82574328675878/140.19958242578127/35.47143168904108/139.32067617578127)

# きっかけ
ヨドバシのポイントで買ったはいいが､嫁のIS01でDashboardが重くて表示できなかったため｡
[Dashboard](https://my.netatmo.com/app/station)は以下のような感じで､見やすい｡
![dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/78540/dc3d1861-c5c3-cd17-f407-ca9557dcf4de.png)

(といいつつIS01で表示できるかどうかは未確認)

# 参考資料
[Netatmo ウェザーステーションを買ってみたので Node.js でいじってみた](http://tips.hecomi.com/entry/2014/04/14/211252)


# 事前準備
## netatmo Weather Stationを購入
私は[ヨドバシ・ドット・コム](http://www.yodobashi.com/netatmo-%E3%83%8D%E3%82%BF%E3%83%88%E3%83%A2-NET-OT-000007c-netatmo-welcome-%E9%A1%94%E8%AA%8D%E8%AD%98%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%A4%E3%81%8D%E3%83%9B%E3%83%BC%E3%83%A0%E3%82%AB%E3%83%A1%E3%83%A9/pd/100000001002765537/)で購入｡(仙台から東京に翌日に到着した｡さすがヨドバシ)

## 初期設定する
[室内＆屋外の気温・湿度・CO2等を計測して詳細な天気情報を出してくれる「netatmo ウェザーステーション＆雨量計」レビュー](http://gigazine.net/news/20140829-netatmo/)のとおり｡

ただ､室外モジュールの電池の入れ方に注意｡(ネジを外すとは思わなかったので､10分ほど格闘してしまった^^;)
室外モジュールの緑点滅がわかりにくく､かつ認識に少し時間がかかったので､電池を入れたらアプリで認識するまでほっとくのが吉かも｡

## APIキー/Secretキーの取得
APIキー/Secretキーの取得は
[Netatmo ウェザーステーションを買ってみたので Node.js でいじってみた](http://tips.hecomi.com/entry/2014/04/14/211252)
を参考に｡

# コード
あとはHTMLからjQueryのajaxを使って､アクセスするのみ｡
(なんで､IDキーとSecretキーだけでアクセスできないんだろう?AWSなんかはできた気がするけど)
なお､以下のコードでは､0番目のStationとそのステーションに登録された0番目のModuleのデータを表示している｡

```index.html
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja">
 <head>
  <meta meta content="text/html" charset="UTF-8">	
  <title>netatmo</title>
  <script src="jquery-1.11.3.min.js"></script>
  <script>
  var Netatmo = {
    login: function() {
        var defer = $.Deferred();
        $.ajax({
            url: "https://api.netatmo.net/oauth2/token",
			cache: false,
			method:"POST",
			type:"jsonp",
			data: {
					"grant_type": "password",
					"client_id":"取得したCLIENT_ID",
					"client_secret":"取得したSECRET KEY",
					"username":"メールアドレス",
					"password":"パスワード",
					"scope":"read_station"
        		},
            success: defer.resolve,
            error: defer.reject
        });
        return defer.promise();
    }
	,getUser: function(token) {
        var defer = $.Deferred();
        $.ajax({
            url: "https://api.netatmo.net/api/getuser",
			cache: false,
			method:"POST",
			type:"jsonp",
			data: {
					"access_token": token
        		},
            success: defer.resolve,
            error: defer.reject
			
        });
        return defer.promise();
    }
	,devicelist: function(token) {
        var defer = $.Deferred();
        $.ajax({
            url: "https://api.netatmo.net/api/devicelist",
			cache: false,
			method:"POST",
			type:"jsonp",
			data: {
					"access_token": token
        		},
            success: defer.resolve,
            error: defer.reject
        });
        return defer.promise();
    }
  }; 

  Netatmo.login().done(function(data) {
		var token = data.access_token;
		Netatmo.getUser(data.access_token).done(function(data) {
			console.log(data.body.devices[0]);
			Netatmo.devicelist(token).done(function(data) {
				var station = data.body.devices[0];
				$("#station").text(
					station.module_name + ":" + 
					station.dashboard_data.Temperature + "℃ " + 
					station.dashboard_data.Humidity + "% " + 
					station.dashboard_data.AbsolutePressure + "hPa " + 
					station.dashboard_data.Noise + "dB " + 
					station.dashboard_data.CO2 + "ppm ");
				var module= data.body.modules[0];
				$("#module").text(module.module_name + ":" + module.dashboard_data.Temperature +  "℃ " + module.dashboard_data.Humidity + "%");
			});
		});
    });

 </script>
 </head>
 <body>
 <div id="station"></div>
 <div id="module"></div>
 </body>
</html>
```

# 番外編
netatmoはIFTTTのChannel
![ifttt.png](https://qiita-image-store.s3.amazonaws.com/0/78540/dd595a36-de62-144e-4720-b103802fc048.png)
があり､温度が上がったらメールを出すみたいなことが､コードを書かずにでき､便利｡

残念ながら､netatmoサーバ蓄積型なのでサービスがいつまで継続するかちょっと心配といえば心配(EyeFiの例もあるし｡)


[仏のネタトモ社　スマホ送信の顔認証家庭用防犯カメラ　３万円で販売](http://n-seikei.jp/2015/07/post-30563.html)が最近ニュースになったけど"netatmo"で｢ネタトモ｣と読ませるのか､微妙だ^^;

# 追加編
## Weather Stationでgetmeasure APIを使用して過去履歴を取得する際に少しハマったのでメモ

基本的には上記のコードの延長線上で､引数を設定して```https://api.netatmo.net/api/getmeasure```をコールすれば問題ない｡
過去履歴は最大1024ポイントまで取得できるようなので､10分に1回サーバに蓄積されると仮定すると､scale:"max"を指定した場合ほぼ1週間分のデータが取得できる｡

ハマったのはType引数｡
複数指定時は```,```で区切るが､スペースが含まれていると､```error:21 Filter xxx does not exists```となる｡
確かにコードのサンプルはスペース無しだが､scale:"Max"時に指定できるtypeキーワードの一覧にはスペースが含まれているため､コピペする際はご注意を｡