NVR510でIIJmioひかり電話が使えるようにし、電話着信があったらメール通知する

# はじめに
IIJmioのひかり回線とひかり電話を導入しました。

ひかり電話を導入するには基本的に月額300円でルーターをレンタルしないといけなかったのですがそれが嫌だったのでYAMAHAのNVR510というルーターを中古で買いました。こいつが結構使えるやつで、Web GUIから簡単にセットアップができました。なので、そのセットアップの仕方とひかり電話がきたらメール通知するようにするやり方をメモしておく。

# Step0. 前提
以下を契約、準備する
* IIJmioひかり
    * IPoEオプション -無料
    * ヒアリングのときに小型ONUを使用すると申し出ること
    * ひかり電話
        * 固定電話機本体。例えば、VE-GD21-W 3600円@メルカリ　など
        * ナンバーディスプレイオプション（ないと着信履歴がつかない）
* NVR510 -ラクマで2万9千円にて購入
    * 適当なmicro SDカード
* 必要に応じて適当な無線LANルーター（NVR510にはWi-Fi機能はついていないので）

# Step1. NVR510でインターネット接続(IPv6 IPoE+Ds-Lite(taransix))
色々難しいコード(config)での設定がwebにありますが、ええいわからん！ということで見つけた手順。
コードでの設定は一切しません。web UIにログインして以下の通りにやります。

以下の手順は一度初期化を行い、まっさらな状態でスタートしてください。初期化はNVR510の場合、裏側のiniスイッチを押しながら電源ONです。

**かんたん設定：プロバイダー接続**

:::note warn
注意
これは一切設定しない。
:::
一切設定しません。むしろ設定するとインターネットにうまく接続できなくなった覚えがあります。


**かんたん設定：VPN → 拠点間接続**
1. 接続種別: IPIP
2. IPIP設定
設定名: 任意
接続先ホスト: gw.transix.jp
ポート開放: 指定しない
IPIPキープアライブ: 使用しない
3. 経路: デフォルト経路

これだけインターネットに接続できるようになります。

# Step2. ひかり電話の設定

**かんたん設定：IP電話→ひかり電話**
1. ひかり電話の設定：ひかり電話を使用する
1. インターフェースの選択：ONU
1. プレフィックスの設定：設定なし

簡単ですね。これだけです。あとはメール通知できるようにしていきます。

参考までに、

**詳細設定：IP電話→TELポート**
1. ナンバー・ディスプレイ: 使用する

この設定をしておかないと、電話に着信履歴が残りません。



# Step3. 電話着信をメール通知する


