オンラインミーティングが始まったら自動で点灯するオンエアーネオンライト macOS版

yoshiori.hatenablog.com

この記事を以前に読んでいてずっと記憶に残っていた。最近になって子どもたちが夏休みに入り家にいる時間が増えたこともあり、必要に迫られて実際に真似してみることにした。

MTG中に妻や子どもたちが部屋に乱入する事故が起こるので yoshioriさんの真似してみることにした。まずは設置まで

[image or embed]

— すぎゃーん (@sugyan.com) July 25, 2025 at 11:48 AM

成果物

github.com

macOSでのカメラ起動検出

macOSではLinuxとは異なり/dev/以下にカメラデバイスファイルが表示されないため、デバイスファイルの使用状況を監視する方法での検出はできない。また、macOSではVDC Assistant(Video Device Control Assistant)プロセスがカメラデバイスへのアクセスを管理し、フレームワークベースのアクセス方式を採用している。そのため、デバイス排他制御や占有状態を基にした検出方法も適用できない。

GPT 4oやClaudeといった生成AIとディスカッションしながら試行錯誤した結果、 CoreMediaIO Framework の kCMIODevicePropertyDeviceIsRunningSomewhere プロパティを利用することで、システム内のどこかでカメラデバイスが使用されているかを検出できることが判明した。このプロパティはBoolean値を返し、カメラが何らかのアプリケーションで使用中かどうかを示す。ただしAppleの公式ドキュメントは存在するものの、実際の実装例は限られている。

実際、生成AIもこれらのAPIを使ったコードを書くのは難しかったようで、最初Swiftで書かせてみたが上手くいかず、Objective-CでPoCを作ってからそれをSwiftに変換してもらう順序で、どうにか動作するものができた。

カメラの起動・停止をイベントとして受け取る仕組みがあればベストだったが、現時点で見つけられた判定方法がこれだけだったため、このAPIを利用して1秒ごとに「何らかのアプリケーションで使用中か」をチェックし、変更があれば通知などの処理を行う方式にした。

SwitchBotへの同期

SwitchBotの設置とハブ経由でのAPI利用は既に 自宅環境監視への入門 - すぎゃーんメモ で経験していたため、スマートプラグを追加購入するだけで簡単に実現できた。

カメラの状態変化を検知してAPIを叩き、オン・オフを同期する処理もClaude Codeに任せたところ、サクッと実装してくれた。結局Swiftコードは1行も自分では書いていない。

自動バックグラウンド起動設定

systemdのような自動起動の仕組みをmacOSでどう実現するか全くわからなかったが、これもClaude Codeに任せたところ~/LaunchAgents/以下に置く.plistファイルのテンプレートを用意してくれ、install scriptを実行するだけで設定が完了した。

生成AIのチカラ

今回は未知の技術が多かったため、自分で調べながら実装していたら、こんな短期間では作れなかったし、クオリティもずっと低いものになっていたと思う。 もちろん何度も議論やレビュー、ダメ出しを繰り返しながらの実装ではあったが、想像以上のものを駆足で作ってもらうことができ、非常に良い体験だった。