Macのショートカットアプリから1アクションでワイヤレスイヤホンに接続する

## 概要

Macのショートカットアプリ+シェルスクリプトを活用してペアリング済みのワイヤレスイヤホンへの接続を1アクションでできるようにしてみました。
※iPhoneのショートカットアプリにはアクションとして「再生出力先を設定」が用意されていて
ここにワイヤレスイヤホンを指定するだけですが、macOSの場合このアクションをサポートしていないようなのでシェルスクリプトを使用する方式としました。

## 前提

- ワイヤレスイヤホンは事前にペアリングを済ませておく必要があります。
- 動作確認に使用したワイヤレスイヤホンはSONYのWF-1000XM4です。
- macOSはVenturaを使用しています。
- Homebrewを使用します。Homebrewのインストールはこちらから。

https://brew.sh/index_ja

## 事前準備
この記事では「blueutil」を使用してbluetooth機器に接続します。
こちらを使用することで、コマンドからbluetooth機器の接続等を行うことができます。

https://github.com/toy/blueutil

事前にHomebrewを使用して「blueutil」をインストールしておきます。
~~~ .sh
brew install blueutil
~~~

:::note info
blueutilはprivate APIを使用しているようなので、今後OSのバージョンアップによっては利用できなくなる可能性もあります。※2023/08/16時点では問題なく動作しました。
:::

インストール完了後、次のコマンドを実行するとペアリング済みのbluetooth機器をリストアップしてくれます。
~~~ .sh
blueutil --paired
address: aa-bb-cc-dd-ee-ff, not connected, not favourite, paired, name: "WF-1000XM4", recent access date: 2023-08-16 11:41:37 +0000
address: ff-ee-dd-cc-bb-aa, not connected, not favourite, paired, name: "WF-1000XM3", recent access date: 2023-08-16 11:41:37 +0000
~~~

## 機器接続のシェルスクリプト

引数で渡した機器名でペアリング済みの機器を検索しアドレスを取得します。
取得したアドレスを元にbluetooth機器に接続します。

~~~ script.sh
export PATH="/opt/homebrew/bin:$PATH"

#bluetooth power check. [power on:1 power off:0]
power=$(blueutil --power)

if [[ $power -eq 0 ]];then
  echo "script error : bluetooth power off" >&2
  exit 1
fi

#argument check. only one argument.
if [[ $# -eq 1 && $1 != "" ]];then
  #search paired device. and select the first one.
  deviceAddr=$(blueutil --paired | grep -m1 \"$1\" | cut -d , -f 1 | cut -d : -f 2 | tr -d " ")
  if [[ $deviceAddr = "" ]];then
    echo "script error : paired device not found" >&2
    exit 1
  else
    blueutil --connect $deviceAddr
    exit $?
  fi
else
  echo "script error : argument error" >&2
  exit 1
fi
~~~

スクリプトで使用するblueutilのコマンド

~~~ .sh
blueutil --power
~~~
bluetoothのON/OFF状態を取得します。

~~~ .sh
blueutil --paired
~~~
ペアリングされている機器の一覧を表示します。スクリプトではこの一覧からアドレスを取得して
機器への接続を試みます。


## スクリプト補足

1行目のPATHを追加処理をしておかないと、ショートカットアプリからシェルスクリプトを実行したときに「blueutil」を参照できず実行エラーとなりました。
~~~ .sh
export PATH="/opt/homebrew/bin:$PATH"
~~~


---
ペアリング済みの機器一覧をgrepやらcutで処理して、機器のアドレスを取得します。
同じ名称の機器がペアリングされていた場合、ヒットした最初の1つにだけ接続するためにgrepのオプションにm1を指定しています。
機器名を完全一致で検索したいのでgrepの検索文字列にはダブルクォートも付与しています。
ペアリング済みの機器一覧が↓の場合、引数に「WF-1000」とだけ指定すると複数引っかかるので・・・
※"WF-1000"でgrepすることで機器名の完全一致検索をしたい。
~~~ .sh
deviceAddr=$(blueutil --paired | grep -m1 \"$1\" | cut -d , -f 1 | cut -d : -f 2 | tr -d " ")
~~~
機器一覧の取得結果(この結果をgrepやらcutしていくイメージ)
~~~
address: aa-bb-cc-dd-ee-ff, not connected, not favourite, paired, name: "WF-1000XM4", recent access date: 2023-08-16 11:41:37 +0000
address: ff-ee-dd-cc-bb-aa, not connected, not favourite, paired, name: "WF-1000XM3", recent access date: 2023-08-16 11:41:37 +0000
~~~

## Macショートカットアプリへの設定

ショートカットアプリを起動して新規ショートカットを作成します。設定するアクションは次の通りです。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1164081/702f8572-97af-3c38-171c-72d6c08e5950.png)
##### アクション1　「テキスト」
接続したいbluetooth機器名を設定します。

##### アクション2　「変数を設定」
任意の変数名を設定して値　に1つ目前のアクションの「テキスト」を設定します。

##### アクション3 「シェルスクリプトを実行」
上記のシェルスクリプトをコピペします。「入力」にはアクション2で設定した変数を選択します。
「入力を渡す方法」は「引数として」を選択すると、アクション2の変数がシェルスクリプトに引数として渡されます。
※アクション2の変数を設定はなくてシェルスクリプトの入力に直接テキストを渡すでもOKかもしれません。

## 使い方
スマホ：iPhone PC:Mac

スマホにワイヤレスイヤホン接続のショートカットを設定
「再生出力先を設定」のアクションにワイヤレスイヤホンを設定

PCに本ショートカットを設定

ワイヤレスイヤホンを使用したい端末でショートカットを実行して接続先を切り替えて行くイメージです。
使用しているイヤホンによってはこの使い方ができないかもしれません。
(マルチペアリングに対応していれば大丈夫だと思っていますが・・・）


## さいごに
次期macOS Sonomaではデスクトップにショートカットウィジェットも配置できるようなので、
このショートカットをデスクトップに配置すれば、よりスムーズに機器の接続切り替えができそうですね。