『ただ今オンライン会議中』を自動でお知らせする仕組み

# 1. 目的
在宅でのオンライン会議中に、家族が仕事部屋に入ってきてしまいカメラに映り込んでしまうというのはリモートワークあるあるかと思います。このあるあるを解決するために、現在オンライン会議中かどうかを部屋の外から一目でわかる仕組みを作ることにしました。

# 2. 概要
ざっくりこんな感じのものを作ろうとしています↓
![onair2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128340/acc552af-627e-42fb-2eb1-59636fc992be.png)
* 仕事部屋のドアの外にサインランプを設置
* オンライン会議を開始すると、自動でサインランプが点灯
* オンライン会議が終了すると、自動でサインランプが消灯

# 3. 準備

### １）用意したもの
* [SwitchBot プラグミニ](https://www.amazon.co.jp/gp/product/B09PYLWNGV/ref=ppx_od_dt_b_asin_title_s00?ie=UTF8&psc=1)（2,000円くらい）
![61ayglqUiyL._AC_SX679_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128340/10c186e3-d47d-1254-99b0-a1362d491c5b.jpeg)

* [Alfoto ON AIR サインランプ](https://www.amazon.co.jp/gp/product/B085G4F72K/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)（1,500円くらい）
![41RPYTv+sBL._AC_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128340/8fca3636-56a8-ba73-8918-8ab73613f4fe.jpeg)
※ サインランプは家庭用コンセントから電力供給するタイプで、物理的なスイッチでON／OFFができるものであれば何でもOKです。

### ２）開発環境
* MacOS Monterey ver12.4
* SwitchBotプラグミニ ファームウェア ver1.2

# 4. 開発

工程は以下の3ステップです。

【STEP1】SwitchBotプラグミニを使ってサインランプをスマートホーム化する
【STEP2】SwitchBot APIを使ってサインランプの点灯／消灯を操作する
【STEP3】オンライン会議ソフトの操作に合わせてSwitchBot APIを叩く

順に解説します。

### 【STEP1】 SwitchBotプラグミニを使ってサインランプをスマートホーム化する
まずはサインランプのスマートホーム化から行います。
![IMG_4270_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128340/5dc04c5a-5d29-be3a-a7c3-dd646d9e7b33.jpeg)
上記のように、SwitchBotプラグミニを間に挟み、サインランプの電源コードをコンセントに接続します。

SwitchBotプラグミニの初期セットアップ方法については、公式サイトを参考に設定を行ってください。
[SwitchBotプラグのセットアップ方法](https://support.switch-bot.com/hc/ja/articles/360049362413-SwitchBot%E3%83%97%E3%83%A9%E3%82%B0%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E6%96%B9%E6%B3%95)

これで、サインランプの電源ON／OFF操作をスマホから操作できるようになります。

この時点で、オンライン会議が始まったら手元のスマホからサインランプの電源をONにし、会議が終了したらOFFにする、ということは実現できます。
ただ、このON／OFF操作を会議の度に手動でやるのはとても面倒（というか忘れてしまう）ので、次のSTEPからはこの操作の自動化を進めていきます。

### 【STEP2】 SwitchBot APIを使ってサインランプの点灯／消灯を操作する

電源ON／OFF操作を自動化するために、まずはAPI経由でデバイスの操作をできるようにします。

**トークンの取得**
SwitchBot APIを使うにはトークンを取得する必要があります。

取得方法は下記の通りです。
a. SwitchBotアプリを起動する
b. プロフィール > 設定 > アプリバージョンを10回タップ
c. 開発者向けオプションが表示されるのでタップする
d. トークンを取得する
![IMG_4271_.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128340/5fbebb21-6393-23fd-4735-1e31ba986809.png)

**デバイスIDを取得**
次に、上記で取得したトークンを用いてデバイスIDを取得します。
デバイスIDは、下記のコマンドを実行して取得することができます。
（実行結果は device_list.json としてカレントディレクトリに出力します）

```
curl -X GET -H "Authorization:XXXXXXXXXX" https://api.switch-bot.com/v1.0/devices -o device_list.json

※ XXXXXXXXXX 部分に取得したトークンを入れてください
```

device_list.json ファイルを開くと、下記のような情報が取得できます。
```device_list.json
{
    "statusCode": 100,
    "body": {
        "deviceList": [
            {
                "deviceId": "YYYYYYYYY",
                "deviceName": "ONAIRライト",
                "deviceType": "Plug Mini (JP)",
                "enableCloudService": true,
                "hubDeviceId": "000000000000"
            }
        ],
        "infraredRemoteList": []
    },
    "message": "success"
}
```
SwitchBotプラグミニのdeviceIdは YYYYYYYYY であることがわかります。


**電源ON／OFF操作を実行するシェルを作成**
取得したトークンおよびデバイスIDを用いて、下記コマンドを実行することでAPI経由で電源ON／OFF操作ができます。こちらのコマンドはシェルファイルにして、いつでも実行できるようにしておきます。

```turn_on_light.sh
#!/bin/sh
curl --request POST 'https://api.switch-bot.com/v1.0/devices/YYYYYYYYY/commands' \
--header 'Authorization:XXXXXXXXXX' \
--header 'Content-Type: application/json; charset=utf8' \
--data-raw '{"command": "turnOn","parameter": "default","commandType": "command"}'
```

```turn_off_light.sh
#!/bin/sh
curl --request POST 'https://api.switch-bot.com/v1.0/devices/YYYYYYYYY/commands' \
--header 'Authorization:XXXXXXXXXX' \
--header 'Content-Type: application/json; charset=utf8' \
--data-raw '{"command": "turnOff","parameter": "default","commandType": "command"}'
```

### 【STEP3】 オンライン会議ソフトの操作に合わせてSwitchBot APIを叩く

さて、ここまでの所でサインランプの電源操作をインターネットを介して実行できるようになりました。あとはその操作をオンライン会議の実施状況に合わせて自動実行するだけです。

トリガーの作り方は色々あると思うのですが、ここではオンライン会議アプリケーションの起動プロセスを監視し、オンライン会議中のプロセスを検知したら電源ONコマンドを実行、該当プロセスが消えたら電源OFFコマンドを実行するようなトリガを作成することにします。

下記の内容は、オンライン会議システムZoomの起動プロセスを監視するスクリプトとなっています。
```check_boot_status.sh
#!/bin/sh
dir=~/check_boot_status

# 最終起動ステータスを確認
last_boot_status=`tail -n 1 $dir/last_boot_status.log`

# 現在の起動ステータスを確認（zoom起動中に立ち上がるプロセスをカウントする）
ps_count=`ps -ef | grep zoom.*CptHost | grep -v grep | wc -l`

# 起動中の場合
if [ $ps_count -eq 1 ]; then
   current_boot_status='ON'
   # 最終起動ステータスがOFFの場合、ライトを点灯する
   if [ $last_boot_status = 'OFF' ]; then
      $dir/turn_on_light.sh
   fi
# 未起動の場合
else
   current_boot_status='OFF'
   #最終起動ステータスがONの場合、ライトをOFFにする   
   if [ $last_boot_status = 'ON' ]; then
      $dir/turn_off_light.sh
   fi
fi

# 最終起動ステータスログの書き込み
echo `date +%Y-%m-%d\ %H:%M` > $dir/last_boot_status.log
echo $current_boot_status >> $dir/last_boot_status.log
```

上記スクリプトをcronで1分に1回実行するようにセットします。

```
# 1分に1回実行
* * * * * ~/check_boot_status/check_boot_status.sh
```

これで準備完了です！


# 5. 動作確認
<iframe width="800" height="450" src="https://www.youtube.com/embed/fcJJ7egNXf0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

想定通り、Zoomの起動に合わせてON AIRライトを点灯し、終了後にON AIRライトを消灯することができました！

※ 補足説明
動画ではZoomの起動と同時に点灯、終了と同時に消灯していますが、実際にはプロセス監視処理は1分に一回実行しているため、最大で1分間の誤差があります。運用上はこれで全く問題がないので、1分に1回のプロセス監視で稼働しています。