Netatmoはフランス生まれの気象観測ガジェット。日本でも販売しており、手軽に温度、湿度、気圧、二酸化炭素濃度などが測れます。
二酸化炭素濃度は室内を測っているのだけれど、生活の中ですごく変化する様子が面白い。屋外の濃度はおおよそ400ppmなのだが、室内で窓を閉め切ると人間の呼吸だけであっという間に600〜800ppmほどになります。さらに、調理などでガスコンロを使うとあっという間に1000ppmを超え、冬場の石油ストーブなどは締めきった部屋で使うとみるみる2000,3000ppmと上がっていき見ているだけで息苦しくなる気がします。
通常、1000ppm以下が快適とされている二酸化炭素濃度ですが、Netatmoで計測できても気軽に知る方法がありません。スマホアプリがあるので、スマホのウィジェットやタブレットなどに表示させておけるのですが、それでも見にくい。というわけで、7セグメントLEDとraspberry piを使い常時表示させるガジェットを作りました。
用意するもの
- Raspberry pi zero WH
- 自作4桁7セグメント基盤
自作基盤は大変参考になるページが有ったので、そのまま流用させてもらいました。http://cl.hatenablog.com/entry/akizuki7segkit
nodejsのインストール
まずはnodejsのインストール。raspbianで提供されているnodejsは古いようなので、新しいバージョンをインストールできるようにnodejsのパッケージマネージャであるnpmをインストールします。
$ sudo aptitude install npm
標準のnodejsを始め、 多数のパッケージがインストールされます。
インストールされるのはnodejsコマンド。バージョンを確認すると以下のようになっています。
$ nodejs -v v4.8.2
次に、バージョン管理ができる、nコマンドをインストール。
$ sudo npm install -g n
-gでグローバルでインストール。
これで任意のバージョンのnodejsがインストールできるようになります。インストールできるバージョンは n ls で確認できます。特定のバージョンをインストールする際は、バージョン番号を指定して n 9.5.0 のようにします。他にstable , latest , lts などが指定できます。今回はlts(長期サポート版)をインストールします。
$ sudo n lts install : node-v8.9.4 mkdir : /usr/local/n/versions/node/8.9.4 fetch : https://nodejs.org/dist/v8.9.4/node-v8.9.4-linux-armv6l.tar.gz ######################################################################## 100.0% installed : v8.9.4
今回は8.9.4がインストールされました 。今回されたのはnodeコマンドです。
Netatmo API からCO2値を取得
nodejsでnetatmoが使えるモジュールがあるので、インストールします。~/netatmoを用意しておき、そのなかでインストールします。**は適宜読み替えてください。
$ npm install netatmo netatmo@2.1.0 node_modules/netatmo ├── request@2.83.0 (aws-sign2@0.7.0, tunnel-agent@0.6.0, oauth-sign@0.8.2, forever-agent@0.6.1, caseless@0.12.0, is-typedarray@1.0.0, safe-buffer@5.1.1, stringstream@0.0.5, aws4@1.6.0, isstream@0.1.2, json-stringify-safe@5.0.1, extend@3.0.1, performance-now@2.1.0, qs@6.5.1, uuid@3.2.1, combined-stream@1.0.5, mime-types@2.1.17, tough-cookie@2.3.3, form-data@2.3.1, hawk@6.0.2, http-signature@1.2.0, har-validator@5.0.3) └── moment@2.20.1
Netatmo APIを利用して屋内ステーションからCO2値を取得するプログラムは以下のnetatmo.jsを用意しました。
var netatmo = require('netatmo'); var fs = require('fs'); var auth = { "client_id": "************************", "client_secret": "***************************", "username": "****", "password": "****", }; var api = new netatmo(auth); //var getStationsData = function(err, devices) { // console.log(devices); //}; // Get Measure // See docs: https://dev.netatmo.com/dev/resources/technical/reference/common/getmeasure var options = { device_id: '**:**:**:**:**:**', scale: 'max', date_begin: '', date_end:'last', type: [ 'CO2'], real_time: true, }; setInterval(function() { api.getMeasure(options, function(err, measure) { // console.log(measure.length); // console.log(measure[0]); var data = (' '+measure[0].value).slice(-4); fs.writeFile('/pathto/netatmo/co2.txt', data , function (err) { // console.log(err); }); }); }, 60000);
co2.txtというファイルが指定したディレクトリに作られます。テストするには以下のコマンドで実行します。停止はCtrl+Cです。
$ node netatmo.js
CO2値を7セグメントLEDで表示
Raspberry PiにGPIO経由で7セグメントLEDを接続し、CO2の値を表示させる。こちらの方法は全面的に https://gist.github.com/CLCL/ab5be8ddc4caa0d72aa5 こちらのサンプルを利用させてもらった。showco2.jsとして以下を作成。
'use strict'; // akizuki-7seg-10col.js: // Usage: // (Raspberry PiにRaspbian Jessieをインストールして、 // sudo raspi-config で SPI使用を有効にしてリブート後、 // piユーザでログイン) // sudo apt-get update // sudo apt-get -y remove nodered nodejs nodejs-legacy // curl -LO http://node-arm.herokuapp.com/node_latest_armhf.deb // sudo dpkg -i node_latest_armhf.deb // mkdir 7seg // cd $_ // npm install onoff pi-spi // curl -LO https://gist.githubusercontent.com/CLCL/ab5be8ddc4caa0d72aa5/raw/80600eec8e20584d945c7b249ebb001cd2661b59/akizuki-7seg-10col.js // sudo node akizuki-7seg-10col.js // // #Use libs/Global Objects // var SPI = require('pi-spi'); var Gpio = require('onoff').Gpio; var fs = require('fs'); // SPI初期化 var spi = SPI.initialize('/dev/spidev0.0'); spi.clockSpeed(31250000); // 250MHzの8分周=31.25MHz(実用できる限界速度) // // #define // // 信号値定義 var HIGH = 1; var LOW = 0; // 信号ピン定義 var LATCH = 25; // GPIO25(22pin):74HC595 LATCH -> LAT // MOSI(19pin)[変更不可]:SPI DATA OUTPUT -> DAT // SCLK(23pin)[変更不可]:SPI CLOCK -> CLK // // Class // var SEG7 = function(f) { this.gpio = { lat : new Gpio(f.LAT, 'out') }; this.digits = [ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x6f ]; this.gpio.lat.writeSync(LOW); // ラッチ(LED表示固定) }; SEG7.prototype = { write: function(buf) { return new Promise(function(resolve, reject) { spi.write( buf, function(e) { if (e) console.error(e); }); }); }, latch: function() { var self = this; return new Promise(function(resolve, reject) { self.gpio.lat.writeSync(HIGH); // ラッチ解除(シフトレジスタ内容表示) self.gpio.lat.writeSync(LOW); // ラッチ(LED表示固定) }); }, show: function(f) { var self = this; var buf = Buffer(f); var buf2 = new Buffer(4); var j = 0; for (var i = 0; i < buf.length; i++) { if (buf[i].toString() == '.'.charCodeAt(0)) { buf2[j-1] |= 128; } else { buf2[j] = self.digits[buf[i]-48]; j++; } } self.write(buf2).then(self.latch()); } }; // // Main Routine // var seg7 = new SEG7({LAT: LATCH}); var timer = Date.now(); (function loop() { var now = Date.now(); if (now - timer > 4096) { var text = fs.readFileSync('/home/n10/netatmo/co2.txt', 'utf8'); seg7.show(text); timer = now; } process.nextTick(loop); })();
以下のモジュルールをインストール。
$ npm install pi-spi $ npm install onoff
あと、実行するユーザがpiでない場合は、spi,gpioのグループに追加しておく。
$ sudo gpasswd -a hoge spi $ sudo gpasswd -a hoge gpio
デフォルトではGPIOが有効になっていないので、sudo raspi-configして有効にする。Interfacing OptionsからSPIをenableにして再起動する。
showco2.jsを起動して、co2.txt内の数字が表示できれば成功。
自動起動(forever)
あとはnetatmo.jsとshowco2.jsを自動起動するだけだが、永続的に起動しておくためにnodejsのforeverを使う。グローバルでインストールしておく。
$ sudo npm install forever -g
起動のために、/etc/rc.localに以下を記述
sudo -u hoge /usr/local/bin/forever start /pathto/netatmo/netatmo.js sudo -u hoge /usr/local/bin/forever start /pathto/netatmo/showco2.js
時々再起動しないと止まることがあるので、crontabに以下を記述。
0 * * * * /usr/local/bin/forever restartall
これで、深夜0時に再起動がかかる。