Raspberry PiでPBXとFAXの構築 - ステータスLEDの接続

投稿 2024/06/26 (水) 午後 02:46 | パソコン | hotall

RaspberryPiには、現在の状況を示す表示器は電源ランプとアクセスランプのみです。

PBXを運用していると、特に気になるのが子機との接続状況です。
そこで、LEDを外付けし、子機の状態を表示することにしました。

この文書は個人的なものであり、内容について一切の責任を負いかねます。



LEDのドライブ回路

回路設計




手元に、以前購入した2色LEDがあったので、これを活用することにしました。
各ランプは黄緑と赤の2色のLEDで構成されています。単純にON/OFFで駆動すると、消灯、赤、黄緑、オレンジの4つの状態を表せます。

カソードコモンなので、正論理となり、今回はRaspberryPiのIOポートから直接電力を供給します。

回路組立




手元の部品のみで、組み立てました。
RaspberryPiのIOポートに接続して完成です。

LEDの点灯プログラム
  • 4つのLEDに4つのエンドポイント(親機、子機)を割り当てます。
  • 各エンドポイントについて、4つの状態を表示します。
    • 消灯:未接続/未登録
    • 黄緑:接続中/待機中
    • 赤:呼出中
    • オレンジ:通話中
  • エンドポイントの状態はAsteriskのコマンドで問い合わせます。
ファイルパス:/usr/share/asterisk/custom-bin/endpointstat.sh

プログラム:
#!/bin/bash
#===================================================================================
#
# @(#) 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
stat?_cidに設定している1001から1003は子機、hikari-trunkは親機(外線)です。表示したい端末を設定してください。

プログラムファイルの属性設定

cd /usr/share/asterisk/custom-bin
sudo chmod 755 endpointstat.sh

起動はcronを使い、毎分、実行します。

cronのコンフィギュレーション

sudo crontab -e

設定内容:
* * * * * sudo bash /usr/share/asterisk/custom-bin/endpointstat.sh



■ RaspberryPiでPBXとFAXの構築 - 目次 -
  1. 構成
  2. ひかり電話RV-230SEの設定
  3. OSのセットアップ
  4. LANアダプタの接続
  5. ユーティリティのセットアップ
  6. PBXのセットアップ
  7. ソフトウェアモデムのセットアップ
  8. FAXのセットアップ
  9. 自動再起動
  10. ▶ステータスLEDの接続
  11. ケースに収納・設置
  12. トラブルと対応
  13. 迷惑電話対策
« PrevNext »

コメント

コメントはありません。

コメントする