元ネタは[NVR500のLUAスクリプトを使って電話着信をメール通知するようにしてみた](https://www.guilz.org/2015/04/19/nvr500%E3%81%AElua%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E9%9B%BB%E8%A9%B1%E7%9D%80%E4%BF%A1%E3%82%92%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%9A%E7%9F%A5/ )です。改変点はgmailを使えるようにしたことと、メールの内容をユーザフレンドリーにしました。非通知着信の場合は着信を通知しても意味がないので意図してメール通知しないようにしています。

以下のluaスクリプトを使います。設定方法などは下部にあります。

``` lua call.lua
--[[
 
	●SYSLOG 監視スクリプト
　　SYSLOG を監視し、特定の文字列が含まれたログを検出したら、指定した show コ
　　マンドおよび show log コマンドの出力結果を管理者にメールで送信するスクリプ
　　トです。
 
	＜説明＞
	・このファイルを RTFS か外部メモリに保存してください。
	・本項目の config の設定では schedule at コマンドでルーター起動時に Lua スク
	リプトが実行されるように設定しています。
	・スクリプトを停止するときは terminate lua コマンドを実行してください。
	・再度、Lua スクリプトを実行する場合は lua コマンドで実行してください。
	・★マークの付いた設定値は変更が可能です。
 
	＜ノート＞
　・メールの送信失敗時に出力する SYSLOG レベルを指定可能です。
　　SYSLOG のレベルを指定するには、log_level を設定してください。
　　debug レベル、notice レベルの SYSLOG を出力するためには、それぞれ以下の設定
　　が必要です。
　　　debug レベル ･･･ syslog debug on
　　　notice レベル･･･ syslog notice on
　・本スクリプトファイルを編集する場合、文字コードは必ず Shift-JIS を使用してく
　　ださい。

]]


--------------------------##	設定値	##--------------------------------

-- 検出したい SYSLOG の文字列パターン

ptn = "SIP Call from"	-- ★

-- ptn の文字列パターンを検出した時に結果を通知する show コマンドをカンマで区切って列挙する
-- 例えばルーターの設定を通知する場合には、"show config" を、
-- ログを通知したい場合には "show log" を記述する
cmd_ptn = "show history | grep TEL | grep 通信中"

-- メールの設定
mail_tbl = {			-- ★
	smtp_address = "smtp.gmail.com",
	smtp_port = "465",
	smtp_auth_protocol = "plain",
	smtp_auth_name = "USER-ID",
	smtp_auth_password = "PASSWORD",
	from = "USER-ID@gmail.com",
	to = "USER-ID@gmail.com",
	smtps = true
}

-- メールの送信に失敗した時に出力する SYSLOG のレベル (info, debug, notice)
log_level = "debug"	-- ★

----------------------##	設定値ここまで	##----------------------------

------------------------------------------------------------
-- コマンドを実行結果を出力する関数					--
------------------------------------------------------------
function exec_command(cmd)
	local rtn, str

	rtn, str = rt.command(cmd)
	if (not rtn) or (not str) then
		str = "実行失敗\r\n"
	end

	return rtn, string.format("# %s\r\n%s\r\n", cmd, str)
end

------------------------------------------------------------
-- 現在の日時を取得する関数						 --
------------------------------------------------------------
function time_stamp()
	local t

	t = os.date("*t")
	return string.format("%d年%02d月%02d日 %02d:%02d:%02d", 
		t.year, t.month, t.day, t.hour, t.min, t.sec)
end

------------------------------------------------------------
-- メインルーチン								 --
------------------------------------------------------------

while (true) do
	local rtn, str
	rtn, str = rt.syslogwatch(ptn)
	if (rtn) and (str) then
		rtn, str = exec_command(cmd_ptn)
		local phone_num = string.match(str, string.regexp("0[0-9]{9,10}"))
		if(phone_num~=nil) then
			mail_tbl.text = phone_num .. " から着信がありました。\r\n\r\n着信日時:".. time_stamp()
			mail_tbl.subject = "【NVR510】着信通知 from " .. phone_num
			rtn = rt.mail(mail_tbl)
			if (not rtn) then
				rt.syslog(log_level, "failed to send mail. sd1:/local/call.lua")
			end
		end
	end
end
```

## Step3.1 設定方法
設定値をいい感じに設定してください。ここはコードを改変する必要がありますが、さほど難しくありません。自分の場合、fromとtoを同じアドレスにして自分にメールするようにしています。

なおgmailでメール通知するためにはGoogleアカウントのパスワードではなく、アプリパスワードを生成する必要があります。アプリパスワードについてはGoogleの[アプリ パスワードでログインする](https://support.google.com/accounts/answer/185833?hl=ja) を参照してください。

コードの修正（設定）が終わったら、mico SDカードにの直下にlocalディレクトリを作り修正したスクリプトをcall.luaで保存

mioro SDカードをNVR510に挿入し、web UIの管理→保守→コマンドの実行から下記を入力
```
schedule at 1 startup * lua sd1:/local/call.lua
```

# Step4.完成

すべてが上手く行けば、着信があるたびにこのようなメールが来ます。

```
Subject :【NVR510】着信通知 from　08011111111


Model: NVR510
SystemName: NVR510_xxxxxx
Revision: Rev.15.01.24
Time: 2022/09/24 15:05:49

08011111111 から着信がありました。

着信日時:2022年09月24日 15:05:46
```
ほんとは、不在着信だけ通知するようにしたかったし、メールの冒頭のModel、SystemNameなども消したかったけど、よくわからなかったので放置。

いいNVR510ライフを！