タジログ

情報処理安全確保支援士の日常です。脱出ゲーム、映画、読書、TVゲームなどの趣味についてや、生活について徒然と

Macの画面スリープに連動してUSB LEDライトを自動でON/OFFする方法

Macに接続しているUSB給電のLEDライトを、ディスプレイのON/OFFに合わせて自動で点灯・消灯できるようにしました。

最終的には、以下の動作を実現しています。

  • Macの画面をスリープしたらLEDライトを消灯する
  • Macの画面が復帰したらLEDライトを点灯する
  • ホットコーナーの「ディスプレイをスリープ」にも連動する

地味な自動化ですが、デスク周りの使い勝手がかなり良くなりました。

やりたかったこと

デスク周りでUSB給電のLEDライトを使っています。 これをMacの画面状態に合わせて、自動的にON/OFFしたいと思いました。

理想は次のような動作です。

画面ON → LEDライト点灯 画面OFF → LEDライト消灯

最初は、モニタ側のUSBポートにLEDライトを挿しておけば、モニタのスリープと連動してUSB給電も切れるのではないかと考えていました。

しかし実際には、Mac側で「ディスプレイをスリープ」しても、LEDライトは消えませんでした。 モニタ側の省電力設定を変更しても、今回の構成ではUSB給電は切れませんでした。

そこで、モニタ側の挙動に頼るのではなく、Mac側からUSBハブのポート給電を直接制御する方法にしました。

全体構成

使ったものは以下の2つです。

  • uhubctl
  • Hammerspoon

uhubctl は、対応しているUSBハブのポート給電をON/OFFできるコマンドラインツールです。 Hammerspoonは、macOSのイベントを検知してスクリプトを実行できる自動化ツールです。

今回の考え方はシンプルです。

Macのディスプレイがスリープ ↓ Hammerspoonが検知 ↓ uhubctlでUSBポートの給電をOFF ↓ LEDライト消灯 Macのディスプレイが復帰 ↓ Hammerspoonが検知 ↓ uhubctlでUSBポートの給電をON ↓ LEDライト点灯

ポイントは、LEDライトそのものを制御するのではなく、 LEDライトが接続されているUSBハブのポート給電を切ることです。

uhubctlをインストールする

Homebrewで uhubctl をインストールします。

brew install uhubctl

インストール後、USBハブの状態を確認します。

sudo uhubctl

次のような形式で、USBハブとポートの一覧が表示されます。

Current status for hub 0-1.3 [USB Hub, USB 2.10, 5 ports, ppps] Port 1: power enable connect Port 2: power Port 3: power connect Port 4: power highspeed enable connect Port 5: power

ここで注意したいのは、USB LEDライト自体は一覧に出てこないことがあるという点です。

USB LEDライトは給電専用で、データ通信をしないものが多くあります。 その場合、MacからはUSBデバイスとして認識されません。

そのため、探すべきなのはLEDライト本体ではなく、 LEDライトがぶら下がっているUSBハブ、またはその上流ポートです。

LEDライトのポートを特定する

次に、LEDライトを制御するためのUSBポートを特定します。

今回は、LEDライトをUSBハブ経由で接続していました。 そのため、LEDライト本体を直接探すのではなく、まず LEDライトが刺さっている末端のUSBハブが、Macからどのように見えているか を確認しました。

USB LEDライトは給電専用の場合があり、その場合はUSBデバイスとして一覧に表示されません。 一方で、LEDライトを接続しているUSBハブは、Mac側からUSBハブとして認識されることがあります。

そこで、まずLEDライトを接続した状態で uhubctl の一覧を確認します。

sudo uhubctl

たとえば、以下のように複数のUSBハブが表示されます。

Current status for hub 0-1.3 [USB Hub, USB 2.10, 5 ports, ppps]
  Port 1: power enable connect
  Port 2: power enable connect [USB Hub, 4 ports]
  Port 3: power connect
  Port 4: power highspeed enable connect
  Port 5: power

Current status for hub 3-1 [USB Hub, USB 2.10, 4 ports, ppps]
  Port 1: power
  Port 2: power
  Port 3: power
  Port 4: power

次に、LEDライトが刺さっている末端のUSBハブを一度抜きます。 その状態でもう一度 sudo uhubctl を実行します。

sudo uhubctl

抜く前後の表示を見比べます。 たとえば、抜く前は以下のように表示されていたポートが、

Port 2: power enable connect [USB Hub, 4 ports]

末端のUSBハブを抜いた後に、以下のように変わっていれば、

Port 2: power

そのポートが、LEDライト側のUSBハブにつながっていた上流ポートだと分かります。

