家で仕事するようになったときからずっとオンラインミーティング始まったら自動で点灯するネオンサインみたいなのあったら良いなぁと思ってた。 まぁぼんやり思ってるだけだったんだけど、ちょっとやる気が出たのでガッと組んでみた(確定申告の書類集めとかしてるとそうなるよねー)
雑要件定義
- 絶対に自動でON/OFF
- 取り回しのためPCとは直接有線で繋げない
- ミーティングはZoomだったりGoogle Meetだったりあるのである程度汎用的な方法
ミーティングの自動判別
たまにネットで出てくる記事でよく使われているZoomアプリのプロセス監視するのはGoogle Meetに対応できないので無し。カレンダー監視してミーティングの時間とか考えたけど、精度低いし突発の仕様相談とかに対応できないので無し。
結局仕事のミーティングはすべてカメラONにして行っているのでカメラの監視をすることにした。たまにゲームでDiscordつかって音声だけのときもあるけど、奥さん的要件としてはカメラに映り込みたくないというのが大きのでカメラの監視をすることにした。
で、カメラがつながっているかどうかではなく、実際に起動しているかどうかの監視はlsofコマンドで行える。
# lsof /dev/video0 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME pipewire 2019 yoshiori 52u CHR 81,0 0t0 2289 /dev/video0 wireplumb 2020 yoshiori 47u CHR 81,0 0t0 2289 /dev/video0
linuxだとこんな感じ。(pipewireとかwireplumbはWayland下でオーディオデバイス扱うやつなので無視して大丈夫) 多分Macでも似たようなもんだと思う。
あとはこれをループで監視すればON/OFFが判別できる。
ライトのオンオフをリモートで操作
PCで会議のイベントは取れるようになったのであとはプログラムからネオンライトを操作できれば良い。昔ならIFTTTとか使おうとか考えたんだけど、今やIFTTTのwebhookは高級有料プランになってしまったので無し。スマートデバイス、PCから扱うのはじつは面倒くさいんだよなぁとか思いつつ、なんか他に無いかなぁと思ってたらSwitchBotはAPIを公開してた!マジでAPI公開してる企業は政府から補助出てほしい!!ありがとうSwitchBot!!
で、Rubyのgemもあったのでめっちゃあっさりできた。
class Light def client @client ||= Switchbot::Client.new(ENV["TOKEN"], ENV["SECRET"]) end def on client.device(ENV["DEVICE_ID"]).on end def off client.device(ENV["DEVICE_ID"]).off end end
これで道具は揃ったのであとは作るだけ。
材料
ON AIR ネオンライト
物理スイッチなので本体のスイッチはいれっぱなしにしてスマートプラグでON/OFF操作できる。あと電池も対応しているけど有線でも使えて接続口がUSB-Cなのも地味に嬉しい。
スマートプラグ
商品説明にはAPIについて全く触れられていない。なぜなのか!?(マニアックだから?)
【Option】薄型 USB-C ケーブル
USB-C のコネクタ側が薄型のL字なので接続時に綺麗に見える。初代Apple Pencilの突き刺さりが美しいと思った人はいらないと思う。
プログラム
ということで前回かいた「超楽にRubyで雑に書いたスクリプトをsystemdで管理したい! - 宇宙行きたい」はこれを動かすためでした。
まとめ
SwitchBotが実はAPI公開しててさくっと色々なハックが出来るのはもっともっと知られてほしい!!!!最高便利!ありがとう!!!