在宅会議乱入防止システム
これは 身の回りの困りごとを楽しく解決! by Works Human Intelligence Advent Calendar 2022 23日目の記事です。
背景
流行に乗っかって在宅デビューしたものの、Zoom会議中に乱入されるという苦しい日々が続きました。
(Zoom会議中)
BOSS「このプロジェクト進捗がよくないね」
我「すみません」
(ガチャ(扉が開く音))
妻「今週末のキャンプ場、候補が3つほどあるから選べ」
我「すいません会議中です」
妻「先に教えとけよ」
我「申し訳ありません」
みたいなことが時々あったので、何とかならないかなって悩んでいました。
既存のアプローチ
- Google Calendar を共有してみた。見てくれない。
- 鍵を買ってみた。ウチのドアにはハマらなかった。
- 会議中の札を買ってみた。娘に盗まれた。
- 会議中の札を買ってみた。娘に破壊された。
在宅会議乱入防止システム
というわけで色々試行錯誤した結果どれもうまくいかず、最終的に会議中かどうかを検知してドア脇に目立つようで表示するシステムを作りました。今のところいい感じに機能しています。
設計・実装
PC 上に Zoom 会議中かを判定するクライアントプログラム (onair-cli
) を配置して、その判定結果をサーバ (onair-be
) へ送信。表示端末からサーバへアクセスし、判定結果を表示しています (onair-fe
) 。
onair-cli
PC 上に配置されるクライアントプログラムです。 Zoom または Slack Huddle で会議中かどうかを検知します。Python で書かれています。仕組みとしては、登録されたシェルスクリプトを定期的に実行して、シェルスクリプトがステータスコード1を返すと会議中と判定し、結果をサーバへポストするという感じです。
Zoom 会議検知用のシェルスクリプトと Slack Huddle 検知用のシェルスクリプトの二つが登録されています。検知はかなりヒューリスティックな方法でやっていて、例えば、会議中に走る・増える特定のプロセス名を探すといったことをしています。バージョンアップでなにか条件が変わればスクリプトをゴニョゴニョする方向性です。
Python はちょっとだけセットアップが面倒なので、Go で書き換えて置くだけポンできるようにしたいなって思っています。
onair-be
クライアントプログラムから判定結果を受け取り、表示端末へ送信するバックエンドプログラムです。Rustで書かれています。HTTP POST で判定結果を受け取る API、HTTP GET で判定結果を返す API、そして、WebSocket で判定結果の更新を配信する API を提供しています。また、静的ファイルとして、フロントエンドの HTML ファイル等を返します。
poem
というフレームワークを使って見ました。DB や GRPC 、OpenAPI など色々なインテグレーションに力を入れてる印象ですが、今回は至ってシンプルなサーバなのでいずれも特に使っていません。
サーバは押入れの中で密かに稼働している Raspberry Pi を利用しており、通信は自宅内 LAN で全て閉じています。
onair-fe
バックエンドから判定結果を受け取って、ありったけ目立つ色で表示するフロントエンドです。React / Typescript で書かれています。
開いた時に HTTP GET で最新の判定結果を取得して表示しつつ、WebSocket で更新をサブスクライブしています。会議中は強烈な赤を、それ以外は緑を表示します。サーバとの接続が切れた時に間違った判定結果を表示し続けたくないので、ハートビートを実装して、途絶えるとグレーでオフラインと表示するようにしています。赤だったら乱入禁止、緑だったら乱入可能、それ以外だったら気をつけてという気持ちです。
端末は押し入れに眠っていた古い iPhone を使っています。
リビングに設置
エアコンのそれが空いていたので、設置しました。これで娘がコンセントを抜くこともなく、さらにリビングから会議中かどうかわかるのでご好評いただいています。
リビングに端末を置くことで、コーヒーください機能や通話機能など実装すればもっと色々なことができそうなので夢は広がります。
結果
(Zoom会議中)
BOSS「このプロジェクト進捗がよくないね」
我「すみません」
(ガチャ(扉が開く音))
妻「年末の旅行先、候補が3つほどあるから選べ」
我「すいません会議中です」
妻「あいつのコネクション切れてっぞ」
我「申し訳ありません」
闘いは続きそうです。
Discussion