- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2021-11-02T16:53:59+09:00","ocha","ocha")
#author("2021-11-02T18:53:57+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]
macOS 12.0 Montereyになって、ショートカット.appがmacOSにも移植されました。
ショートカット.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に対応してます。
なので、HomeKitデバイスをAppleScriptからアクセスできます。
なのでAppleScript経由でもHomeKitをコントロールできます。
Terminal --(AppleScript)--> Shortcuts.app ----> Home.app
Terminal (AppleScript)---> Shortcuts.app ---> Home.app
ホーム.app自体はAppleScriptに対応していませんが、Shortcuts.appを経由することで
AppleScriptでアクセスできるようになりました。
**クイックアクションを作る [#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を使うより新しい方法なので、おすすめです。
この次に説明する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のアップデートで治ると期待してます。