動機
最近リモート会議のときに自分の顔色が悪い。老化のせいもあるだろうが、根本的にはデスク周りが暗いせいだ。じゃあ照明を導入しよう。ついでにリモート会議の間だけ照明をつけるようにしたら楽しそう。
楽しむのが主目的なので、原価厨・効率厨の方はお引き取りください。
背景
ある抜き差しならぬ事情により、最近まで職場の自分のデスクでは仕事にならず、図書館やら自宅やらで仕事をする生活をしていた。ようやく事態が変わり自分のデスクで仕事ができるようになってきたのだが、デスク周りが暗いことに気付いたので環境改善を行った記録である。
照明
私は手元だけが明るくなるデスクライトがあまり好きではなく、視界が全体的に明るくなってほしい質である。しかし昭和時代そのまんまの職場なので部屋が全体的に薄暗いのはどうしようもなく、なんとか照明器具を足さないと始まらない。都合のよいことにデスクは白無地の壁に向いているので、間接照明っぽく壁を照らしてやればよいだろう。ということで、何日かホームセンターほかをぶらついて見つけたLEDバーライトを(在庫がなかったのでAmazonで)購入した。
デスクの頭上にアングルで棚が組んであるというあまりにも昭和な環境なので、アングルの内側に磁石で据え付けるとうまい具合に壁向きに照らすことができる。ディスプレイが照らされると見辛くなるかと危惧していたけれど、角度の関係かまったく気にならない。
ただこの商品、本体側面にある小さなシーソースイッチでON/OFFするため、アングルの内側に指を突っ込んで弄らないとならず結構手間である。VDT作業をしているんだから、端末から照明もコントロールできるべきだ。
スマートプラグ
リモコン式とかUSB給電式の照明器具なら別の解決法もあったかもしれないが、AC給電式なのでスマートプラグを使うしかない。物理店舗でよく売っている商品は耐久性に難があるという意見を複数見たために避けこれまたAmazonで購入した。
スマホにTapoのアプリを入れ、tp-link IDを登録し、スマートプラグの型番を選んでからスマートプラグを電源タップに挿し、WiFiの設定をして有効化。スマホで照明をON/OFFできる、やったー。
物理スイッチを手探りで探す必要はなくなるとはいえ、わざわざスマホでON/OFFしたくはない。macからコントロールするためには、Tapoのアプリで「サードパーティ連携」を有効にしておく必要がある1。場所はちょっと分かりづらくて、アプリの右下の「私」から「音声アシスタント」メニューの中にある。
Homebridge
今回はmacOSからHomebridgeを介してコントロールすることにした。普通Homebridgeはラズパイとかで運用するものらしいけど、スマートスピーカーと接続したいわけでもなく、macが起動している間だけコントロールできればいいのでmacに入れた。
まずはNode.jsをインストールして、
HomebridgeとそのUIをインストール
% sudo npm install -g --unsafe-perm homebridge homebridge-config-ui-x
% sudo hb-service install
http://localhost:8581 にアクセスしてパスワードを設定し、Pluginsから Tapo P100 Plugin (apatsufas/homebridge-tapo-p100) をインストール
途中で権限エラーが出るので
% sudo chown -R 501:20 $HOME/.npm
プラグインの設定は、Tapoアプリに設定したのと同じユーザーネーム・パスワードを設定し、IPアドレス2はアプリでP110Mを選択して「デバイス設定>端末情報」で参照できる。
これでHomebridgeのUIから照明をON/OFFできる、やったー。
ホームアプリ
わざわざHomebridgeのUIを開いて操作するのも煩わしいので、macのホームアプリからコントロールできるようにしたい。
ところでmacOSのホームアプリは単独ではhomeKitアクセサリを登録できないらしい。
iPhoneなりiPadなりのホームアプリをつかってHomebridgeのUIのQRコードを読ませた後ならば、macのホームアプリにもアクセサリが表示される。私はたまたま私用のiPadを持っていたんで良かったですが3、なんでなんでしょう?
まあとにかく、ホームアプリから照明をON/OFFできる、やったー。
ショートカット
ライトの点け消しのためにホームアプリを開いて操作するなんて煩わしいので、ショートカットを作成してdockからワンクリックでコントロールできるようにしたい。
ONにするショートカットとOFFにするショートカットは極めて簡単につくれる。ただ実用的には、ON/OFFをトグルしたいので、状態を取得してIF文でONまたはOFFにするというショートカットも作成する。
このトグルするショートカットをdockに表示すれば、ワンクリックで照明をON/OFFできる。ここまでで最初やりたかった目標は達成できた。ただ、できればリモート会議の時に自動的に照明が点くようにしたいとは思っていた。もともとAI検索どのは、「CameraUsage.app」ってのがあるからそこからHomebridge HTTP Webhooksプラグインに連携すればいいよとの仰せだったのだが、CameraUsage.appがメンテされてないっぽくて。
ログ監視
別のときにAI検索どのに尋ねると、log streamでログ監視してショートカットを起動すれば行けるとのお告げ。
まずはお告げの裏取りをすると、カメラON/OFFで以下のnotificationが発生すると確認できた。
- AVCaptureSessionDidStartRunningNotification
- AVCaptureSessionDidStopRunningNotification
ならばシェルスクリプトを作成4。
% cat << EOF > ~/bin/trigger_light.sh
#!/bin/bash
log stream --predicate 'eventMessage MATCHES ".*AVCaptureSessionDid(Start|Stop)RunningNotification"' | while read -r line; do
case $line in
*StartRunningNotification )
shortcuts run "照明オン" </dev/null
;;
*StopRunningNotification )
shortcuts run "照明オフ" </dev/null
;;
esac
Done
EOF
% chmod u+x ~/bin/trigger_light.sh
これをlaunchctlで登録。
% cat << EOF > ~/Library/LaunchAgents/trigger_light.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>trigger_light</string>
<key>ProgramArguments</key>
<array>
<string>$HOME/bin/trigger_light.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
EOF
% launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/trigger_light.plist
これでめでたく完了。カメラの使用中だけ照明がON、使用後は照明OFFが実現した。
