見出し画像

「只今 Zoom 中」を知らせたい

はじめまして。ティンカリングメモです。この note では、身の回りのちょっとした不便を、ローテクなハイテクを使って解決するというネタを書いてみようと思います。

なお「ティンカリング」という言葉は、「特に計画を立てず思いつくままに材料をいじくり回して楽しむ」といった意味です。あまり耳慣れない言葉ですが、良い訳語がないのでティンカリングという言葉そのものを使うことにします。

ところでローテクなハイテクというのは何でしょう?これは身の回りにあるIT機器(主にパソコン)を使って、手間暇とお金をなるべくかけず、しかもあまり高度なスキルも使わずに、目の前の問題をベタなやり方で(ティンカリングで)改善しようというものです。

只今取り込み中!

初回のテーマは、タイトルにもあるように「只今 Zoom 中」をお知らせする仕掛けを作ります。どうして「只今 Zoom 中」をお知らせしたいかって?

たとえば自宅のテレワークで会議中に生活音などが入らないように、部屋のドアを閉めておいたりしますよね。でもそうしていると、家族は Zoom 会議が終わったのかどうなのかかわかりにくく、ちょっとした用件があるときに声をかけて良いのかどうかに迷ってしまいます。

そんなとき、ドアの外に「只今取り込み中!」というサインが出せたら良いですよね。イメージとしては放送局のアレです。

画像1

実はこうしたライトそのものは Amazon などのショップを見ると売っていて買うことができます。でもこうした仕掛けを設置しても、手でスイッチをオンオフするのでは面倒ですし、きっとスイッチを切り忘れることが頻発するに違い有りません(←まあ私の場合はですが)。

そこで、Zoom 会議が始まったら自動的にランプがついて、終わったらやはり自動的に消えるような仕掛けを作ってみることにしました。

なおOS環境は macOS Catalina で、ハードウェアは iMac 2017 です。以下の議論は Linux ではだいだいそのまま流用できます。Windows も Linux ツールを入れればなんとかなる「かも」しれません。

さてそこで、何を選ぶかですが、最初に思いついたのは、遠隔操作電球として有名なフィリップスの Hue (ヒュー)です。

これも悪くはないのですが、電球単体だけではなくブリッジという中継装置も買わなければならないので値段が張りますし、さらにそれをコントロールするには専用のスマホアプリとか IFTTT とかのインターネットサービスを使わなければなりません。

おそらく Zoom と IFTTT を連携させて、そこから Hue のブリッジにコマンドを投げるといったことをやればできそうな気もしますが、いちいちインターネットのサービスを呼び出さなければならないのは気が引けます。それに Hue は電球そのものなので、点灯消灯以外の用途には当然ながら使えません。

スマートプラグとの出会い

そこで、もう少し安くて「つぶし」のきくものは無いものか ... 調べているうちに「スマートプラグ」というカテゴリーの商品にたどり着きました。要するに遠隔コントロールできる「コンセント」です。基本的に ON/OFF しかできませんが、ライトを色々選んだりすることできますし、ブザーを鳴らしたり扇風機などを動かすのにも使えるかもしれません。

類似品は色々あるのですが、手頃そうなこれが目に止まったので買ってみることにしました。ハブ不要ということは、これ単体でも使えるということのようです。

ところで、とにもかくにも基本的なアクセスができなければなりません。説明を読むとスマホのアプリや IFTTT とは連携すると書いてあるのですが、自分で簡単なプログラムを作りたいし、インターネットに一度出なければならないIFTTTの利用は気が進みません。

きっと大したことはやっていない(偏見)でしょうから、もっとダイレクトにパケットを組み立てて投げるだけといったやり方はないかなと思って少し探したら、以下のような記事をみつけました。

これは Zoom と連携しているわけではありませんが、スマートプラグの ON/OFF を自分のプログラムでできるようにしたやり方が書いてあります。結構力技で、ネットを流れるパケットを直接拾ってそれを流用しているというやりかたですが、原理は単純なので応用するのも簡単そうです。

ともあれ上の記事を参考に、パケットを切り出して(Charlesというツールを使っています)スマートプラグの ON と OFF ができるコマンドを作りました(それぞれ ON.sh 、 OFF.sh というシェルスクリプト)。中では curl というプログラムでパケットを投げつけているだけです。これで電源の ON/OFF がコマンド経由でできるようになりました。

ON.sh は以下のようなものです(最低限IPアドレス(**.**.**.**の部分)などは適宜置き換える必要があります)。

curl --silent -H 'Host: **.**.**.**' -H 'Content-Type: application/json' -H 'Accept: */*' -H 'User-Agent: intellect_socket/2.9.1 (iPhone; iOS 12.4.7; Scale/3.00)' -H 'Accept-Language: ja-JP;q=1, en-JP;q=0.9' --data-binary '{"payload":{"togglex":{"onoff":1,"channel":0}},"header":{"messageId":"86ec35900a1ccb142b052ea74347a447","method":"SET","from":"http:\/\/**.**.**.**\/config","sign":"df196d22deb73bdafc0c4346128bdfc4","namespace":"Appliance.Control.ToggleX","triggerSrc":"iOS","timestamp":1596201372,"payloadVersion":1}}' --compressed 'http://**.**.**.**/config' > /dev/null

OFF.sh はほぼ同じですが "onoff":1 の部分を "onoff":0 にする必要があります。

