ターミナルのコマンドラインやプログラムの中からHomeKitのスマート家電、IoTデバイスをコントロールするには、
などの方法がありました。以下をご覧ください。
macOS 12.0 Montereyになって、ショートカット.appがmacOSにも移植されました。
ショートカットからホーム.appが管理するHomeKitをコントロールできます。 またショートカットはAppleScriptに対応してます。 なので、HomeKitデバイスをAppleScriptからアクセスできます。
Terminal --(AppleScript)--> Shortcuts.app ----> Home.app
ホーム.app自体はAppleScriptに対応していませんが、Shortcuts.appを経由することで AppleScriptでアクセスできるようになりました。
ショートカットの中で、いろいろなタイプのショートカットが作れるようですが、ここでは「クイックアクション」というのを作ります。 クイックアクションは、サービスメニュー(メニューバーのアプリ名の中にあるメニュー項目)に設定したり、 キーボードショートカットを設定する機能です。 いずれも不要なので設定していませんが、クイックアクションとしての設定はしてあります。 クイックアクションとして設定すると、起動時のパラメタを受け取れるようです。
作ったショートカットの中身を上に示します。 変数設定文、if文、Home.appアクセスのブロックなどは、右のタブやメニューを駆使して探してください。 こういうタイプのビジュアルプログラミングは見た目以上に面倒ですね。
「IKEAのあかり」を設定
という行の部分は、右ペーンから「App」「ホーム」「"xxx"をコントロール」(xxxは部屋の名前)を選んで、そのブロックをドラッグ&ドロップして持ってきて、設定します。 ここでは「IKEAのあかり」という名前をつけた、IKEAの無線制御可能なLED電球を点灯するよう設定してあります。
ここでは、呼び出された時に得られたテキストの入力をcommandという名前の変数に入れて、 その内容に従ってif文で分岐して、異なるHomeKitデバイスをon/offしてます。
macOS Montereyからコマンドラインから使えるshortcutsコマンドが追加されました。 この次に説明するAppleScriptを使うより新しい方法なので、おすすめです。
shortcutsコマンドは、-hでヘルプが出ます。
% shortcuts -h OVERVIEW: Command-line utility for running shortcuts. USAGE: shortcuts <subcommand> OPTIONS: -h, --help Show help information. SUBCOMMANDS: run Run a shortcut. list List your shortcuts. view View a shortcut in Shortcuts. sign Sign a shortcut file. See 'shortcuts help <subcommand>' for detailed help.
上で作ったHomeKitShortcutを、AppleScriptから使うこともできます。 でもshortcutsコマンドから使う方が簡単な気がします。そちらがおすすめです。
ターミナルから、
osascript -e 'tell application "Shortcuts" to run shortcut "HomeKitShortcut" with input "IKEA_LED_ON"'
とすれば、呼び出せて、最初のif文が働いて、明かりが点灯するはずです。
command用のテキストを引数にするスクリプトファイルを以下のように用意して
#!/usr/bin/osascript on run argv tell application "Shortcuts" run shortcut "HomeKitShortcut" with input (item 1 of argv) end tell end run
これを例えば、hkcommand.osascriptという名前のファイルで保存して、実行可能に設定すれば、以下のようなコマンドでon/offできます。
% ./hkcommand.osascript IKEA_LED_ON % ./hkcommand.osascript IKEA_LED_OFF % ./hkcommand.osascript HEATER_ON % ./hkcommand.osascript HEATER_OFF
ちなみに、現在では実行後に missing value という警告メッセージが出ますが、無視しても問題ないようです。これは、accepts inputというプロパティの問い合わせに対して出るようで、現行のバグではないかと思ってます。この先のmacOSのアップデートで治ると期待してます。