Netatmoウェザーステーションのクラウドから Node.js でデータ取得
Netatmoではデータ取得用のAPIを提供しており、今回はNode.jsを使いクラウドからデータを取得する。
室内用モジュールからデータ取得するソース
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"