クラウド型 ワークフロー

電光掲示板で業務の状況をモニタリングする

業務状況を電光掲示板でモニタリングする仕組みを考えます。 今回は、稼働プロセス件数を Arduino に接続した LCD に表示します。

今日から新しいシリーズとして、電光掲示板に業務のステータス情報を表示することを考えます。例えば問い合わせ対応プロセスにおける「現在対応中の件数」、受注プロセスにおける「月ごとの受注件数」など、単純な件数でも電光掲示板に解りやすく表示することができれば、パソコンの画面よりも社内へのインパクトは(たぶん)絶大です。

今日はその1回目ということで、Arduino を使って、仕組みを試作します。Questetra BPM Suite から特定業務で現在対応中のプロセス数を取得し、それを Arduino の電光掲示板に表示します。

Arduino には幾つか製品がありますが、今回は  Arduino Uno を使用します。電光掲示板としては、Sain Smart の LCDシールド を使用します。電子工作に詳しい人から

  • シールドなんて軟弱な。電子工作の要素が何も無いじゃないか。
  • LCD は電光掲示板じゃない。

と言われそうですが、私は Arduino 初心者なので、ご勘弁ください。Arduino Uno と LCD シールドを合体すると以下のようになります。Arduino を知らない人に補足しておきますと、「合体する」と書きましたが、シールドは Arduino 本体にカパッとはめるだけで、Arduino に機能追加できる便利な部品なのです。 arduino with lcd shield

さて電子工作はこれで終わりですので、プログラムに取り掛かります。Arduino 自体が Questetra BPM Suite と直接通信するのは難しいので、Arduino は PC と USB ケーブルでつないでシリアル通信を行い、PC側のプログラムが Questetra BPM Suite と通信する方式とします。

QBPMS and Arduino

まず Arduino 上で動かすスケッチです。Arduino ではプログラムのことをスケッチと呼びます。

#include <LiquidCrystal.h>

//LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//LCDへ出力する文字列
String inputString = "";

void setup()
{
  //シリアル通信を初期化
  Serial.begin(9600);
  Serial.flush();
  inputString.reserve(200);

  //LCD を初期化
  lcd.begin(16, 2);
  lcd.clear();
  lcd.print("Ready!");
}

void loop()
{
  //シリアル通信でデータを受信したら
  if (Serial.available() > 0) {
    char inChar = (char) Serial.read();
    if (inChar == '\n') {
      //LCDへ出力
      lcd.clear();
      lcd.print(inputString);
      inputString = "";
    } else {
      inputString += inChar;
    }
  }
}

setup() は、初期化時に呼ばれる関数です。そこでシリアル通信と LCD の初期化を行なっています。

loop() は、Arduino が通電している間、何度も繰返し実行される関数です。シリアル通信で受信したデータがあると、Serial.available() は 1 以上の数値を返します。受信したデータがあると、Serial.read() を使って1バイトデータを読み込みます。改行コード \n が来るまでは文字列に受信データを連結し、改行コードが来たタイミングで LCD をクリアし文字列を出力しています。実はこのプログラム自体は、数値以外のアルファベットでも表示できるようになっています。ひらがな/カタカナ/漢字は LCD シールドが対応していません。

続いて PC 上で動かすプログラムです。ちょっと長いので添付します。getCount() では、Questetra BPM Suite のモニタリング API を呼び出して、特定業務の稼働プロセス数を取得しています。モニタリング API の中のプロセスを検索する API を呼び出しています。パラメータとして検索条件を示すXML と、実データは要らないので取得データ数として 0 を指定しています。また認証の機構としては、本来は OAuth を使うべきなのですが、今回は試作ということで Basic 認証を使ってラクしています。応答は JSON ですので、JSON Simple ライブラリを使って解析し、稼働プロセス数を取得しています。

シリアル通信をして、Arduino にプロセス数を渡す部分は、main() の中にあります。本当は Java Communications API を使いたかったのですが、Windows に対応していないので、RXTX というライブラリを使用しています。Java Communications API とは異なりますが、パッケージ名が異なるだけで API の構成は同じようです。ですから javadoc は Java Communications API の javadoc を参照するのが解りやすいです。

さて main() では、まずシリアルポートを取得し、ポートとの通信をオープしています。私の環境では使用するシリアルポートが “COM6” でしたが、ここは実行環境に応じて変わります。open() メソッドの1つ目の引数は、ポートの所有者を表すアプリケーション名で、2つ目の引数はタイムアウト値です。setSerialPortParams では、シリアル通信を行うための設定値を指定します。これは Arduino とシリアル通信を行う際の規定値と考えてください。

CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(COM_PORT);
SerialPort port = (SerialPort) portId.open(Communicator.class.getName(), 2000);
port.setSerialPortParams(9600,
  SerialPort.DATABITS_8,
  SerialPort.STOPBITS_1,
  SerialPort.PARITY_NONE);

あとは getOutputStream() で OutputStream を取得し、それを用いてプロセス数を5分おきに書き込んでいるだけです。

try (OutputStream output = port.getOutputStream()) {
  //いきなり送信しても Arduino が反応しないので、少し待つ
  Thread.sleep(3000);

  while (true) {
    //Questetra BPM Suite と通信して、プロセス数を取得
    int count = getCount();

    //Arduino にプロセス数を送信
    output.write(new Integer(count).toString().getBytes());
    output.write('\n');
    output.flush();

    //5分スリープ
    Thread.sleep(1000 * 60 * 5);
  }
}

PC側のプログラムを動かすためには、RXTX のdll があるフォルダを java.library.path で指定する必要があります。実行コマンドは、例えば以下のようになります。

$ java -Djava.library.path=C:\lib\ch-rxtx-2.2-20081207-win-x64 com.questetra.hatanaka.arduino.LCD.Communicator

動くとこんな感じです。

running arduino uno with lcd

LCD シールドは2行表示に対応しているのに1行しか使わないですし、またアルファベットも表示できるのに数字しか表示しないので、ちょっとというか、かなり寂しいですね。というわけで、次回は 7 セグメント LED を使った表示に挑戦したいと思います。ちょっと電子工作らしくなって電光掲示板に近づくはずです。

あわせて読みたい
15.野望・展望・志 の前の記事 Questetra と Cacoo の連携プレー(その3)
15.野望・展望・志 の次の記事 BPMフォーラム2013 ハッピでプレゼン編
Hatanaka Akihiro の他の記事 業務プロセスで「翻訳こんにゃく」を使う

アーカイブ

 RSS