凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Netatmo ウェザーステーションを買ってみたので Node.js でいじってみた

はじめに

Netatmo という商品はご存知でしょうか?

屋内と屋外に設置して、「温度」「湿度」「気圧」「二酸化炭素濃度」「騒音」を iOSAndroid アプリからモニタリング出来るガジェットです。IFTTT 連携も出来るので、例えば二酸化炭素がアレになったら通知とか、気圧が 1000 hPa を下回ったらつぶやくとか出来ます。うちの家自動化システムに組み込みたかったので購入して Node.js で色々といじってみました。
f:id:hecomi:20140413002802j:plain
f:id:hecomi:20140414210517p:plain

Netatmo を利用した開発について

Netatmo REST APIs

Netatmo では Netatmo REST APIs が用意されています。REST Private APIREST Public API の2種類が用意されており、その名の通り、Private API の方は、オーナーが許可したアプリからのみアクセス出来る API、Public API の方は Public と設定された機器にアクセスするための API です。ただ後者の方は現在使用できないようで、公式には今年末には利用できるようになると書いてあります。

Netatmo では最初の設定時にユーザ登録が必要です。この際に Netatmo のサーバに自分の手持ちのデバイスが登録され、サーバを介した REST API で自分のデバイスから情報を取得し JSON で返してくれる仕組みになっています。WeMo や Hue などもそうですが、最近はこういった製品が多くて面白いですね(セキュリティ云々ありますが...)。

キーの発行

CREATE AN APP から情報登録すると Client IDClient Secret が発行されます。
f:id:hecomi:20140414002408p:plain

公式の SDK

公式では、PHP / Obj-C / Win8(JS) / Java による SDK が提供されています。

Node モジュールのインストール

私は Node.js で開発を行いたかったので、公式の SDK は使わずに npm に上がっているものを探しました。モジュールは2つ選択肢があるようです。

私は最近更新されている前者の netatmo の方を利用しました。

API を叩いてみる

キーを取得できれば後は README に書いてあるとおりに叩けば OK です。

var netatmo = require('netatmo');

var api = new netatmo({
    'client_id'     : 'CREATE AN APP で得られた Client ID',
    'client_secret' : 'CREATE AN APP で得られた Secrete Key',
    'username'      : 'Netatmo に登録したメールアドレス',
    'password'      : '同パスワード'
});

api.getUser(function(err, user) {
    console.log(user);
});

api.getDevicelist(function(err, devices, modules) {
    console.log(devices);
    console.log(modules);
});

api.getMeasure({
    device_id: 'getUser で得られた結果の devices に書かれたキー',
    scale: 'max',
    type: ['Temperature', 'CO2', 'Humidity', 'Pressure', 'Noise']
}, function(err, measure) {
    measure.forEach(function(data) {
        console.log(data);
    });
});

それぞれの戻り値はパースされた JSON の値がそのまま入っているので仕様を見れば何がどういう形で入っているか分かります。

サンプル

サンプル書いてみました。

var netatmo  = require('netatmo');

var api = new netatmo({
    'client_id'     : 'CLIENT ID',
    'client_secret' : 'SECRET KEY',
    'username'      : 'MAIL ADDRESS',
    'password'      : 'PASSWORD'
});

api.getDevicelist(function(err, devices, modules) {
    devices.forEach(function(device) {
        api.getMeasure({
            device_id: device._id,
            scale: '30min', // この設定で step_time が変化します
            // module_id: 'module の ID', // ここを与えると module(外置き)のデータを取ってきます
            type: ['Temperature', 'CO2', 'Humidity', 'Pressure', 'Noise']
        }, function(err, measure) {
            measure.forEach(function(result) {
                for (var i = 0; i < result.value.length; ++i) {
                    var timestamp = (result.beg_time + result.step_time * i) * 1000;
                    var val = result.value[i];
                    console.log('[%s]\n気温: %s 度, 湿度: %s%, 気圧: %s mbar, 騒音: %s dB, CO2: %s ppm\n',
                        new Date(timestamp), val[0], val[2], val[3], val[4], val[1]);
                }
            });
        });
    });
});

結果:

...
[Sun Apr 13 2014 22:15:00 GMT+0900 (JST)]
気温: 22.9 度, 湿度: 41%, 気圧: 1023 mbar, 騒音: 46 dB, CO2: 565 ppm

[Sun Apr 13 2014 22:45:00 GMT+0900 (JST)]
気温: 22.9 度, 湿度: 42%, 気圧: 1022.9 mbar, 騒音: 46 dB, CO2: 602 ppm

[Sun Apr 13 2014 23:15:00 GMT+0900 (JST)]
気温: 22.9 度, 湿度: 42%, 気圧: 1022.8 mbar, 騒音: 46 dB, CO2: 607 ppm

[Sun Apr 13 2014 23:45:00 GMT+0900 (JST)]
気温: 22.9 度, 湿度: 42%, 気圧: 1022.6 mbar, 騒音: 43 dB, CO2: 644 ppm

[Mon Apr 14 2014 00:15:00 GMT+0900 (JST)]
気温: 22.9 度, 湿度: 43%, 気圧: 1022.5 mbar, 騒音: 38 dB, CO2: 769 ppm
...

API にどういうパラメタを与えるかについてはドキュメントにまとまっています。

おわりに

これで特定の温度や湿度でエアコン調整したり、hue の色変えて空気の綺麗さ表したり出来ます!Arduino で作ろうかと思ってたのですが、既成品使ったほうが機能が豊富だったり他にも流用できるんで面白いですね。