この例では、まず以下の接続関係が分かります。

hub: 0-1.3
port: 2
  ↓
LEDライトが刺さっているUSBハブ側

ここまでで分かるのは、「LEDライトが刺さっているUSBハブが、どの経路にぶら下がっているか」です。 ただし、この時点ではLEDライトがハブの何番ポートに刺さっているかまでは分かりません。

そのため、次に対象になりそうなハブのポートを1つずつOFF/ONして、LEDライトが消えるポートを探します。

sudo uhubctl -l 3-1 -p 1 -a off
sudo uhubctl -l 3-1 -p 1 -a on

sudo uhubctl -l 3-1 -p 2 -a off
sudo uhubctl -l 3-1 -p 2 -a on

sudo uhubctl -l 3-1 -p 3 -a off
sudo uhubctl -l 3-1 -p 3 -a on

sudo uhubctl -l 3-1 -p 4 -a off
sudo uhubctl -l 3-1 -p 4 -a on

ここで、実際にLEDライトが消灯・点灯するポートが見つかれば、そのポートが制御対象です。

今回の環境では、最終的に以下のコマンドでLEDライトをON/OFFできました。

sudo uhubctl -l 0-1.3 -p 2 -a off
sudo uhubctl -l 0-1.3 -p 2 -a on

つまり、0-1.3Port 2 がLEDライト側につながる制御対象ポートでした。

この作業のポイントは、最初からLEDライト本体を探すのではなく、 LEDライトが刺さっているUSBハブの抜き差しで差分を見て、候補となるハブや経路を絞り込む ことです。

そのうえで、候補になったハブのポートを1つずつ uhubctl でON/OFFし、 LEDライトが反応するポートを特定します。

なお、指定したポートの先に複数のUSB機器が接続されている場合は、それらも同じポートの電源供給にぶら下がります。 LEDライトだけを安全に制御したい場合は、特定したポートの先をLEDライト専用にしておくのが安心です。

Hammerspoonをインストールする

次に、ディスプレイのスリープ/復帰を検知するためにHammerspoonを入れます。

brew install --cask hammerspoon

インストール後、アプリケーションからHammerspoonを起動します。 初回起動時に権限を求められた場合は許可します。

sudoをパスワードなしで実行できるようにする

Hammerspoonから sudo uhubctl を実行する場合、通常はパスワード入力が必要になります。 しかし自動実行ではパスワードを入力できません。

そこで、今回使う uhubctl コマンドだけ、パスワードなしで実行できるようにします。

まず uhubctl のパスを確認します。

which uhubctl

たとえば以下のように表示されます。

/opt/homebrew/bin/uhubctl

次に visudo を開きます。

sudo visudo

末尾に以下を追加します。

<ユーザー名> ALL=(root) NOPASSWD: /opt/homebrew/bin/uhubctl -l 0-1.3 -p 2 -a off, /opt/homebrew/bin/uhubctl -l 0-1.3 -p 2 -a on

<ユーザー名> は自分のmacOSユーザー名に置き換えます。 /opt/homebrew/bin/uhubctl の部分は、which uhubctl の結果に合わせます。

また、0-1.32 は、自分の環境で特定した値に置き換えます。

設定できたら、以下でパスワードなし実行できるか確認します。

sudo -n /opt/homebrew/bin/uhubctl -l 0-1.3 -p 2 -a off sudo -n /opt/homebrew/bin/uhubctl -l 0-1.3 -p 2 -a on

これでLEDライトがON/OFFできればOKです。

Hammerspoonの設定を書く

Hammerspoonの設定ファイルを作成します。

mkdir -p ~/.hammerspoon nano ~/.hammerspoon/init.lua

以下を貼り付けます。

local ledOff = "/usr/bin/sudo -n /opt/homebrew/bin/uhubctl -l 0-1.3 -p 2 -a off" local ledOn = "/usr/bin/sudo -n /opt/homebrew/bin/uhubctl -l 0-1.3 -p 2 -a on" local function run(cmd) hs.task.new("/bin/zsh", function(exitCode, stdOut, stdErr) if exitCode ~= 0 then hs.notify.new({ title = "LED control failed", informativeText = stdErr }):send() end end, {"-lc", cmd}):start() end local function handlePowerEvent(event) if event == hs.caffeinate.watcher.screensDidSleep or event == hs.caffeinate.watcher.systemWillSleep then run(ledOff) elseif event == hs.caffeinate.watcher.screensDidWake or event == hs.caffeinate.watcher.systemDidWake then run(ledOn) end end powerWatcher = hs.caffeinate.watcher.new(handlePowerEvent) powerWatcher:start()

