ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

【AutoHotkey】 Bluetooth デバイスが接続状態になるまで待つ ただし画像認識。

f:id:yasushiito:20190403184928p:plain

これまでの経緯。

PC で再生しているラジオ放送を Bluetooth レシーバで受信する環境を構築しようとしています。
Bluetoothバイスが接続される前に再生を始めてしまうと音声は PC 本体に流れてしまって、後から接続しても切り替えてもらえないことがわかりました。
ラジオの再生はベッドに横になってから自動操作で始めるようになっているので、レシーバが接続されるのを待って再生開始する手順を自動操作で行わなければならないことになります。
そこで前回、キーボードショートカットでブルートゥースデバイスの一覧を開いて接続状態を確認する方法を調べてみました。
その結果、接続状態の確認を画像認識で行う必要があるとわかりました。
今回はその辺に挑戦したいと思います。

仕様まとめる。

大前提として、 PC 作業は完全に終わって寝る準備の体制を整えている 状態であるとします。
PC を操作するのは自動処理のスクリプトに限っているので突然ウインドウが開いたりマウスポインターが動き出しても問題ないとします。

  • キーボードショートカット Win + K で Bluetoothバイス一覧を開く。
  • 全てのデバイスの接続状態が描画されるまで数秒間待つ。
  • 画像認識でレシーバの接続状態を調べる。
  • 接続されていればtrue返す。

正常動作はこんな感じでしょうか。
接続状態を確認するためのサンプル画像は特徴的な部分をできるだけ小さく切り取ります。
あまり大きく切り取りすぎると認識に失敗する率が高まります。
今回接続を確認したいデバイスbt-b9の接続が確認できる時の様子は次のような感じです。

f:id:yasushiito:20191113100252p:plain


最も特徴的な部分はデバイス名 bt-b9と接続ボタンです。
しかしボタンの位置が離れてしまっているため、全てを切り取ると比較的大きな画像となってしまいます。
そこで、「音楽に接続済み」 テキストに着目して、「音楽に」 の辺りまで切り取ることにします。

ちなみに切断状態の時は「ペアリング済み」が表示されます。

f:id:yasushiito:20191110153302p:plain

どこかで偶然失敗するかも。

あくまで自動操作スクリプトですから、どこかの校庭で操作を失敗する可能性は常にあります。
その場合のフォロー方法考えます。

今回は私がベッドに寝てから 自動操作してもらう形になるので、 PC を完全に このスクリプトの動作だけに集中させることができます。

この条件なら接続が確認できるまで何回でもリトライすれば良いですね。
あまり頻繁にチェックしてもしょうがないので1分おきくらいにして、無限に続くのは怖いので30回程で諦めて中止するようにしましょう。
トータルで30分も監視すれば十分でしょ。
関数の脱出条件が、接続確認と途中終了に分かれるので戻り値は真と偽を返すようにしておきます。

実装。

画像認識でボタンを探してクリックする処理から画像認識部分だけをコピペしてきて改造します。
大して難しい部分もなく完成です。
これで完全にベッドイン してから悠々とレシーバーを起動すれば良くなりました。
精神的にだいぶ楽になりました。




この記事に登場するAutohotkey スクリプトについて

この記事の中で私が作成したプログラムは、全て自由に使うことができます。
詳しくはこちら