openHAB2 と Asterisk の連携

openHAB2 と Asterisk の連携

電話機にて各スイッチ等の操作をするための連携方法について解説していきます

前提条件
Asterisk インストールパソコンの IP アドレス : 192.168.0.100
openHAB2 インストールパソコンの IP アドレス : 192.168.0.200
openHAB2 が利用するAsterisk CLI のユーザー名 : openhab
openHAB2 が利用するAsterisk CLI のパスワード : password
Asterisk で使用する内線番号(ドアフォン): 1005
OpenHAB2 の鍵をコントロールする item 名 : LkDoor
なお、Asterisk のバージョンは 16 の FreePBX にて検証しております。

まず、Asterisk パソコンにて、Asterisk CLI ユーザーとパスワードを作成します。
Asterisk パソコンにログインし、以下のコマンドで manager.conf を開きます。

SUDO vi /etc/asterisk/manager.conf

include manager_additional.conf の行の前か、
include という文字がなければ末尾に以下の内容を追記し、「:wq」にて書き込みます。

[openhab]
secret = password
deny=0.0.0.0/0.0.0.0
permit=192.168.0.200/255.255.255.255
read = call,dtmf
write = call,dtmf

deny には、接続を拒否するアドレスを記載します。
permit には、接続を許可するアドレスを記載します。
Asterisk と openHAB2 を同一パソコンで動かしている場合は、
permit=127.0.0.1/255.255.255.255
192.168.0.0 ~ 192.168.0.255 の範囲の同一ネットワーク内からのアクセスを許可する場合は、
permit=192.168.0.0/255.255.255.0
となります。
書き込んだら、Asterisk パソコン からはログオフしてかまいません。

次に、openHAB2 パソコンにて、Asterisk の Addon のインストールを行います。
openHAB2 パソコンにログインし、以下のコマンドを入力してください。

wget https://openhab.jfrog.io/openhab/libs-pullrequest-local/org/openhab/binding/org.openhab.binding.asterisk/1.14.0-SNAPSHOT/org.openhab.binding.asterisk-1.14.0-SNAPSHOT.jar
sudo chown openhab:openhab org.openhab.binding.asterisk-1.14.0-SNAPSHOT.jar
sudo mv org.openhab.binding.asterisk-1.14.0-SNAPSHOT.jar /usr/share/openhab2/addons

openHAB2 のサービスの設定を行います。
以下のコマンドにて /etc/openhab2/servicesasterisk.cfg ファイルを作成してください。

sudo vi /etc/openhab2/services/asterisk.cfg

内容は、以下のようになります。

############################### Asterisk Binding ######################################
#
# Please note: The Asterisk Management Interface (AMI) has to be activated in the
# manager.conf file of your Asterisk PBX.

# hostname of the AMI
host=192.168.0.100

# the username and password to login to the AMI
username=openhab
password=password

Asterisk と openHAB2 が同一パソコンで稼働している場合は、
host=127.0.0.1
となります。Asterisk CLI ユーザー名/パスワードは適時お好きな設定に変更してください。

sudo vi /etc/openhab2/items/Phones.items

内容は以下の通りになります。
なお、/etc/openhab2/items の .items のどこかに
Group myHouse “我が家”
Group MyPhons “電話機” (myHouse)
と、グループ設定が記載されているものとします。

Switch CallLight        "電話使用中"           <siren>          (MyPhons)     { asterisk="active:*:*" }
Call Active_Call        "Connected [to %1$s from %2$s]"         (MyPhons)     { asterisk="active:*:*" }
Switch BedphoneIn       "ドアフォン送信"       <siren>          (MyPhons)     { asterisk="active:1005:*" }
Switch BedphoneOut      "ドアフォン受信"       <siren>          (MyPhons)     { asterisk="active:*:1005" }
Switch PhoneKey1        "ドアフォン鍵操作"                     (MyPhons)     { asterisk="digit:*:1005:1" }
String CallFrom         "Called From [%s]"                     (MyPhons)
String CallTo           "Called To   [%s]"                     (MyPhons)

asterisk=”active*:*” の、前の「*」は、通話元何でもという意味で、電話番号を入れるとその番号に限定されます。
同じように、後ろの「*」は、通話先何でもという意味で、電話番号を入れるとその番号に限定されます。
digitの最後の「:」の後ろの番号が、プッシュ信号認識になっていて、「:1」は、1を押したときという意味です。
プッシュ認識は1文字しか認識できないようです。

ルールを作成します。
以下のコマンドを入力し、Phons.rules ファイルを作成してください。

sudo vi /etc/openhab2/rules/Phons.rules

内容は以下の通りとなります。

rule "Phone Rule Print Caller"
when
    Item Active_Call changed
then
    var i = Active_Call.state.toString.length
    if (i < 3)
    {
        logInfo("Active_Call CallerID", "Clear")
        logInfo("Active_Call DestinationID", "Clear")
        CallFrom.postUpdate("Empty")
        CallTo.postUpdate("Empty")
    } else {
        val CallerID = Active_Call2.state.toString.split(',').get(0)
        val DestinationID = Active_Call2.state.toString.split(',').get(1)
        if (tel00 != "s" && tel01 != "s")
        {
            logInfo("CallTest value0", CallerID)
            logInfo("CallTest value1", DestinationID)
            CallFrom.postUpdate(CallerID)
            CallTo.postUpdate(DestinationID)
        }
    }
end

rule "Phone DoorKeyOpen Rule"
when
    Item PhoneKey1 changed to ON
then
    sendCommand(LkDoor, OFF)
    delayTimerLkDoor = createTimer(now.plusSeconds(10)) [|
                sendCommand(LkDoor, ON)
                delayTimerLkDoor = null
    ]
end

rule “Phone Rule Print Caller”
CallFrom に、文字列として通話元が、CallTo に、通話先が表示されますので、sitemap ファイルで MyPhons グループを表示させておけば、
電話がかかってきたときにどこからかかってきたかとか、かけた時にどこにかけたか表示できます。

rule “Phone DoorKeyOpen Rule”
ドアフォンから着信があった時や、ドアフォンに電話をかけて、通話中に電話機の「1」を押すことで
10 秒間だけ鍵を開けることができます。