保存したら、Hammerspoonのメニューから設定を再読み込みします。

Reload Config

これで設定が反映されます。

動作確認

ホットコーナーに「ディスプレイをスリープ」を割り当てている場合は、それでテストできます。

期待する動作は以下です。

ホットコーナーでディスプレイをスリープ ↓ LEDライト消灯 マウスやキーボードで画面復帰 ↓ LEDライト点灯

これで、Macの画面状態に合わせてUSB LEDライトを自動制御できます。

注意点

LEDライトはUSBデバイスとして見えないことがある

給電専用のUSB LEDライトは、MacからUSBデバイスとして認識されない場合があります。

その場合、LEDライト本体を探すのではなく、LEDライトが接続されているハブや上流ポートを探します。

重要な機器を巻き込まないようにする

指定したポート配下に他の機器がある場合、それらも一緒に切れます。 外付けストレージ、キーボード、ネットワークアダプタなどを同じ配下に置くのは避けた方が安全です。

LEDライト専用の小型ハブや、LEDライトだけがぶら下がっているポートを使うのがおすすめです。

まとめ

Macの画面スリープに合わせてUSB LEDライトを自動ON/OFFしたい場合、モニタ側のUSB給電制御だけではうまくいかないことがあります。

その場合は、以下の構成にすると実現できます。

Hammerspoonで画面スリープ/復帰を検知 ↓ uhubctlでUSBハブの対象ポートをON/OFF

今回の環境では、以下のコマンドでLEDライトを制御できました。

sudo uhubctl -l 0-1.3 -p 2 -a off sudo uhubctl -l 0-1.3 -p 2 -a on

あとはこのコマンドをHammerspoonから実行することで、 画面OFFで消灯、画面ONで点灯するUSB LEDライト環境が作れます。

ライトを手動で消し忘れることがなくなり、デスク環境がかなり快適になりました。

 

こういうスイッチがないタイプでも自動点灯/消灯してくれます。

こちらで十分です。

 

退院後14週間

退院し14週間が経った。

10月に入ってからあの灼熱の世界はどこだったのか忘れてしまうぐらい過ごしやすい気温になった。

脚の調子はだんだん回復傾向に感じていて、硬直していた筋肉や筋が柔らかくなっていることが確認できていて、リハビリの先生からも柔らかくなっていると言われている。

昨日1ヶ月ぶりの病院へ行きCTとレントゲンを撮った。結果は少し回復が鈍化傾向とのことだった。回復傾向は感覚だけだった。骨の回復がいつまで続くのかわからないが、なんとか足に入っているプレートとボルトを抜いても問題なく支えられるぐらいまでは回復してほしい。

今は骨が育っていない分プレートに体重を預けての歩行となるので、足の裏のアーチをうまく使った歩行ができておらず、すぐに足が腫れていたが、リハビリでそのあたりの矯正をしていただいた。その日帰宅後に足の腫れを確認したが、ほとんど気にならない腫れ方だったので、矯正は効果あったみたいだ。

松葉杖を突きながら会社にも出社し出張にもいけて、なんとか日常生活に復帰でき始めているが、以前のようなハードな運動はまだまだと言ったところ。

こういうときに支えてくれる人がいたらよかったなと思うが今はいないので探したいが、どちらにしても足が治ってからしか何もできない。

今はカルシウムをとってゲームして、動画を見続けるしかない。

退院後マーベルシリーズを一通り見たので、最新映画に追いついた。映画マーベルズの公開日が決まったので、見に行きたい。

株は微増。最近の市場は難しすぎ。色々見ている感じだと少しREITを注視し始めておきたい。

ITストラテジストの勉強は参考書を衣替え中に掘り出してデスクの片隅に置いた。ちょっとずつエンジンをかけ始めて来年頭ぐらいから頑張ろう。

退院後10週間

退院後10週間が経った。

昨日約1ヶ月ぶりの通院で、経過を見てもらった。

レントゲンの結果はまあ順調、あとは骨の再生成を見守っていくしかない状況でした。

現状はまだ繋がっているだけの状態のようなので、荷重が固定しているボルトにかかる。そのため、歩くと痛い。そして、足首周りが腫れてくる。これはしっかり繋がるまでは続くとのことで、まだ数ヶ月はこんな状態が続くとのことで、先は長いなと思いました。本当に待つしかない。

その間はあまり歩けないので、遠出はできない。何か家でできる娯楽を拡充して行きたい。

痛みは慢性的なものが少しと、歩き出すと先ほども言ったように腫れてくるのでだんだん痛くなってくる。

なんか老後のシミュレーションをしているようで、将来のこともいろいろと想定できてしまう。

 

