アナログ電話のナンバーディスプレイを安価にIT化する話

スポンサーリンク

アナログ電話の電話番号通知を安価にシステム化しSlack通知する話。結論から言うとちょっと古いYAMAHAルータ(中古)を使用します。

スポンサーリンク

やりたいこと

事業用の電話があるのですが、営業の電話も多く 基本電話は嫌いなので携帯転送にはしていません。今まではAUの番号通知サービス(かかってきた電話番号がSMSで通知されるサービス。KDDI電話 auで着信確認)を使っていたのですが、需要が少ないのか、残念ながら2021/11にサービス終了してしまいました。

やりたいこと

やりたいことは下記の2つ。

  1. 事務所外に居ても誰から着信があったかを知りたい
  2. 着信があった顧客をいい感じに管理したい

こんな感じの事がしたい。

着信電話番号知る(ナンバーディスプレイ)

IP電話(050)や携帯電話の場合 着信番号は はじめから通知されますし、IP電話の場合はIT化するサービスも色々あるのですが、固定電話番号をいろんな人に配ってしまっているので、できるだけこの番号を使いたいです。固定電話で番号を知るのはナンバーディスプレイ(はNTTのサービス名だけど、どの電話会社も同じ機能の有料オプションがある)。ここに通知される番号をなんとかしてシステム化できないか…というのが今回の話です。

ちなみにNTTひかり電話だと、設置さられた電話ルーター(ホームゲートウェイ)にログインできるので、そのまま良い感じにIT化できる(この情報は検索してよく出てきます)らしいのですが、住んでいる場所ではNTT光は提供範囲外で、現在使用しているケーブルテレビのIP電話ルーターは、ルータ中に入れません。

電話番号を いい感じにシステム化する方法

専用の機械(ナンバーディスプレイアダプタ)を接続

ひかり電話ルータの次に検索で良く出てくる方法がこれです。専用の機器をPCに接続し良い感じにします。今回はSlackに通知したかった&専用のPCをずっと起動しているのもイマイチなので、

電話線→アダプタ→(RS-232C)→ESP32(Arduino/Wifi)→サーバ

を作ろうと購入したのですが、この機械(アロハPC1)でナンバーディスプレイを受け取ると、電話側のナンバーディスプレイが動きませんでした(説明書に書いてあった…)。新しいUSB版は可能らしいのですが、USB版だとArduinoへのつなぎ方がややこしそう&値段が高い。電話側で非通知着信拒否したり、事務所に居るときに電話機側に名前が出ないのは不便なので、これでは使えません。

ナンバーディスプレーアダプタ「アロハND6」

ナンバーディスプレーアダプタ「アロハND6」

26,600円(10/05 23:01時点)
Amazonの情報を掲載しています

張り切ってESP32とシリアル変換買ったのに使えなかったの図

電話機のナンバーディスプレイをWebカメラで画像認識→数値化

次に考えたのが電話機に表示される番号をWebカメラで画像認識して良い感じにする方法です。

これ系の学習的にも面白そうだったのですが、夜だったり昼だったりも認識させようとするとやや時間がかかりそうだったので、一旦保留にしました。

上記を作るにあたり、コロナの関係でラズパイが手に入らないので色々検索していたところ、自分も使用しているATOM Cam2のカスタムファームウェアを作っている方がいらっしゃって興味深かったです。また、近くのものをWebカメラで写す時はカメラに老眼鏡をかけると言う知見もどこかで使ってみたいです。

IP電話をアナログ電話機で受ける機械(海外製)

GrandStram社製の一部の機種はNTTナンバーディスプレイにも対応しており、アナログ回線も入れる事ができる(FXO)らしいのですが、レビューをみると結構不安定&現在出てるファームウェアではナンバーディスプレイが実質使えない(ナンバーディスプレイを使用すると着信できない)的な書き込みを見ました。上記の専用機器で痛い目にあっているせいもあり、できれば購入後ハマりたくないのでやめました。不具合が修正されたらこれを使うのはありな気はします。

YAMAHAのアナログ回線を収容できるルーター

今回のような使用方法で実際に動かしている情報は検索上では見当たらなかったのですが、ナンバーディスプレイに対応しており、着信番号がSYSLOGに出るような事が説明書に書いてあります。安心・安定のYAMAHA。今回はこれの話になります。

アナログ回線を収容できるYAMAHAルーター

最新ルーターでは除かれているのですが、ちょっと前の機種までISDN・アナログ電話・インターネット回線がいい感じに入れられます。その中でもISDN回線をアナログ入力に変更にできる機種がいくつか出ていました。

今回の設定ができる機種:RT57i、RT58i、NVR500

定価は結構高い(上記中一番新しいNVR500の場合 \55,000。現在も購入可)のですが、メルカリとかでいい感じに安く(\2~5,000程度)なっているので、これを購入しました。

ヤマハ ブロードバンド VoIP ルーター NetVolante NVR500

ヤマハ ブロードバンド VoIP ルーター NetVolante NVR500

61,500円(10/06 00:52時点)
Amazonの情報を掲載しています
YAMAHA NVR500

