IoTプロジェクトを運営していて、突如としてデバイスにトラブルが発生することがあります。その多くはストレージがいっぱいになってしまったり、メモリが枯渇したりと徐々に状態が悪化しているのに気付かないものです。そういったデバイスのステータスは適宜受け取りたい一方、データベースなどに蓄積するほどのデータでもなかったりします。

そこで使いたいのがisaaxのログ出力です。今回はそういったデータの取り方、出力方法を紹介します。

今回取得するデータについて

今回は以下のデータを取得します。対象はRaspberry Piになります。

  • CPU温度
  • CPUクロック
  • 電圧
  • メモリー
  • ストレージ

共通の方法として、Node.jsでコマンド出力した結果を解析しています。

ライブラリの読み込み

Node.js/JavaScriptのコマンド処理は非同期になるので、書きやすくするためのライブラリ promisify とコマンド実行ライブラリの exec を読み込みます。

const { promisify } = require('util');
const { exec } = require('child_process')

CPU温度の取得

CPU温度は vcgencmd measure_temp で取得します。結果の数字部分を正規表現で取得します。

// CPU温度
const tempOut = await promisify(exec)('vcgencmd measure_temp');
const temperature = parseFloat(tempOut.stdout.replace(/temp=([0-9\.]*)'C/, '$1'));

CPUクロック

CPUクロックは vcgencmd measure_clock arm で取得します。結果の数字部分を正規表現で取得します。

// CPU
const clockOut = await promisify(exec)('vcgencmd measure_clock arm');
const clock = parseInt(clockOut.stdout.replace(/frequency.*=([0-9\.]*)/, '$1'));

電圧

電圧は vcgencmd measure_volts で取得します。結果の数字部分を正規表現で取得します。

// 電圧
const voltOut = await promisify(exec)('vcgencmd measure_volts');
const volt = parseFloat(voltOut.stdout.replace(/volt=([0-9\.]*)V/, '$1'));

メモリ

メモリは free で取得します。これは複数行に分かれており、メモリとスワップ情報が取得できるので、それぞれ分解して変数化します。

// メモリー
const memOut = await promisify(exec)('free');
let lines = memOut.stdout.split(/\r\n|\r|\n/);
let params = lines[1].split(/\s+/);
const memory = {
  total: params[1],
  used: params[2],
  free: params[3],
  shared: params[4],
  cache: params[5],
  available: params[6]
};
params = lines[2].split(/\s+/);
const swap = {
  total: params[1],
  used: params[2],
  free: params[3]
}

ストレージ

ストレージは df -h で取得します。 / に全ディスクがマウントされているものとして解析しています。

// ストレージ
const storageOut = await promisify(exec)('df -h');
lines = storageOut.stdout.split(/\r\n|\r|\n/);
params = lines[1].split(/\s+/);
const storage = {
  size: params[1],
  used: params[2],
  available: params[3],
  use: params[4]
}

結果をダッシュボードに表示する

ここまでで一通りステータスが取得できました。後はこれを console.log を使って標準出力します。ここは必要に応じて内容を変更してください。

console.log(`
  temperature: ${temperature} clock: ${clock} volt: ${volt}
  memory: 
    total: ${memory.total}
    used: ${memory.used}
    free: ${memory.free}
    shared: ${memory.shared}
    cache: ${memory.cache}
    available: ${memory.available}
  swap: 
    total: ${swap.total}
    used: ${swap.used}
    free: ${swap.free}
  storage:
    size: ${storage.size}
    used: ${storage.used}
    available: ${storage.available}
    use: ${storage.use}
`);

isaaxでは標準出力した内容がそのまま管理画面で確認できます。とても簡単にネットワークを伴う処理が実現できます。

まとめ

今回のコードはgoofmint/isaax-status-update(GitHub)にアップロードしてあります。実装時の参考にしてください。

isaaxを使うことでデバイスの突発的な問題を未然に防げるようになります。安全なIoTプロジェクトを実現するためにも、デバイスのステータス可視化に取り組んでください。


0 Comments

Leave a Reply

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