PBXを運用していると、特に気になるのが子機との接続状況です。
そこで、LEDを外付けし、子機の状態を表示することにしました。
LEDのドライブ回路
手元に、以前購入した2色LEDがあったので、これを活用することにしました。
各ランプは黄緑と赤の2色のLEDで構成されています。単純にON/OFFで駆動すると、消灯、赤、黄緑、オレンジの4つの状態を表せます。
カソードコモンなので、正論理となり、今回はRaspberryPiのIOポートから直接電力を供給します。
手元の部品のみで、組み立てました。
RaspberryPiのIOポートに接続して完成です。
LEDの点灯プログラム
- 4つのLEDに4つのエンドポイント(親機、子機)を割り当てます。
- 各エンドポイントについて、4つの状態を表示します。
- 消灯:未接続/未登録
- 黄緑:接続中/待機中
- 赤:呼出中
- オレンジ:通話中
- エンドポイントの状態はAsteriskのコマンドで問い合わせます。
プログラム:
#!/bin/bashstat?_cidに設定している1001から1003は子機、hikari-trunkは親機(外線)です。表示したい端末を設定してください。
#===================================================================================
#
# @(#) endpointstat.sh ver.1.0
# /usr/share/asterisk/custom-bin
#
# Description:
# Asteriskの端末の状態を調べ、LEDの点灯/消灯を制御します。
# This program must be executed by bash.
#
# Created: 2023/09/26 by Yasuaki Nojiri
#
#===================================================================================
set -e
#=== FUNCTION ==================================================================
# Name : IOポートの初期化
# Description : 指定した緑LEDと赤LEDのポートを初期化します。
# Parameter 1 : 赤LEDのポート
# 2 : 緑LEDのポート
#===============================================================================
init_port () {
# 赤LEDのポートを初期化
echo "$1" > /sys/class/gpio/export
echo out > "/sys/class/gpio/gpio$1/direction"
# 緑LEDのポートを初期化
echo "$2" > /sys/class/gpio/export
echo out > "/sys/class/gpio/gpio$2/direction"
return 0
}
#=== FUNCTION ==================================================================
# Name : エンドポイントの状態を表示
# Description : 指定したエンドポイントの状態を調べ、指定したLEDポートに出力します
# Parameter 1 : Asteriskから取得したステータス情報
# 2 : エンドポイントのCID
# 3 ; 赤LEDのポート
# 4 : 緑LEDのポート
#===============================================================================
show_endpointstat () {
# 指定したCIDの行を取得
local endpoint_stat=$(echo "$1" | grep "$2")
# ステータスを解析
if [ "$endpoint_stat" == "" ]; then
# Not define
echo 0 > "/sys/class/gpio/gpio$3/value"
echo 0 > "/sys/class/gpio/gpio$4/value"
elif [[ "$endpoint_stat" =~ "Unavailable" ]]; then
# Unavailable
echo 0 > "/sys/class/gpio/gpio$3/value"
echo 0 > "/sys/class/gpio/gpio$4/value""
elif [[ "$endpoint_stat" =~ "Not in use" ]]; then
# Not in use
echo 0 > "/sys/class/gpio/gpio$3/value"
echo 1 > "/sys/class/gpio/gpio$4/value"
elif [[ "$endpoint_stat" =~ "Ringing" ]]; then
# Ringing
echo 1 > "/sys/class/gpio/gpio$3/value"
echo 0 > "/sys/class/gpio/gpio$4/value"
elif [[ "$endpoint_stat" =~ "In use" ]]; then
# In use
echo 1 > "/sys/class/gpio/gpio$3/value"
echo 1 > "/sys/class/gpio/gpio$4/value"
else
# other
echo 0 > "/sys/class/gpio/gpio$3/value"
echo 0 > "/sys/class/gpio/gpio$4/value"
fi
return 0
}
#=== FUNCTION ==================================================================
# Name : main
# Description : Main routine
# Parameters : Program arguments
#===============================================================================
main () {
local ret=0
local stat1_cid="1001"
local stat2_cid="1002"
local stat3_cid="1003"
local stat4_cid="hikari-trunk"
local stat11_io=6
local stat12_io=12
local stat21_io=13
local stat22_io=16
local stat31_io=19
local stat32_io=20
local stat41_io=21
local stat42_io=26
local endpoints_stat=""
if [ ! -d "/sys/class/gpio/gpio$stat11_io" ]; then
# Initialize io ports
init_port "$stat11_io" "$stat12_io"
init_port "$stat21_io" "$stat22_io"
init_port "$stat31_io" "$stat32_io"
init_port "$stat41_io" "$stat42_io"
fi
# retreave endpoints status
endpoints_stat=$(sudo asterisk -x "pjsip show endpoints" | grep Endpoint:)
# endpoint #1 status
show_endpointstat "$endpoints_stat" "$stat1_cid" "$stat11_io" "$stat12_io"
# endpoint #2 status
show_endpointstat "$endpoints_stat" "$stat2_cid" "$stat21_io" "$stat22_io"
# endpoint #3 status
show_endpointstat "$endpoints_stat" "$stat3_cid" "$stat31_io" "$stat32_io"
# endpoint #4 status
show_endpointstat "$endpoints_stat" "$stat4_cid" "$stat41_io" "$stat42_io"
return 0
}
# Call the main routine
main "$@"
exit $ret
cd /usr/share/asterisk/custom-bin
sudo chmod 755 endpointstat.sh
起動はcronを使い、毎分、実行します。
sudo crontab -e
設定内容:
* * * * * sudo bash /usr/share/asterisk/custom-bin/endpointstat.sh