Python
FileMaker

TELWatcherの代替品を作ってみた(あるいはFileMakerで簡易CTIを無料で実現する方法)

かつてTELWatcherという製品がありました。

http://www.key-planning.co.jp/resource/product/twp/s_help/index.html

FileMakerで簡易CTIを実現するためのソフトウェアです。CTIというのは、電話がかかってきたときに、その電話番号に関する関する情報をコンピュータに表示する仕組みのことです。

TELWatcherの開発はすでに終了しているので、最新のFileMakerで動かすことはできませんが、弊社ではつい最近までMac版のTELWatcherが現役で動いていました。

  • TELWatcherはFileMaker 10に対応しています
  • FileMaker 10は(OSのバージョンに注意すれば)FileMaker 12と同居することができます
  • FileMaker 12はFileMaker Server 14のクライアントになることができます

以上を踏まえて、今までは電話がかかってくると以下のような仕組みが動いていました。

  1. TELWatcherがローカルにあるFileMaker 10のデータベースに電話番号を書き込む
  2. ローカルマシンに同居しているFileMaker 12のスクリプトトリガーが反応し、FileMaker Server 14でホストしているデータベースに電話番号を転記する
  3. ユーザーのFileMaker(バージョンは16まで対応)に電話番号と関連情報が表示される

問題点

この方法にはいくつか問題点があります。

  • どこかひとつでもコケたら動かない
    • 安定して動いてはいましたが、FileMaker10と12の連携がややトリッキーです。
  • OSのバージョンを上げられない
    • FileMaker 10と12が同居できるOSのバージョンは限られています。古いOSを使い続けるのは非常に危険です。
  • FileMaker Serverのバージョンを上げられない
    • 今はどうにか最新版の16をクライアントにすることができますが、今後FileMakerのバージョンが上がっていったら、最新版を使えなくなってしまいます。

対策

原因はTELWatcherがFileMaker 10までしか対応していないことにあるので、これさえ解決すればすべての問題は解消できます。

TELWatcherはUSBでモデムやゲートウェイ機器と接続して電話番号を取得しています。
それほど複雑なことはしていないはずなので、頑張ればTELWatcherの代替品を作れるのではないかと思い、やってみました。
結論からいうと頑張らなくてもできました。

調査

まず、電話がかかってきたときにUSB経由でどんな情報が取得できるのか調査してみました。
弊社で使っているのは、一般の電話回線とIPネットワークを繋ぐVoIPゲートウェイ製品の一種です。
モデムやゲートウェイは、シリアル通信でATコマンドを使って制御できるという知識はあったので、シリアル通信関連の情報を調べたところ、Macでは以下のコマンドでシリアル通信の接続先を調べられることがわかりました。

$ ls /dev/tty.*

実行結果を見ると、どうやら/dev/tty.usbmodemxxxxxxxxというのが対象機器のようでした。(xxxxxxxxは数字)
実際にシリアル通信を行うにはcuコマンドを使います。
接続して、試しにATコマンドを打ってOKが返ってくるのを確認し、切断するまでの流れは下記のようになりました。

$ sudo cu -l /dev/tty.usbmodemxxxxxxxx
Connected.
AT
OK
~.
Disconnected

次に接続した状態で電話をかけてみました。

$ sudo cu -l /dev/tty.usbmodemxxxxxxxx
Connected.
{ここで電話をかける}
ARING 1 --- 080xxxxxxxx

4カラム目の080で始まる番号がテストで使用した携帯電話番号です。
何パターンかテストしてみましたが、この機器では4カラム目に必ず相手の電話番号が来るようです。

作成

ここまで分かれば後は簡単です。
今回はPythonで書いてみました。

Pythonでシリアル通信を行うには事前にpyserialモジュールをインストールする必要があります。

$ sudo easy_install -U pyserial

モジュールをインストールしたら下記のファイルを作成して実行します。

myCTI.py
# coding:utf-8
import webbrowser
import serial
import datetime

# Gatewayのシリアル通信を開く
ser = serial.Serial('/dev/tty.usbmodemxxxxxxxx',9600)

while True:
    # 改行まで読み込み
    line = ser.readline()
    # 電話番号は4カラム目
    number = line.split()[3]
    # FMPプロトコルでFileMakerを呼び出す
    url = 'fmp://{ユーザー名}:{パスワード}@{ホスト名(IPアドレス)}/{ファイル名}?script={スクリプト名}&param=' + number
    webbrowser.open(url)
    # ログ出力
    dt = datetime.datetime.today()
    log = dt.strftime("%Y-%m-%d %H:%M:%S") + ' ' + line.rstrip()
    print(log)

ser.close()

コメントを見ればだいたいわかると思いますが、無限ループで待機し、電話がかかってきたら任意のFileMakerスクリプトを実行する仕組みです。
今はFMPプロトコルでURLを開けばFileMakerのスクリプトを呼び出せるので、連携はとても簡単です。
FileMaker側では、例えば顧客情報のテーブルを用意して、電話番号を引数にしてスクリプトを実行したら会社名を表示するようにしておけば、簡易CTIの出来上がりです。

Macの場合、Sierraからtty.usbmodemがサポートされなくなったそうなので注意が必要です。
El Capitanからモジュールを移植すれば動くらしいという情報も見かけましたがまだ試してはいません。
Windowsでの挙動も試していないので、どなたか試されたら教えてください。