最近、kintone界隈でもIoT(Internet of Things)の連携をチラホラ聞くようになってきました。また、「Kinoma create(IoTキット)」や「Tessel(IoTキット)」、「V-Sido CONNECT RC(ロボット)」に見られるように、ハードウェアをJavaScriptから制御する取り組みも盛んになってきています。
そこで、今回はcybozu.com developer networkのTipsにある「IoT入門(1)~温度センサーをkintoneに連携させてみよう!(Pythonで記述)」のNode.js版のサンプルをお届けしたいと思います。なお、今回著者はRaspberry Pi 2を利用しました。また、丁度2016-02-16版のOSでI2Cの設定方法も変更になりましたので、是非Tipsと見比べてみてください!
準備
・Raspberry Pi 2 Model B(RASPBIANとネットワーク設定、Node.jsインストールを終えた状態)
※今回はRASPBIAN2015-02-16版で実行するため、先に挙げたTipsとはI2Cの設定が異なります。
※今回のNode.jsは執筆時点最新のv0.12.0を使用します。
・I2C温度センサー(ADT7410)
出来上がりイメージ
アプリの準備
次のフィールドを含むアプリをご準備ください。
フィールド名(例) | フィールドコード | フィールドタイプ |
---|---|---|
温度[Deg. C.] | tempC | 数値 |
Raspberry Piの準備
Raspberry Piの準備を行います。
(1)Raspberry Piとセンサーを結線します。Raspberry Pi側とセンサー側の対応を見ながらブレッドボードにジャンパー線を差し込んでいきましょう
図中線色 | Raspberry Pi端子 | センサー端子 | 内容 |
---|---|---|---|
赤 | 3.3V | VDD | センサー電源線 |
黒 | GND | GND | センサー接地線 |
緑 | SDA | SDA | センサーデータ線 |
黄 | SCL | SCL | センサークロック線 |
続いて、I2Cを使うための準備を行います。
(2)I2Cの設定は次の通り、一挙に「/boot/config.txt」、「/etc/modules」に設定を追記し、再起動します
$ sudo su # echo dtparam=i2c_arm=on >> /boot/config.txt # echo i2c-dev >> /etc/modules # reboot
(3)そして、I2C動作確認ツールをインストールします($ sudo apt-get install i2c-tools)
(4)センサーの動作確認を行います。センサーを外した状態と付けた状態で比較すると、今回使っているセンサーの判別がしやすいです。チャンネルは、今回対象としている2やB+、B Rev.2の場合には1、Rev.1の場合には0とします($ sudo i2cdetect -y {channel})
チャンネルを1としてコマンドを入力すると、アドレスは、「0x48」であることがわかります。
(5)Node.jsのモジュールをインストールします
今回の作業用ディレクトリを「iot」とします。そして、そこに今回3つのモジュールをインストールします。
・request(HTTPS REST APIクライアント)
・i2c(I2CのREAD/WRITE)
・async(非同期、ループ処理)
$ mkdir iot && cd iot $ sudo npm install request && sudo npm install i2c && sudo npm install async
以上でRaspberry PiでI2Cセンサーを使うための準備は完了です。
kintone連携のためのNode.js用JavaScript
次のサンプルコードのうち、{subdomain}、{app. ID}、{API token} をそれぞれkintone環境の「xxx.cybozu.com」、「アプリID」、「APIトークン」で書き換えてください。
var ADDRESS, SUBDOMAIN, API_TOKEN, APP_ID, async, i2c, INTERVAL, readValue, registToKintone, request, sensor; i2c = require('i2c'); request = require('request'); async = require('async'); ADDRESS = 0x48; INTERVAL = 60*1000; // mili-sec sensor = new i2c(ADDRESS, {device: '/dev/i2c-1'}); SUBDOMAIN = '{subdomain}'; APP_ID = '{app. ID}'; API_TOKEN = '{API token}'; // read from ADT7410 // data sheet -> http://www.analog.com/media/en/technical-documentation/data-sheets/ADT7410.pdf readValue = function(callback) { sensor.readBytes(0x00, 2, function(err, data) { var temp, value; temp = (data[0] << 8 | data[1]) >> 3; if (temp >= 4096) { temp -= 8192; } value = temp * 0.0625; console.log("Temperature: " + value + " [Deg. C.]"); callback(value); }); }; // regist to kintone registToKintone = function(subdomain, appId, apiToken, value) { request({ method: 'POST', url: "https://" + subdomain + "/k/v1/record.json", headers: { "X-Cybozu-API-Token": apiToken, "Content-Type": "application/json" }, json: { 'app': appId, 'record':{ 'tempC': { 'value': value } } } }, function(err, response, body) { if (err) { throw err; } if (response.statusCode === 200) { console.log('RESULT: '); } else { console.log("response error: " + response.statusCode + ", " + err); } body = body ? body : ''; console.log(body); return body; }); }; // loop async.forever(function(callback) { async.series([ function(callback) { readValue(function(value) { return registToKintone(SUBDOMAIN, APP_ID, API_TOKEN, value); }); setTimeout(callback, INTERVAL); } ], callback); }, function(err) { console.log(err); });
そして、プログラム実行時には、ここでもI2Cデバイスへのアクセスのため、 「sudo node adt7410.js」のように 「sudo」をつける必要があります。もしくは、 「sudo adduser pi i2c」でI2Cグループにアクセスユーザーを追加していれば、 「node adt7410.js」のような実行も可能になります(グループ追加時は、 sudo rebootで再起動しておきましょう)。