Dahua VTH / VTO + Asterisk + Homebridge でセキュアなインターホン環境を構築 Vol. 4

# あらすじ
Dahua VTH / VTO + Asterisk + Homebridge でセキュアなを構築しようと考えていましたが、HomeBridgeプラグインでSIP双方向通信可能なものがみつからなかったため、Homekitは通知＆録画(Homekit Secure Video化)機能のみもたせ、実際の通話はiPhoneにインストールしたSoftPhoneで実装することにしました。

Vol4にしてやっと設定のお話です。

# 構成イメージ(再掲)
上手くNAT超えができなかったので、外部用Asterisk(in AWS)と内部用Asterisk(in Home)に分割しました。
<img width="400" alt="構成イメージ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445439/359c8417-11e8-445c-69a3-96c38bd7edc5.png">

# 設定(Homebridge)
※ Homebridge と Homebridge UI がインストールされている前提です。

* 必要なプラグイン
    * Homebridge Camera Ui
    * Homebridge Dummy (GeoFenceが必要な方のみ)

* Camera Uiの設定
admin:Dahua VTOの管理画面のID(通常変更不要)
Password:Dahua VTOの管理画面のパスワード
aaa.aaa.aaa.aaa:Dahua VTOのIPアドレス
　
ポイントは「"http": true」でHTTPサーバとして待ち受け、「"doorbell": true」でDoorbell化(HTTPサーバへのリクエストをトリガに通知出し&HomePodを鳴らすこともできる)

```shell
"http": {
    "active": true,
    "port": 19080,
    "localhttp": false
},
"cameras": [
    {
        "name": "DahuaIntercom",
        "motion": true,
        "doorbell": true,
        "switches": false,
        "unbridge": false,
        "hsv": true,
        "prebuffering": true,
        "prebufferLength": 4,
        "hksvConfig": {
            "source": "-i rtsp://admin:Password@aaa.aaa.aaa.aaa:554/cam/realmonitor?channel=1&subtype=1",
            "audio": true
        },
        "videoConfig": {
            "source": "-i rtsp://admin:Password@aaa.aaa.aaa.aaa:554/cam/realmonitor?channel=1&subtype=1",
            "vcodec": "copy",
            "acodec": "libfdk_aac",
            "audio": true,
            "subSource": "-i rtsp://admin:Password@aaa.aaa.aaa.aaa:554/cam/realmonitor?channel=1&subtype=1",
            "stillImageSource": "-i rtsp://admin:Password@aaa.aaa.aaa.aaa:554/cam/realmonitor?channel=1&subtype=1"
        },
        "videoanalysis": {
            "active": true
        },
        "motionTimeout": 15,
        "smtp": {
            "email": "DahuaIntercom"
        },
        "mqtt": {}
    }
],
```
　
* DummySwitchの設定(GeoFenceが必要な方のみ)：
```shell
{
    "name": "Anyone IN",
    "stateful": true,
    "reverse": false,
    "time": 1000,
    "resettable": false,
    "accessory": "DummySwitch"
}
```
　
* Home Appの設定(GeoFenceが必要な方のみ)：
    * 以下のオートメーションルールを設定します。
        * 最後の人が家を出発したとき："Anyone IN"をOFF
        * 最初の人が家に到着したとき："Anyone IN"をON

# 設定(Asterisk in Home)
* フラグファイルの書き出しスクリプト(GeoFenceが必要な方のみ)：
    * このファイルをcronで毎分実行するようにしてください。
    * aaa.aaa.aaa.aaa: HomebridgeのIP(とポート)
    * ID: HomebridgeのID
    * Pass: HomebridgeのPassword
    * [ItemID]: Homebridge内の"Anyone IN"のuniqueID
        * http:// aaa.aaa.aaa.aaa:8080/swagger もしくは http:// aaa.aaa.aaa.aaa:8080/api/accessories から確認可能
```shell
#!/bin/bash
TOKEN=`curl -s -X 'POST' 'http://aaa.aaa.aaa.aaa:8080/api/auth/login' -H 'Content-Type: application/json'  -d '{"username": "ID","password": "Pass"}'|jq -r '.access_token'`
VALUE=`curl -s -X 'GET' 'http://aaa.aaa.aaa.aaa:8080/api/accessories/[ItemID]' -H "Authorization: Bearer $TOKEN"|jq '.values.On'`
echo $VALUE > /usr/share/bin/status.txt
```
　
* extensions.conf
    * 上で作成したフラグファイルから値を取得し、誰かが家に居ればDahua VTHのみ、誰も家に居なければiPhoneを鳴らすように設定しています。
    * extentions内で直セルHomebrisgeのAPIを叩かないのは、HomebridgeのAPIの応答性が悪い（応答までに1-2秒かかる）ため
    * CURLコマンドの箇所でDoorbell化したHomebridgeのCameraUiにリクエストを渡しています。これでHomekitからの通知とHSVによる録画が可能です。
```shell
[from-internal]
exten => 8002,1,Set(foo=${CURL(http://aaa.aaa.aaa.aaa:19080/doorbell?DahuaIntercom)})
exten => 8002,2,Set(INHOME=${FILE(/usr/share/bin/status.txt)})
exten => 8002,3,GotoIf($[${INHOME} = 0]?9999,1)
exten => 8002,4,GotoIf($[${INHOME} = 1]?9998,1)

exten => 9998,1,Dial(PJSIP/8002,30,r) ; 誰かが家にいれば8002(Dahua VTHのみ鳴らす)
same => n,Hangup()

exten => 9999,1,Dial(PJSIP/8002&PJSIP/299@aws,30,r) ; 誰も家にいなければAsterisk in AWSの299(家族のSoftphoneにつながってます)を鳴らす
same => n,Hangup()
```