最近、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)

 

出来上がりイメージ

rpi2kintone

アプリの準備

次のフィールドを含むアプリをご準備ください。

フィールド名(例) フィールドコード フィールドタイプ
温度[Deg. C.] tempC 数値

 

Raspberry Piの準備

Raspberry Piの準備を行います。

(1)Raspberry Piとセンサーを結線します。Raspberry Pi側とセンサー側の対応を見ながらブレッドボードにジャンパー線を差し込んでいきましょう

pic2pic3

図中線色 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

スクリーンショット 2015-03-11 15.09.48

 

(3)そして、I2C動作確認ツールをインストールします($ sudo apt-get install i2c-tools)

スクリーンショット 2015-03-11 15.11.18

 

(4)センサーの動作確認を行います。センサーを外した状態と付けた状態で比較すると、今回使っているセンサーの判別がしやすいです。チャンネルは、今回対象としている2やB+、B Rev.2の場合には1、Rev.1の場合には0とします($ sudo i2cdetect -y {channel})

i2cdetect

チャンネルを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

スクリーンショット 2015-03-11 19.06.07

以上で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で再起動しておきましょう)。

 

 


株式会社ジョイゾー