obnizはクラウドを通じてIoTデバイスと連携させるサービスです。専用のデバイスのobniz boardも提供しており、それを使うことですぐにプロトタイピングが行えます。今回はこのobnizを使って、isaaxプロジェクトと連携する方法を紹介します。

今回作るもの

今回はobnizのスイッチを押した際のイベントを使ってRaspberry Piの温度を取得し、それをobnizのディスプレイに表示します。

利用するもの

  • isaax
  • Raspberry Pi
  • obniz board

obniz boardを有効にする

まずobniz boardを購入したら、クラウドと連携させる必要があります。電源(USB)を接続すると、WiFiネットワークへの接続が求められます。その後、QRコードや数字を使ってクラウドでアクティベーションします。ここまでの流れはobniz board本体、obnizのWebサイトで確認して進めてください。

最終的にobniz boardのID(数字4桁を二つ)が手に入ります。

WebSocketを使う

obnizはWebSocketを使ってobniz boardと相互通信を行います。今回はNode.jsのWebSocketライブラリを使います。インストールは下記コマンドになります。

npm i websocket -S

コードの解説

コードはRaspberry Pi向けです。コーディングは母艦のPCで、コーディング後にisaaxを使って転送しています。まずWebSocketのライブラリを読み込みます。サーバはobnizになりますので、Raspberry Pi側はクライアントを用意します。

const WebSocketClient = require('websocket').client;
const client = new WebSocketClient();

クライアントはイベントを使います。例えば下記は接続失敗時のイベントです。

client.on('connectFailed', function(error) {
  console.log('Connect Error: ' + error.toString());
});

接続すると、コネクションオブジェクトが返ってきます。

client.on('connect', function(connection) {

});

次はこのコネクションオブジェクトに対してイベントを設定します。エラーになった場合のイベントです。

connection.on('error', function(error) {
  console.log("Connection Error: " + error.toString());
});

接続を閉じた場合のイベントです。

connection.on('close', function() {
  console.log('echo-protocol Connection Closed');
});

そしてobnizでイベント(スイッチを押したなど)が起きたら、下記のmessageイベントが発生します。イベントは配列で取得できますので、スイッチ(switch)を押した(push)の際にRaspberry Piで処理を行っています。

温度を取得したら connection.sendUTF を使ってobnizのディスプレイの表示情報を送ります。この際、まず clear:true として表示を消去するのがコツです。対象を display としていますが、LED を光らせたり、サーボモータを動かしたりといった操作も行えます。

connection.on('message', function(message) {
  if (message.type !== 'utf8') return;
  // メッセージをJSONとしてパース
  const json = JSON.parse(message.utf8Data);
  // JSONは配列になっているので、それぞれを処理
  for (const obj of json) {
    // スイッチを押した際のイベントであればここ
    if (obj['switch'] && obj['switch']['state'] === 'push') {
      // 温度を取得
      const result = execSync('cat /sys/class/thermal/thermal_zone0/temp').toString('utf-8');
      const temp = parseInt(result.match(/([0-9]+)/, "$1")[1]);
      // obnizのディスプレイに表示
      connection.sendUTF(JSON.stringify([
        {display:{clear:true}},
        {display:{text: `Temperature is ${Math.round(temp / 100) / 10} degrees.`}}
      ]));
    }
    console.log("Received: '", obj);
  }
});

最後にobnizのサーバにWebSocketで接続します。この 9999-9999はobniz boardのIDです。

client.connect('wss://2ws.obniz.io/obniz/9999-9999/ws/1', 'echo-protocol');

できあがり

ここまでのコードで下記のように動作するようになります。ボタンを押す度に温度を取得して、obnizのディスプレイに温度が表示されます。これはインターネットを介しているので、双方がインターネットにつながっている限りは距離は関係ありません。遠隔地にあるデバイスの状態を取得し、それをobnizに投影するといったことが簡単にできます。

今回のコードはgoofmint/isaax-obnizにアップロードされています。実装時の参考にしてください。

まとめ

obnizはIoTのデバイスはもちろん、ハブとしても簡単に利用できるでしょう。Raspberry Piとの連携も簡単にできるので、ぜひ試してみてください。

obniz – 現実をソフトウェア化する


0 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *