予てからAWS、IoT界隈では話題になっていたSORACOMさんのサービスが先日のITpro EXPOで遂にベールを脱ぎました。このSORACOMのサービスとkintoneの組合せはケースによっては最強のIoT実現方法になることがあります。そこで今回は、以前お届けした「Raspberry Piからkintoneにセンサデータを連携してみよう!」をSORACOMサービス利用に置き換えてその優位性に迫りたいと思います。
SORACOM
9/30のリリース講演で発表されたサービスは「SORACOM Air」、「SORACOM Beam」と呼ばれるもので、それぞれ次のようなものです。ITpro EXPOのAWARD大賞も受賞する注目のサービスです。
・SORACOM Air – IoT デバイス向けデータ通信SIM “Air SIM” を提供し、Webコンソール/API で一元管理/監視を提供する
・SORACOM Beam – IoT デバイスにかかる暗号化等の高負荷処理や接続先の設定を、クラウドにオフロードできる
※公式ページより引用
kintoneとSORACOMサービスとの相性
kintoneとIoTの連携については特に「データを捌く例えばAWS」と「その結果得られた情報を取り込んだコミュニケーションから、業務アクションを回すkintone」の組合せだと常々お伝えしていますが、「データを捌く・・・」が必要なケースと言うのはデータのボリュームが大きい時で、kintoneにデータが連携される時点でボリュームが小さく、コミュニケーションや業務アクションに繋げられるようになっていれば、時折例示するセンサーからkintoneへの直接連携も悪くありません。
また、最小限の頻度・データ量、価格でIoTという際には、kintoneとSORACOMサービスが最強の組合せになることがあります。Air SIMを設定したセンサーからBeamを経由してkintoneへデータ連携するという流れで、概要は次の通りです。
凄く手っ取り早く、ハマれば「簡単・セキュア・低価格」で実現出来る事が分かると思います。早速、「Raspberry Piからkintoneにセンサデータを連携してみよう!」の内容をSORACOM Air/Beam経由にする設定を見ていきましょう。
出来上がりイメージ
準備
・Raspberry Pi 2 Model B(RASPBIANとネットワーク設定、Node.jsインストールを終えた状態)
※SORACOM Air(Air SIM)の設定は3Gドングル等の設定が別途完了しているものとします。
※今回のNode.jsは執筆時点最新のv0.12.0を使用します。
・I2C温度センサー(ADT7410)
アプリの準備
次のフィールドを含むアプリをご準備ください。また、SORACOM Beamで追加するAPIトークンを発行しておきます。
フィールド名(例) | フィールドコード | フィールドタイプ |
---|---|---|
温度[Deg. C.] | tempC | 数値 |
SORACOM Beamの設定
SORACOM Beamの設定を行います。
(1)ユーザーコンソールの「グループ」タブでBeamを設定するグループを選択(クリック)する
(2)Beamの設定を追加するために、「+」から「HTTPエントリポイント」を選択
(3)「HTTPエントリポイント」の設定を次のように進める
(4)カスタムヘッダにkintoneアプリのAPIトークンを設定
(5)カスタムヘッダが追加されたら、Beamの設定を完了する
Raspberry Piからkintoneへの連携確認
まずは、kintoneにいつものようにHTTPSで直接リクエストしてみます。
$ curl -X POST "https://{subdomain}.cybozu.com/k/v1/record.json" \ $ -H "X-Cybozu-API-Token: {apiToken}" \ $ -H "Content-Type:application/json" \ $ -d "{"app": 3127,"record": {"tempC":{"value":24}}}" $ $ {"id":"31","revision":"1"} # レスポンス
通常のリクエストが通ったら、次はSORACOM Beam経由でリクエストしてみます。認証用のAPIトークンはSORACOM Beamで設定済みですので、不要となります。直接kintoneのREST APIをコールせずにkintoneのレスポンスが返ってくるのが新鮮ですが、SORACOM BeamのエントリポイントまではSIMのセキュア性を利用しつつ、そこからエンド側のクラウドであるkintoneへは従来のHTTPSとAPIトークンでセキュリティを担保する訳ですね。端末にAPIトークン入れずに済むのも良いですね。
$ curl -X POST "http://beam.soracom.io:8888/record.json" \ $ -H "Content-Type:application/json" \ $ -d "{"app": 3127,"record": {"tempC":{"value":24}}}" $ $ {"id":"32","revision":"1"} # レスポンス
ちなみに、このcURLコマンドはSORACOM AirのWiFiルータとMacintoshの組合せではタイムアウトで通りませんでした。
Raspberry Piの準備
Raspberry Piの準備を行います。この辺も「Raspberry Piからkintoneにセンサデータを連携してみよう!」と全く同じですので、設定済みの方はスキップ頂いて大丈夫だと思います。
(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
次のサンプルコードのうち、{app. ID}はkintoneアプリのIDで書き換えてください。「Raspberry Piからkintoneにセンサデータを連携してみよう!」との違いとして、cybozu.comのドメインとAPIトークンがBeamの設定でラッピングされていることに注目してください。
var ADDRESS, 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'}); APP_ID = '{app. ID}'; // 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 via SORACOM Beam registToKintone = function(appId, value) { request({ method: 'POST', url: "http://beam.soracom.io:8888/record.json", headers: { "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(APP_ID, 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で再起動しておきましょう)。
所感
SORACOM Beamのプロトコル変換/ルーティングの機能でもたらされるセンサー側の電力負担等をクラウドで吸収し、センサーからユーザーサイドクラウドまでのセキュリティを過不足なく担保するという実用的な美しさをリリース講演で目の当たりにした時に、kintoneとの組合せも良さそうと直感しましたが、実際にやってみて改めてIoTの条件付きベストプラクティスになりうるのではないかと思いました。
IoT界隈は、このSORACOMサービスとAWS IoTの出現で、いよいよ残すインテグレーション要素はデバイスの選択くらいになってきましたので、これまで以上に活用シナリオ・用途に集中できるようになってきます。そうなってくると、これからIoTでもkintoneアプリが役立てられることが実証されていくと思います。楽しみですね!