中古では安くなってて素敵なYAMAHA NVR500

接続

こんな感じに接続します。

ルーターとしては使用しないのでWANは使わない

設定

ナンバーディスプレイにチェックを入れ外部から着信すると、SYSLOGに下記のような感じで出ます。電話機の方も問題なく電話番号が出ました(※後述のデメリットあり)。

> show log
2022/01/07 18:48:53: TEL[**/*] InComing Call from 090XXXXXXXX

SYSLOGからシステムにつなげる(Luaスクリプト)

他所にsyslogサーバ(syslogd)を起動してルータのsyslogを転送し、そちら側で良い感じにする方法もあるのですが、YAMAHAルータはルータ内でLua言語のスクリプトを動かすことができます。新しいファームウェアでは直接Slackへ通知する事も可能(HTTPS POST。NVR500は非対応)ですが、今回は間に電話番号→名前変換のシステムをはさみたいので、Syslog内の電話番号部分だけHTTPで外部へPOST(NVR500も対応)するLuaスクリプトを書きました。

telpost.lua

-- ルーターへの転送
-- copy usb1:/telpost.lua /telpost.lua
-- show status lua
-- terminate lua 1
-- lua /telpost.lua
-- schedule at 1 startup * lua /telpost.lua
-- save
-- スクリプトが落ちると終了するので注意

-- Setting
url = "http://example.com/post/"
ptn = string.regexp("TEL.* InComing Call from .*")

-- POST
function post_tel(url, postdata)
  local req_t = {
    url = url,
    method = "POST",
    content_type = "application/x-www-form-urlencoded",
    post_text = string.format("tel= %s\n", postdata)
  }
  local rsp_t = rt.httprequest(req_t)

  -- error
  if (rsp_t.code ~= 200) then
    rt.syslog("info", "[Lua] failed to send TEL data.")
  end
end

-- MAIN
local rtn, str
while (true) do
  rtn, str = rt.syslogwatch(ptn, 1)
  if (rtn > 0) then
    post_tel(url, str[1])
  end
end

顧客管理システム(CRM)と連携

上記でPOST→Slack通知(外出先から番号を知る)まではすぐにできましたが、このままだと電話番号が出るだけです。やりたいことの2番目「着信があった顧客をいい感じに管理したい」を何とかするなら専用サービスを使うのが将来性もあるのかなと、無料プランでもWebAPIに対応しているZohoCRMを使用することにしてみましたが、APIが自分としてはあまりにも癖が強く、ちょっとした事が(慣れて無いせいもあり)非常にややこしかったので、挫折。結局自作しました。

自作した機能(着信→Slackに下記内容を通知)

  • 名前
  • 前回着信日
  • 着信メモを保存
  • 0120だったり050の場合は「怪しい」として表示
  • 上記の編集機能

POSTされた番号をSlackに通知するまでのプログラム例

<?php

if (isset($_POST['tel'])) {

    // 電話番号を取得
    if (isset($_POST['tel'])) {
        $telno = getTelno($_POST['tel']);
    }

    // DBから検索して名前に変換したり色々と
    // 

    // Slackに送る
    sendSlack($telno);
}


// 電話番号の取得
function getTelno($post_data)
{
    preg_match("/TEL.* InComing Call from (.*)/", $post_data, $matches);
    $tel = $matches[1];
    return $tel;
}


// Slackに送る
function sendSlack($telno)
{
    $url = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXX";

    $message = [
        'attachments' => [
            [
                'text' => '着信です',
                "mrkdwn_in" => ["fields", "text"],
                'fields' => [
                    [
                        'title' => 'TEL',
                        'value' => $telno,
                        'short' => True,
                    ],
                ],
            ]
        ]
    ];

    $ch = curl_init();
    $options = [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => http_build_query([
            'payload' => json_encode($message)
        ])
    ];
    curl_setopt_array($ch, $options);
    curl_exec($ch);
    curl_close($ch);
}

Slackへの通知画面

情報編集画面

2ヶ月ほど使用していますが、やりたかったことは大体できています。

今回のシステムのデメリット

今回のシステムにしてから、電話機が鳴るまで3・4コールさせないと駄目(おそらくルータと電話機の2つで番号表示機能を使っているので、電話機で呼び出し音がなるまでに時間がかかる)になってしまいました。

番号通知させつつ、早くさせる方法があれば知りたいです。

暇になったらやってみたい

  • このルーターはIP電話を収容できるらしく、SIPサーバ(FreePBX,Asterisk)をLAN内に立てて色々やると、アナログ電話をIP化したり、着信をあれこれ(留守電をネット経由であれこれとか、プッシュ番号によって分岐させてあれこれとか)したりと楽しいらしい。
    https://www.freepbx.org/
  • 0120、050の時は外部の電話番号口コミサービスから情報取得。
    https://www.jpnumber.com/

まとめ

電話系は知らない言葉だらけ。電話番号のICT化は専用システムも沢山あるのですが、結構高めです。小規模な感じで、安価にやるなら悪くないような気がします。

コメント

タイトルとURLをコピーしました