Netatmoウェザーステーションのクラウドから Node.js でデータ取得これはテストです

Netatmoではデータ取得用のAPIを提供しており、今回はNode.jsを使いクラウドからデータを取得する。

取得する側で必要なソフトウエア要件としては、以下のとおり
①Node.jsがインストールされていること、
②Foreverがインストールされていること
データ取得側の動作としては、以下のソースをcronで実行している。

室内用モジュールからデータ取得するソース

 
netOK2.js
var netatmo = require('netatmo');

var api = new netatmo({
'client_id' : 'Netatmoへ登録した時に与えられたID',
'client_secret' : 'Netatmoへ登録した時の与えらたsecret',
'username' : 'Netatmoへ登録した時のユーザ',
'password' : 'Netatmoへ登録した時のpassword'
});

api.getDevicelist(function(err, devices, modules) {
devices.forEach(function(device) {
api.getMeasure({
device_id: device._id,
scale: '30min', // この設定で step_time が変化します
date_begin:'',
date_end:'last',
type: ['Temperature', 'Humidity', 'Pressure', 'Noise', 'CO2']
}, function(err, measure) {
measure.forEach(function(result) {
for (var i = 0; i < 1; ++i) {
var today = formatDate(new Date());
var val = result.value[i];
var data = console.log('[%s]\n気温: %s 度, 湿度: %s%, 気圧: %s mbar, 騒音: %s dB, CO2: %s ppm\n',
today, val[0], val[1], val[2], val[3], val[4]);
var data = new String(); // 文字を入れる変数
data += '{"Date":"'; 
data += today; 
data += '",'; 
data += '"InTemp_atmo":'; 
data += '"'; 
data += val[0]; 
data += '",'; 
data += '"InFumi_atmo":'; 
data += '"'; 
data += val[1]; 
data += '",'; 
data += '"AbsPress_atmo":'; 
data += '"'; 
data += val[2]; 
data += '",'; 
data += '"Noise_atmo":'; 
data += '"'; 
data += val[3]; 
data += '",'; 
data += '"CO2_atmo":'; 
data += '"'; 
data += val[4];
data += '"}'; 
data += '\n'; 
console.log(data);
var fs = require('fs');
fs.appendFile('/var/log/netatmo.log', data ,'utf8', function (err) {
console.log(err);
});

             }
         });
     });
   });

});

var formatDate = function (date, format) {
if (!format) format = 'YYYY/MM/DD hh:mm:ss';
format = format.replace(/YYYY/g, date.getFullYear());
format = format.replace(/MM/g, ('0' + (date.getMonth() + 1)).slice(-2));
format = format.replace(/DD/g, ('0' + date.getDate()).slice(-2));
format = format.replace(/hh/g, ('0' + date.getHours()).slice(-2));
format = format.replace(/mm/g, ('0' + date.getMinutes()).slice(-2));
format = format.replace(/ss/g, ('0' + date.getSeconds()).slice(-2));
if (format.match(/S/g)) {
var milliSeconds = ('00' + date.getMilliseconds()).slice(-3);
var length = format.match(/S/g).length;
for (var i = 0; i < length; i++) format = format.replace(/S/, milliSeconds.substring(i, i + 1));
}
return format;
};

室外用モジュールからデータ取得するソース

net_outOK1.js
var netatmo = require('netatmo');

var api = new netatmo({
'client_id' : '56910f8b49c75f65ac6cd968',
'client_secret' : 'tyCuTfNqgBoiDOtl1seKF1Je0SBAqTS6pCz1f968R1vL',
'username' : 'chibacy@kki.biglobe.ne.jp',
'password' : 'ma1Tong90chai'
});

api.getDevicelist(function(err, devices, modules) {
devices.forEach(function(device) {
api.getMeasure({
device_id: device._id,
scale: '30min', // この設定で step_time が変化します
date_begin:'',
date_end:'last',
module_id: 'XX:XX:XX:XX:XX:XX', // 室外 moduleを指定するId
type: ['Temperature', 'Humidity', 'Pressure', 'Noise', 'CO2']
}, function(err, measure) {
measure.forEach(function(result) {
for (var i = 0; i < 1; ++i) {
var today = formatDate(new Date());
var val = result.value[i];

var data = console.log('[%s]\n気温: %s 度, 湿度: %s%\n',
today, val[0], val[1]);
var data = new String(); // 文字を入れる変数
data += '{"Date":"'; 
data += today; 
data += '",'; 
data += '"OutTemp_atmo":'; 
data += '"'; 
data += val[0]; 
data += '",'; 
data += '"OutFumi_atmo":'; 
data += '"'; 
data += val[1]; 
data += '"}'; 
data += '\n'; 
console.log(data);
var fs = require('fs');
fs.appendFile('/var/log/netatmo.log', data ,'utf8', function (err) {
console.log(err);
});




         }
      });
    });
  });


});

var formatDate = function (date, format) {
if (!format) format = 'YYYY/MM/DD hh:mm:ss';
format = format.replace(/YYYY/g, date.getFullYear());
format = format.replace(/MM/g, ('0' + (date.getMonth() + 1)).slice(-2));
format = format.replace(/DD/g, ('0' + date.getDate()).slice(-2));
format = format.replace(/hh/g, ('0' + date.getHours()).slice(-2));
format = format.replace(/mm/g, ('0' + date.getMinutes()).slice(-2));
format = format.replace(/ss/g, ('0' + date.getSeconds()).slice(-2));
if (format.match(/S/g)) {
var milliSeconds = ('00' + date.getMilliseconds()).slice(-3);
var length = format.match(/S/g).length;
for (var i = 0; i < length; i++) format = format.replace(/S/, milliSeconds.substring(i, i + 1));
}
return format;
};

cronで上記の2つの実行ファイルを実行する。


*/5 * * * * root /home/XXX/netOK_batch.pl /dev/null 2>&1

cronで実際に実行されるファイルは以下のとおり

netOK_batch.pl
su - root -c"NODE_ENV=production /usr/local/bin/forever stop /home/XXX/netOK2.js"
su - root -c"NODE_ENV=production /usr/local/bin/forever start /home/XXX/netOK2.js"
su - root -c"NODE_ENV=production /usr/local/bin/forever stop /home/XXX/net_outOK1.js"
su - root -c"NODE_ENV=production /usr/local/bin/forever start /home/XXX/net_outOK1.js"