今月はいっぱい出張の予定が入ってきているけれど、遠出は止めとくようドクターストップがかかってしまったので、他の人に降らなければ…。

 

Kindle Unlimited、Amazon Prime Video、Disney+で見たいものはほぼ見た。

読みたい本も映画も思いつかない。Netflix限定の何かを探してみるか。

インドア派じゃないからインドアでできるものを探しています。何かあれば教えてください。

 

美味しいものが食べたい。

そろそろメルカリで不用品を売っていきたい。

退院後9週間

退院後9週間が経った。

先週1週間で室内を装具をつけずに歩くことに慣れてきたので、今週は靴を履いて外に出てみた。

足は筋がガチガチで足首周りが全く曲がらなかったのが、1週間歩いてみて大分柔らかくなって歩きやすくなった。歩くのにかかる時間は体感で通常速度の1/2、10分の距離に20分かかる感覚。毎日買い物に行くだけで時間も体力も結構吸われる。

骨折した足に負荷をかけることに慣れてきて、あまり恐怖感もなく歩いているが、関節周りが柔らかくなってきて骨にダイレクトに衝撃を感じるようになってきて、歩いていると足首周りが腫れるようになってきた。とはいえ、リハビリの先生からは毎日2千歩ぐらいは歩いて刺激を与えてくださいと言われたので、あと1週間我慢して(鎮痛剤で)、来週の診察のときに相談してみようと思う。

宅配スーパーも一旦やめて、外出時にスーパーに行くことで外出機会を作っている。スシローもマックもスーパーも100均も徒歩10分圏内にあるので、ちょうどいいリハビリになっている。マックは優待券を使い切ったので、(次の優待券(9月下旬)が来るまでは行かないが)

 

アプリ開発をしたいが何も作りたいものが思い浮かばない。普段からモノは最小限、使わないものは手にしない、すでにあるもので満足できるという体質なので、不満が湧きにくい。大抵のことに満足できるので、欲求が乏しい。環境にすぐ適応する。

昔インドやベトナムで仕事をしていた時にも環境適応が周りの方々より早かった記憶がある。

そういう意味では、骨折以後の生活にも素早く順応し受け入れてしまっている。とはいえ早く治せるように努力はしている。

病院で毎日200mlの牛乳を配給されていたので見習って、毎朝200gのヨーグルトを食べるようにしている。+骨の再生に必要な他のミネラルなどをサプリで補っている。

 

そんな中、歯の詰め物が取れた。さらに、それを飲み込んでしまった。

ベースフードを毎昼食食べているのだが、あのパンは結構弾力性が高くもちもちしているので、もちもちに食い込んで、そのまま飲み込んでしまった(らしい)。

急いで歯医者に電話して、対処法を聞いたら、便から出てくるから気にしなくていいとのことで、すぐに予約をして診察をしてもらった。この詰め物は年に1回ぐらい取れるので、仕方ないが、飲み込んでしまったのは初めてなので、びっくりした。ベースフードを食べる時は注意して食べようと思う。

 

退院後8週間

退院後8週間が経った。

先週末の通院は病院の行き帰りを電車とバスを乗り継いで行くことができた。

そして、病院で医者に装具なしでの歩行を許可された。なので、土曜日から装具なし松葉杖なしで家の中を歩いている。

歩いているがぎこちない。左下半身の筋肉はかなり落ちているので、初日は骨が折れるんじゃないかと立つのが怖かったが、だんだん慣れてきて&筋力も少しづつ戻ってきている。健も固くなっていたので、毎日少しづつほぐしている。最初は足首に分厚いゴムを巻き付けたような感じだったが、今は軽いゴムを巻きつけたぐらいまで柔らかくなってきている。

歩くというだけで、さまざまな筋肉と腱が連動するので、なかなか全てが元には戻らない。

とはいえ、徐々に普通の生活に近づいているのは実感している。

マイナスからゼロへ、ゼロからプラスへ、プラスからさらにプラスへ。そういったことが人生では希望と呼ばれる。希望があればなんとかなる。そういう根拠のない考えが生きるということだと思う。複数の軸を持っていれば、どれかは必ずプラスに向かっている、トータルでプラスになるように人生のポートフォリオを組んでおきましょう。

 

ポケモンSVのDLCが昨日配信された。今日クリアして図鑑もコンプリートした。

オーガポンとガチグマ赫月、ヤバソチャが環境を荒らしそう。カミッチュと犬猿雉はシングルだとあまり強くないかも。シンオウ御三家も解禁されたがパッとしない。エンペルトがあくびステロクイタンができるとのことなので、ちょっとは使えるかも。

