raspberry pi 3B+でテレビ電話システムを構築する(sapislab版)
システム概要
raspberry pi 3B+ によるテレビ電話システム
※既存の投稿をwherebyとsapislabを使ったバージョンに変えたものです
※記載内容に責任は持てません、全て自己責任でお願いします
概念図
背景
- 妻が夕食の準備中に子供の相手が大変である
- おばあちゃんが一人なので心配である
改善案
- 子供とおばあちゃんが気軽にテレビ電話が出来るようにする
要件
- テレビ電話が出来ること
- 手軽に使えること(煩雑だと結局使われない)
- 費用は抑えること(常套句)
想定シナリオ
- 妻が子供たちを連れて帰宅
- 我が家からリモコンでスイッチオン
- 我が家とおばあちゃん家のテレビが自動でONになりテレビ電話を開始する
- 我が家からリモコンでスイッチオフ
- 我が家とおばあちゃん家のテレビが自動でOFFになりテレビ電話を切断する
前提条件
- おばあちゃんに家のテレビが勝手にONになってリビングが映し出されるプライバシー的な問題について予め了承を得ておくこと(※同居人が居る場合はその方にも)
- VPNは張らない
用語
- 我が家はcallerに置き換える(呼び出し側)
- おばあちゃん家はreceiverに置き換える(受け手側)
- 途中に出て来るvtcはvideo telephone controlerを略したもの
必要なもの
- raspberry pi 3B+ を2セット
- ヒートシンクは付けておいた方が良いと思う
- 電源やSDカード等の別途必要なものは明示しない
- OSはraspbianを想定
- webカメラを2個
- 1000円程度のもので十分
- USBマウス・USBキーボード
- セットアップ用途
- AB Shutter3 を1個
- シェル起動のトリガーになるなら何でも構わない
- caller,receiver両方のネットワーク環境(従量制ではないこと)
- テレビ電話サービスのwherebyにアカウント登録
- こちらから登録できます
- 状態遷移用にキーバリューサービスのsapislabにアカウントを用意
- こちらから登録できます
仕組み
- APIサーバーを仲介役として、callerから指示を出し、receiverがポーリングで反応する
- こうする事でIPが変わる環境でも間接的な連携が可能となる
- ネットワーク的にも分断されたままなので安心(?)
- テレビ電話はskypeも検討したが直接はインストールできない為、ブラウザベースのものを利用
- 特定のURLにアクセスしたら繋がるタイプ(apeer.inやskyway)を使う
- たまたま同じルームを作ってしまって丸見えになる覚悟も必要(skywayでローカルに立てる方式なら問題無さそう)
- 絶対にNGであれば有料会員になってLockすれば大丈夫だと思う(試してない)
状態遷移図
開始処理のシーケンス図
終了処理のシーケンス図
やり方
raspberry pi 3(caller, receiverともに)
- ネットワーク設定(wifiとか)
- スクリーンセーバーの無効化
- cec-clientのインストール(HDMI制御に使う)
- $ sudo apt-get install cec-utils
- gitが入ってなかったらインストール
- $ sudo apt-get install git
- 接続用エージェントプログラムの配置(piのhomeに配置する前提で進める)
- $ cd ~
- $ git clone https://github.com/miya15/vtc-agent-sapislab.git
wherebyでパーソナルルームを作成する
- wherebyアカウントを登録していない場合
- こちらから登録
- wherebyにログイン
- こちらからログイン
- パーソナルルームを作成する
- ポイントはオープン(ロックしない)にしておくこと
- 第三者が推測できないランダムなルームIDにしておくこと
- caller, receiver共に一度ルームに入って任意の名前で入室設定を済ませておくこと
- これをやっておかないと自動的に接続しても入室完了にならない
- ルームIDは後で使うのでメモしておく
sapislabでキーバリューを用意する
- sapislabアカウントを登録していない場合
- こちらから登録
- sapislabにログイン
- こちらからログイン
- APIキーを作成する
- キーバリューを作成する
- 操作方法はこちらを参照
- キーは任意で良い(メモしておく)
- バリューは「{"state": "close", "url": "https://whereby.com/yourRoomId"}」を入れておく
- yourRoomIdの部分はwherebyで用意したルームIDに置き換える
raspberry pi 3(receiverのみ)
- APIキーとSecretキーとキーバリューのキーを設定する
- 「vtc-exec-receiver.sh」をcronで定期実行させる
raspberry pi 3(callerのみ)
- AB Shutter3 で任意のシェルが叩ける準備(下記の記事を参考に準備する)
- ON用のボタンが押されたら「/home/pi/vtc-agent-sapislab/vtc-exec-caller-on.sh」を叩くようにする
- OFF用のボタンが押されたら「/home/pi/vtc-agent-sapislab/vtc-exec-caller-off.sh」を叩くようにする
- どちらのシェルスクリプトにもAPIキーとSecretキーとキーバリューのキーを記載する場所があるので前述のreceiver側と同様に設定する
注意事項
- 電化製品なので漏電や火災に気を付けましょう
- 各種OSやミドルウェアのバージョンを新しく保つよう心がけましょう
- raspberry pi もパソコンですからBOT化しないよう気を付ける
- テレビによってはHDMIの制御が効かないものがあります、ご注意ください
- まずはraspberry piを1台だけ買って双方のテレビに繋いでコマンド投げて試す方が良い
- 接続先URLをAPIサーバーから取得するようになっているので気になる方は直接プログラムに埋め込んだ方がより安全です
- URLが変更できるようになっているのはルームIDを変更したり別のサービスに切り替えるのが手軽に出来るようにする為です
今後の発展
- 状態遷移はjson形式で渡しているので遷移を増やすと面白いかもしれない
- 定期的にAIで在席・不在を判断できるとその後のアクションにも繋げられるか
運用中に発生した問題点について
- receiver側でHDMIの制御がうまくいかない事があった
- 実際に繋がると子供(5歳男児)は映っている自分に興奮して踊りだし、おばあちゃんとの会話にならない(苦笑いしてるというありさま)
- 完全に想定外
メモ
- 今回はraspberry piを使う事が前提にあったが、intel系のスティックPCとかでskypeを使う方式としても使えるかもしれない(skypeには自動応答機能があるので、コマンドラインからコール出来れば完成したようなもの)
- プログラムが最適化されていない点はご容赦ください
- バグなどありましたらコメント頂けるとありがたいです
- 取り敢えず1ヵ月ほど運用してみましたがうまく動いています(思ったほど活用されてないのが残念ですが・・・)