#author("2021-12-02T19:13:09+09:00","ocha","ocha") #author("2021-12-02T19:13:25+09:00","ocha","ocha") [[How2TerminalSiri]] ** HomebridgeとMQTTを使う [#b48a2a14] ターミナルのコマンドラインやプログラムの中からHomeKitのスマート家電、IoTデバイスをコントロールするには、 - Homebridgeサーバを用意して - MQTT (Mosquitto)ブローカーを用意する などの方法がありました。以下をご覧ください。 - http://is.ocha.ac.jp/~siio/?How2Homebridge_Mqttthing - http://is.ocha.ac.jp/~siio/?How2HomeKit_MQTT - http://is.ocha.ac.jp/~siio/?How2Homebridge - http://is.ocha.ac.jp/~siio/?How2MQTT - http://is.ocha.ac.jp/~siio/?How2NodejsRaspberryPi - http://is.ocha.ac.jp/~siio/?How2ESP32MQTT - http://is.ocha.ac.jp/~siio/?.How2DockerQNAP - http://is.ocha.ac.jp/~siio/?.How2autolock408 ここでは、macOS 12.0 Montereyになって導入された、ショートカット.appを使います。 ** ショートカット.appを使う [#w2c7358b] ショートカット.app(英語名:Shortcuts.app)は、今までiOS, watchOSで動いていました。 macOS 12.0になってmacOSにも移植されました。 macOSの自動化をする純正アプリケーションには、今まで、 - スクリプトエディタ.app - Automator.app がありましたが、ショートカットが3個目として追加されました。 ショートカットはiOSと互換性があることもあって、今後は、Autometorを置き換える予定のようです。 &ref(shortcuts.jpg); ショートカットからホーム.appが管理するHomeKitをコントロールできます。 ちなみに、スクリプトエディタやAutomatorからは、今も昔もHomeKitの制御はできません。 HomeKitがOSA, AppleScriptに対応していないためのようです。 ショートカットは、スマート家電などの自動化もウリなので、非公開のAPIを使っているのかもしれません。 さらに、ショートカットをターミナルから起動するshortcutsコマンドも提供されました。 これにより、ターミナルからHomeKitをコントロールできます。 Terminal (shortcutsコマンド)---> Shortcuts.app ---> Home.app またショートカットはAppleScriptに対応してます。 なのでAppleScript経由でもHomeKitをコントロールできます。 Terminal (AppleScript)---> Shortcuts.app ---> Home.app **クイックアクションを作る [#he46b6e5] 入力文字列に従って、複数のHomeKitデバイスを制御するショートカットを作ります。 タイプのショートカットがあるようですが、ここでは「クイックアクション」というのを作ります。 クイックアクションとして設定すると、起動時のパラメタを受け取れるようです。 クイックアクションは、本来はサービスメニュー(メニューバーのアプリ名の中にあるメニュー項目)に設定したり、 キーボードショートカットを設定する機能です。 いずれも不要なので設定していませんが、クイックアクションとしての設定だけはしてあります。 右のペーンのチェックボックスで、「クイックアクションとして使用」を有効にしています。 &ref(shortcut_script.jpg); 作ったショートカットの中身を上に示します。名前をHomeKitShortcutにしました。 文字列比較を、「次と等しい」ではなく「次で始まる」にしたのは、入力テキストの末尾に改行コードなどが入っている時にも反応するようにするためです。 変数設定文、if文、Home.appアクセスのブロックなどは、右のタブやメニューを駆使して探してください。 こういうタイプのビジュアルプログラミングは見た目以上に面倒ですね。 「IKEAのあかり」を設定 という行の部分は、右ペーンから「App」「ホーム」「"xxx"をコントロール」(xxxは部屋の名前)を選んで、そのブロックをドラッグ&ドロップして持ってきて、設定します。 ここでは「IKEAのあかり」という名前をつけた、IKEAの無線制御可能なLED電球を点灯するよう設定してあります。 https://www.ikea.com/jp/ja/p/tradfri-led-bulb-e26-806-lumen-wireless-dimmable-warm-white-globe-opal-white-10410068/ ここでは、呼び出された時に得られたテキストの入力をcommandという名前の変数に入れて、 その内容に従ってif文で分岐して、異なるHomeKitデバイスをon/offしてます。 ** shortcutsコマンドから使う(おすすめ) [#h587504f] 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. shortcuts listコマンドで、登録されているショートカットの一覧が出ます。先ほど作ったHomeKitShortcutがあるかどうか確認します。 % shortcuts list HomeKitShortcut Shazamショートカット 音楽クイズ QRコードを作成する ショートカットとは? 先ほど作ったショートカットが一覧にあれば、コマンドラインから、 $echo -n IKEA_LED_ON | shortcuts run HomeKitShortcut をすればIKEAのあかりが点灯します。他のコマンドも同様です。 $echo -n IKEA_LED_OFF | shortcuts run HomeKitShortcut $echo -n HEATER_ON | shortcuts run HomeKitShortcut $echo -n HEATER_OFF | shortcuts run HomeKitShortcut echoに-nオプションをつけているのは、文字列末尾に改行コードを入れないためです。 ショートカットの文字列比較は、改行コードまで含めて判断するようです。 上記のHomeKitShortcutのスクリプトでは、「次で始まる」で文字列比較しているので、-nオプションが無くても正しく反応します。 command用のテキストを引数にするスクリプトファイルを以下のように用意して #!/bin/sh #Shell script to send a message to a shortcut named HomeKitShortcut. if [ $# = 0 ]; then echo 'Usage:' $0 '"command"'; exit 1; fi echo $1 | shortcuts run HomeKitShortcut これを例えば、hkcommand.shという名前のファイルで保存して、実行可能に設定すれば、以下のようなコマンドでon/offできます。 % ./hkcommand.sh IKEA_LED_ON % ./hkcommand.sh IKEA_LED_OFF % ./hkcommand.sh HEATER_ON % ./hkcommand.sh HEATER_OFF シェルスクリプトファイルから実行するechoでは-nオプションが効かないようです。「次で始まる」で文字列比較するのが安全だと思いました。 ** AppleScriptから使う [#i71708ff] 上で作った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のアップデートで治ると期待してます。 ** Processingからshellコマンドを実行する(おまけ) [#m7298b47] 以下のようにして実行できるらしいです。 void setup(){ StringList strout=new StringList(); //for standard out StringList strerr=new StringList(); //for error shell(strout,strerr,"/Volumes/home/siio/hkcommand.sh IKEA_LED_ON"); //third op is the shell command for(String el:strout){ println(el); } for(String el:strerr){ println(el); } }