もう1週して、2体目ゲットしてからランクマッチで暴れ回らせたい。

 

退院後7週間

退院後7週がたった。

入院していたのが6週だったので、ついに入院期間を超えた。

同じ期間が経ったとは思えない。入院中はありえないぐらい長くて辛い日々だった。あらゆる尊厳を奪われ、すっからかんから新たなスキルをアンロックしていく日々。まるでゼルダのような日々だった。今週末の外来でやっと装具が外れるはずなので、2足歩行になれるかもしれない。まだ脚の可動域がフルに可動しないので、松葉杖は残るかもだけれど、それでも歩くのが面倒になるぐらい装具(下の写真のやつ)が面倒。

足に入っている金属プレートは取り除く必要があるのかどうか、可動域がイマイチな原因になっている可能性もあるので、週末に確認が必要。取り除くとしたら、また入院+手術が必要だが、普通に歩けるようになりたいのでやるしかない。

マックの優待券はあと2枚。月見バーガーと月見すき焼きバーガーを食べたらちょうど消化できそう。もうそろそろ、来期の分が発送されてくるので、使わなければ。決して食べたくないものではないので、いやいやではない。

アーマードコア6を買ってクリアした。最初のチュートリアルのヘリが倒せず、買って失敗したと思ったが、なんとかクリアして、その後も攻略サイト・動画を見てなんとかクリアした。

このゲームは自分でカスタマイズしたロボットで不可能なミッションを攻略するという構築が9割のゲームなので、アセンブルというパーツ選定が重要である。

ただ、アセンブルの考え方については全く作中で語られないので、大袈裟にいうと、重量級のボディに近距離用の軽い武器を積んだり、軽さが売りのボディに重量級の武器を積んだりがたびたび起こる。相手にマッチしたアセンブルを組めれば簡単に倒せるのだが、見つけられないと何十回死んでも倒せない。

もう少しアセンブルについてサポートがあったら自力で進めようという気になったかもしれないが。ラスボスだけは中量級の機体がお勧めされていたので使ったけど、かなり序盤から重量級の火力バカ装備でゴリ押すスタイルなってしまった。

3週目がシン・エンディングらしいが難易度的に私にはできなそうなので、イージーモードが追加されたら、やろうかなという気持ち。

来週にはポケモンDLCがくるので、ランクマ環境がまた変わりそうで楽しみ。

まず、ゴリランダーにグラススライダーを覚えさせられるので、今月のランクマから暴れてくれそう。育てなきゃ。

あとは髪切ったぐらい。

退院後6週間

退院後6週間経った。

 

土曜日に2回目の通院に行った。

受付を済ませると整形外科の窓口まで移動して、診察票を渡す。

まずはレントゲンを撮ってくださいと言われ、50mほど離れたレントゲン室まで歩く。

待ち時間が10分ほど。院内のWifiパスワードは覚えているので時間を潰す。

レントゲン室では上向きと横向きになってそれぞれ写真を撮影する。もう慣れたものである。

整形外科の窓口へ戻り、先生の診察を受ける。

先生は休暇中なので、代理の先生だった。

骨がくっつきはじめているとのことで、経過は順調だった。2週間後にはスニーカーが履けるかも。

その後、100m離れたリハビリルームへ移動して、装具の負荷の調整をしてもらう。

今回の調整で通常負荷の50%になった。座った状態で足を思いっきり地面に押し付けても大丈夫なぐらいの負荷だ。家の中ではキャスター付きのワーキングチェアに座っているので、座っている限りは装具の着用はいらなくなった。だいぶ快適になった。

松葉杖も2本使っていたが、もう1本でもいいとのことで、家の中やすぐ近くは今は1本で生活している。

左足を信用できない状態が続いていたので、右側に重心が寄っているのを指摘された。50%の負荷がかけられるので、もうそろそろ身体の中央に重心を戻す意識を持つようにとこのと。

足の裏の力が皆無なので、地面を握るような動き、股関節、尻のトレーニングをしましょうと言われたので、何をしようか検索中。

 

マックの優待券が9月末までなにで、急ピッチで使用中。

8月は2回行けたので、あと3枚。毎週末行こうかと思う。

 

アーマードコア6が発売になった。

前作から10年経っているので、もう操作方法は忘れていた。

チュートリアルのヘリにボコボコにやられて、やる気が削がれたがなんとか続けている。

今海越えしたところ。

 

iPhoneアプリはCoreMLの認識精度がどうしても上がらないので、一旦保留。

代わりにAlexaスキルの開発をすることにした。もう大体できていて、同義語を使った処理の書き方がどこにも載っていないので、開発チームに確認中。