Zoom との連携

次は Zoom との連携です。Zoom の状態を見て上で作った ON.sh、OFF.sh を呼び出してやるようにすれば良いということです。

ということで作成した zoomlight.sh というシェルスクリプトは以下のようなものです。

#!/bin/sh
trap "./OFF.sh;exit 1" 1 2 3 15
#
while true
do
   # zoomstatus.sh というプログラムを呼んで Zoom の状態を取得
   STATUS=`./zoomstatus.sh` 
   # もし "nozoom" だったらメッセージを出して終了
   if [ y"${STATUS}" = y"nozoom" ] 
   then
	echo "No Zoom. Bye." 
	# just in case
	./OFF.sh
	exit
   else
    # もし "onair" だったら ON.sh を呼び、そうでなkれば OFF.sh を呼ぶ
	if [ y"$STATUS" = y"onair" ] 
	then
	    ./ON.sh
	else
	    ./OFF.sh
	fi
   fi
   sleep 5
done

ここで肝心なのは zoomstatus.sh というプログラムです。このプログラムは Zoom の状態に応じて 3 種類の出力を返してきます。

・ nozoom  ... Zoom プログラムが走っていない

・onair ... Zoom 会議中

・offair ... Zoom プログラムは起動しているが、会議は行われていない

zoomstatus.sh が onair を返してきたら ON.sh を呼び、そうでなければ OFF.sh を呼んでいます。また nozoom が返ってきたら Zoom が終わっていますので OFF.sh を呼び出して終了します。

zoomstatus.sh は5秒に一回呼び出されて、次の動作が決まります。

さて、Zoom の状態を判定する zoomstatus.sh の中身は下のようなものになっています。

#!/bin/sh
ps ux | grep "MacOS/zoom.us" | grep -v grep | awk '{ if ($3 > 6.0) { print "onair" } else { print "offair" } } END {if (NR==0) {print "nozoom"}}'

複雑そうに見えますが、やっていることは単純で、プロセスの一覧を得る ps というプログラムの中から Zoom プログラムが使用している CPU 利用率を抽出して、それが 6.0(%)より大きかったら Zoom 会議本体が始まっていると判断しています。これも全くベタなやり方で、強力な CPU を使っている場合にはこの比率は変わってしまいます。ですが、観察によれば、Zoom がただ起動されて、会議がまだ始まっていない状態と、会議が始まっている状態の間にはCPU利用率に10倍程度の差があります。なので、そこをみてやれば異なるコンピューター構成でも使えるでしょう。

実際の様子

Amazon で買った On Air ランプを使ってみることにします。下の写真の左側のウィンドウの下の部分で zoomlight.sh を起動しているのがわかります(左側のウィンドウの上の部分は zoomlight.sh の中身)。

zoom アプリは起動していますが、まだ会議そのものは始まっていません。

画像2

ここで、zoomの「新規ミーティング」をクリックしてみると ...

画像3

無事に "ON AIR" が点灯しました(このとき CPU利用率は 12% 位でした)。そして、会議を終了するとちゃんと消灯します(会議をしていないときの Zoom のCPU利用率は 1% 位)。

なおスマートプラグは一度コンセントから抜いて挿し直しても大丈夫ですので、これから部屋のドアの横に設置する予定です。

まとめ

ということでスマートプラグの ON/OFF と Zoom を連携させることができるようになりました。

今回つくった部品(スクリプト)である、ON.sh, OFF, zoomlight.sh は比較的汎用性があるので、zoomstatus.sh の中身を差し替えれば、他のプログラムの状態や更新されるデータなどをみて、スマートプラグの ON/OFF をできるようになります。IPアドレスの決め打ち、CPU使用率の判定などには、少し難がありますが、自分が使うだけならまあ良いでしょう。

実は目の前においてあるパソコンの90%以上の便利機能を、普通のユーザーは使わないまま眠らせています(数字は適当ですが)。ワードやフォトショップなどのアプリケーションを使うだけでももちろん良いのですが、パソコンの OS に備わっている標準的なサービス(ここではシェルプログラミング)を使うだけでも結構いろいろな事ができるのです。シェルプログラミングはエクセルのマクロ程度の難易度です。

注意:なお最後に書いておきますが、読めばわかるように、このシステム(Merossプラグ)にはほぼセキュリティがありません。なにしろ拾ったパケットを投げつけるだけで動作してしまいますので。なのでこれを家庭以外の公の場所で使うことはお勧めできません

それではまた!

今回のティンカリング

所要時間

ハードウェア検討(30分)

ハードウェア使用法検索(30分)

シェルプログラミング(1時間強)

費用

スマートプラグ(1581円、Amazon)

ON AIR ランプ(1460円、Amazon)# LED 式です。万一通電しっぱなしでも過熱しません。なおスマートプラグとON AIRランプの間に USB 充電器が挟まっていますが、これは余っている iPhone の充電器を流用しました

調光式LED ライト(110円、100円ショップセリア) # USB 接続式。On Air ランプが手に入る前のつなぎとして使いました。目的を達成するだけなら On Air ランプは買わずにこれだけでも十分です。

使用スキル

シェルプログラミング、awk プログラミング、Charles によるパケットキャプチャ

所要時間はバラバラに合計2時間強


この記事が気に入ったらサポートをしてみませんか?