カメラも付き、オーディオボードも付いたので、sipドアホンを作ります。
カメラは、Raspberry Piで作るsipカメラを、オーディオボードは、Rasberry Pi Codec Zero オーディオボードをご覧ください。
ハードとソフト
Raspberry Pi
- Raspberry Pi Zero 2 W
- Camera Module v3
- スピーカーを付けた、Codec Zero
- libcamera-tools
- baresip、baresipy、自作のpythonプログラム
Raspberry Pi以外
- openwrt機上のasterisk
- ddnsサービス
- ソフトフォン(acrobits有料)
asteriskをPPPoEの別セッションのopenwrt機に移したので、WiFiからは、asteriskへstunありで、常に外からアクセスする形にしました。
.baresip/accountsには、
;stunserver="stun.l.google.com:19302";medianat=stun
を加えました。
baresip
baresipの動画関係は、
# Video
#video_source v4l2,/dev/video0
#video_display x11,nil
video_size 160x120
video_bitrate 500000
#video_fps 25.00
video_fps 3.00
video_fullscreen no
#videnc_format yuv420p
となっています。かなり荒い解像度です。これでもacrobitsは、こま飛びしてしまいます。moduleは、avcode.so、v4l2.so、v4l2_codec.soを有効にします。avcodecは、
avcodec_h264enc h264_v4l2m2m
を使います。
音声関係は、defaultのままです。
ここまでで、
$ libcamerify baresip
で起動し、raspiの内線にacrobitsでかけて、動画と音声を確認します。
baresipy
baresipyは、自らbaresipのコンソール端末となり、自作のpythonプログラムでbaresipを操作できるようにしてくれるものです。
python仮想環境
pipでpackageをいれるために、python仮想環境を作ります。
$ python -m venv --system-site-packages 「フォルダー」
とします。--system-site-packagesは、gpiozeroを使えるようにします。
$ . 「フォルダー」/bin/activate
で仮想環境に入ります。
$ pip install baresipy
で、baresipyを入れます。
自作プログラム
以下、Codec Zeroのボタン(GPIO27)を押すと内線にダイアルするpythonプログラム、intercom.pyです。
from baresipy import BareSIP
from threading import Thread
import pexpect
import gpiozero
class Intercom(BareSIP):
def __init__(self, debug = False, block = True):
self.debug = debug
self.user = None
self.tts = None
self._login = None
self._prev_output = ""
self.running = False
self.ready = False
self.mic_muted = False
self.abort = False
self.current_call = None
self._call_status = None
self.audio = None
self._ts = None
self.baresip = pexpect.spawn('libcamerify baresip')
Thread.__init__(self)
self.start()
if block:
self.wait_until_ready()
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("number")
parser.add_argument("--gpio-btn", type=int, default=27)
args = parser.parse_args()
print(args)
i = Intercom()
def on_button_pressed():
print("button pressed")
i.call(args.number)
print("called")
btn = gpiozero.Button(args.gpio_btn, pull_up = True, bounce_time = 0.1)
btn.when_pressed = on_button_pressed
これを、
$ python intercom.py 「内線番号」
で、起動します。Codec Zeroのボタンを押すと、「内線番号」にダイアルするので、acrobitsで受けます。
あとがき
- Zoiperは、ドアホンから掛ってきたのをビデオ通話で受けても黒い画面のままで映りません。
- asteriskのほうで、「内線番号」にかけると固定電話とacrobitsが鳴るようにしています。
- 現在のチャイムは電池式です。実際の玄関の設置には、そのスイッチの2線を電源線に使おうと思っています。スイッチのところのスペースがせまいので、露出型のコンセントボックスに収容しようと思います。なかなか工作が難しいので、実際には設置できないかもしれません。