質問するログイン新規登録

Q&A

解決済

2回答

857閲覧

pythonでの、Bluetooth Battery MonitorのAPI利用について

suchiepai

総合スコア3

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

1グッド

2クリップ

投稿2026/01/11 14:39

編集2026/01/12 03:43

1

2

実現したいこと

画像にあるextraの値を得たいです

前提

Bluetooth Battery MonitorのAPIに問い合わせ

###質問の内容
win11でBluetooth Battery Monitorというbluetoothデバイスのバッテリー状況を
モニタするアプリを利用しているのですが(有料、試用期間あり)、
常時表示ができません。ですが、
https://www.bluetoothgoodies.com/info/battery-monitor-api/
このようなAPIが提供されているため、自作に挑戦してみようと思いました。
そこでコードを作ってみたのですが、
画像のようにJBL Soundgear Senceのextraとして
"L:100 R:99 C:50"の値があるはずだと思うのですが、nullになってしまいます。

Bluetooth Battery Monitorの画面。Soundgear Senceのextraが取得できています
イメージ説明
自作コードの実行結果。取得できず、nullに
イメージ説明

なぜなのかわかりません。
よろしくお願いします。

該当のソースコード

python 3.13.3, pyside6 6.10.1, requests 2.32.5 import sys, os import time import requests import json import atexit from PySide6.QtCore import Qt from PySide6.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QMessageBox ) class MainWindow(QWidget): def __init__(self): super().__init__() atexit.register(self.closing_process) self.label_device_01 = QLabel() self.label_device_02 = QLabel() self.label_device_03 = QLabel() self.label_device_04 = QLabel() self.label_device_05 = QLabel() layout_v = QVBoxLayout() layout_h = QHBoxLayout() layout_v.addWidget(self.label_device_01) self.setLayout(layout_v) self.get_devices() def get_devices(self): devices = requests.get(r"http://127.0.0.1:9876/devices") return_data = {"status": devices.status_code, "data": devices.json()} json_str = json.dumps(return_data, ensure_ascii=False, indent=4) self.label_device_01.setText(json_str) def closing_process(self): QMessageBox.information(None,"","closing_process実行") if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() #window.setWindowTitle("BluetoothBatteryMonitorUI") window.setWindowFlag(Qt.FramelessWindowHint) window.show() sys.exit(app.exec())

試したこと

params = {"extra": "extra"} devices = requests.get(r"http://127.0.0.1:9876/devices", params=params)

としてみました。
・Bluetooth Battery Monitorは購入済みです。
・paramsの値をvalue、string、keyなど組み合わせてみました。
・soundgearを一旦削除して、再ペアリングしました。

YT0014👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

hiroki-o

2026/01/11 15:23 編集

リンク先の仕様を読んだところ、extraにはnullではなく、何らかの文字列を指定するようです。 あと、ソースが見づらいので ```Python ここにソースを貼る ``` ようにしてください。質問は編集できます。 (追記) extraにはnullではなくextraを指定したのですね。失礼しました。
suchiepai

2026/01/11 23:28

コメントありがとうございます。 質問を修正しました。これで合ってますでしょうか。
hiroki-o

2026/01/12 02:45 編集

修正ありがとうございました。 現状、Bluetooth Battery Monitorを起動している状態で、 curl http://127.0.0.1:9876/devices を叩くと何が返ってきますか? (結果を質問に追記してください)
suchiepai

2026/01/12 02:57

コマンドプロンプトで実行するということですよね。 Soundgear 未接続 ``` {"devices":[{"connected":false,"extra":null,"icon":"C:\\Windows\\System32\\DDORes.dll,-3021","level":80,"name":"Aukey EP-B26"},{"connected":false,"extra":null,"icon":"C:\\Windows\\System32\\DDORes.dll,-3021","level":99,"name":"JBL Soundgear Sense"}],"version":"2.23.2.1"} ``` Soundgear接続 ``` {"devices":[{"connected":false,"extra":null,"icon":"C:\\Windows\\System32\\DDORes.dll,-3021","level":80,"name":"Aukey EP-B26"},{"connected":true,"extra":null,"icon":"C:\\Windows\\System32\\DDORes.dll,-3021","level":98,"name":"JBL Soundgear Sense"}],"version":"2.23.2.1"} ``` このようになりました。
hiroki-o

2026/01/12 03:19

それでnullとなるのは謎ですね。 もしかして無料期限が切れると値を返さなくなるとか... うちのBluetooth機器でextraを返すものがあったら、試してみます。 基本的には、返ってきたJSONからextraの値をパースする方向になると思います。
suchiepai

2026/01/12 03:43

お時間を割いていただきありがとうございます。 「試したこと」を追加しました。
dodox86

2026/01/14 11:23

試す環境が無いので質問文からの推測ですが、name: "JBL Soundgear Sense"のデバイスの"connected"が"false"になってます。これはBluetoothのペアリングは済んでいるけども、バッテリー情報、つまりextraの値を取る為に必要なBluetooth接続をしていない状態で、その為にnullなのでは?と思いました。他の情報はBluetooth接続していなくてもペアリング済みであれば取得できる情報なのだと思います。
dodox86

2026/01/14 11:31

extraの値はAPIの解説によると > Using the API > Current API implements only one endpoint GET /devices, which returns the JSON object that contains the following attributes. とあるので、HTTPリクエスト自体には期待するextraの値をセットする訳ではなく、返ってくるHTTPレスポンス中のJSONオブジェクト/文字列情報の中のextraを参照するだけ、のように読めます。つまり、要求時にセットする訳ではない。 > Try the API. > Enter the following command into the command prompt window: curl http://127.0.0.1:9876/devices > You should see the JSON response. とあるので、シンプルなHTTPのGETメソッドです。
suchiepai

2026/01/14 12:12

コメントありがとうございます。 接続状態でもコードを実行してみましたが、結果は同じでした。 コマンドプロンプトとrequestsで結果が変わることがあるということでしょうか。 また、コードではurlだけで実行していますが、これではないということですね。 どちらにせよコードが間違っているということだと思うのですが、 独学で一年ちょっとの自分の知識ではもうお手上げです・・・。 具体的な書き方をお願いできませんでしょうか。
dodox86

2026/01/14 17:51

> 接続状態でもコードを実行してみましたが、結果は同じでした。 接続した状態だと connected: の部分がtrueになったが、extra: がnullだった、と言うことでしょうか? 接続していたと思っているだけかもしれないので、その違いを確認することは重要です。 > コマンドプロンプトとrequestsで結果が変わることがあるということでしょうか。 Windowsのコマンドプロンプト上からcurlコマンドでHTTPリクエストを送信した場合と、 PythonのrequestでHTTPリクエストを送信した場合で結果が変わるのであれば、そのHTTPリクエストの内容が微妙に違ってしまい、本体サーバー側の挙動が変わることによって結果としてHTTPレスポンスの内容も変わってしまうという可能性はあります。 今回のコメントの意図のひとつは、「APIの資料で提案されている方法でまずは確認しましょう。なぜならサンプルレベルでは実績があるから」です。 こういったもので動作を確認してからプログラムを自作するのがひとつのセオリーです。 一応確認なのですが、以下は実施済みなのですよね? > Enabling the API > This feature is not enabled by default and needs to be enabled using the following Windows registry settings under the HKEY_CURRENT_USER\Software\Luculent Systems\Bluetooth Battery Monitor\ApiServer registry key. Please note that this registry key may not exist by default. > 具体的な書き方をお願いできませんでしょうか。 私の方で動作確認できないので書き方を提示しても混乱を招くだけですので、すみませんが上記コメントのみです。現時点でhiroki-oさんが回答欄で具体的に動いてくださっているので、私のこれ以上のコメントで混乱を避ける為にもいったん控えます。
suchiepai

2026/01/14 23:28 編集

お時間を割いていただきありがとうございました。 動作確認のアドバイスありがとうございます。 ご懸念の点については、画像2の自作コードの実行結果と、 hiroki-oさんへの返信に貼ったコマンドプロンプトでの curl http://127.0.0.1:9876/devicesの実行結果が同じなので 問題ないと思うのですが・・・。 接続状態で自作コードを実行しても同じ結果です。
dodox86

2026/01/15 00:47 編集

私のコメントの意図が伝わりきれていなかったと思うのですが(実証環境が無いので仕方が無い)、 ご提示のAPIの解説中のJSON文字列(HTTPレスポンスの内容)の例からすると、その例ではデバイスとして「"iPhone"」と「"ThinkPad Compact Bluetooth Keyboard with TrackPoint"」の2つが存在します。その内のひとつ、「iPhone」は「connect: false」でextraのみならずlevelもsecs_since_updateもnullです。それに対してconnect: trueの「"ThinkPad Compact Bluetooth Keyboard with TrackPoint"」は、extraはnullですがlevelもsecs_since_updateのどちらも取れています。すなわちconnect: trueであってはじめてそのデバイスが今持っている値を取得できるのではないかな、と言う推測です。今現状、質問者suchiさんの環境ではpythonプログラムの方でもコマンドプロンプトからのcurlコマンドの実行でもconnect: falseの状態が返るなら、取れなくても仕方ないのでは?と思った訳です。 [一部修正済み] が、あくまで上記も私の推測ですので、この辺りで止めておきます。失礼しました。
dodox86

2026/01/15 00:51

「Bluetooth Battery Monitor」のアプリケーションと自作のpythonプログラムを同じマシンから同時に動かしたりしてませんか? 同時にひとつしかダメ、と言う可能性もあります。APIの為のWEBサーバーを介して状態取得するだけだから、そんなことは無い気はしますが。
suchiepai

2026/01/15 11:09

ご心配いただきありがとうございます。 Bluetooth Battery Monitorを閉じているとCould not connect to serverとなるので、 Bluetooth Battery Monitor自体がローカルサーバーみたいです。
jimbe

2026/01/15 18:53 編集

level が 99 になってるので正しいのでは? アプリが必ず extra の値を表示しているとは限りませんし。(テキトウに計算してそれらしく表示している可能性です。)
hiroki-o

2026/01/15 21:04

99は、最初の画像で言うと棒グラフの値です。 今、話題にしているのは右下のL,R,Cの値です。 jimbeさんもdodox86さんも、自分で動かしてみたらわかると思いますよ。 このアプリはヘッドホンでなくても、キーボードやマウス等、バッテリー駆動のBluetooth機器なら対応しています。 7日間は無料で使えます。
bsdfan

2026/01/16 05:27

Bluetooth Battery Monitor のソフト開発者さんに問い合わせ、確認するのがいいんじゃないでしょうか。 (お金を出しているなら、ちゃんと対応していただけると思います) extraの値が取れるものと取れないものがあって、それがバグなのか仕様なのかも外からだと分りません。 仕様だとしたら、どういった条件ならextraが取得できるのか確認したらいいと思います。
guest

回答2

0

結局バグだったようで、次回アップデートで修正予定だそうです。
お騒がせして申し訳有りませんでした。

投稿2026/01/21 12:36

suchiepai

総合スコア3

0

ベストアンサー

回答ではありません。
やはり、実機(左右別の充電%を返すTWS)が無いとプログラミングしづらいので、Python有識者の皆さんに私が途中まで調べた情報を提供します。(Windows限定)
あと、下記の2番に該当するTWSを持っている人は、メーカーと型番をコメントしてください。
安かったら買って試してみます。

  1. Bluetooth Battery MonitorのUIにL,R,Cが表示される、かつ、extraにL,R,Cが返ってくるTWS
    (例:おそらくAirPods)
    requestsパッケージでcurl http://127.0.0.1:9876/devicesに該当する命令を投げて、返ってきたJSONをパースするだけです。

  2. Bluetooth Battery MonitorのUIにL,R,Cが表示されるが、extraにnullが返ってくるTWS
    (例:質問者さんのJBL Soundgear Sense)
    なぜBluetooth Battery Monitor HTTP/JSON APIのextraがnullを返すのかは謎ですが、機器がその情報を持っていることは確実です。
    上記APIではなく、bleakパッケージを使用します。
    BleakScannerクラスで機器と機能のUUIDを取得して、BleakClientクラスでUUIDを指定して情報を取ります。
    (実機確認していないので不確実)

  3. Bluetooth Battery MonitorのUIにL,R,Cが表示されない、かつ、extraにnullが返ってくるTWS
    (例:ダイソーで1100円で買ったFS-TWSCBDS01)
    もしかしたら、Windows APIを使って頑張れば取れるかもしれませんが、おそらく機器自体がその情報を持っていないでしょう。
    持っていたらBluetooth Battery Monitorに表示されているはずなので。

ちなみに、ダイソーで1100円のTWSは何種類か売っていますが、FS-TWSCBDS01はサポートしているBluetoothのバージョンが一番新しい(6.0)ので選択しました。

  • 音楽鑑賞は無理な音質
  • マイク機能の有無が不明なので、リモート会議等に使えるか不明

安いものには、安い理由があります。

投稿2026/01/14 14:44

hiroki-o

総合スコア1749

suchiepai

2026/01/15 11:01 編集

さらなるお骨折りをいただきありがとうございます。 bleakパッケージについて自分でもやってみます。 よく読んだらお金を払うとありますが、そこまでしていただくわけにはいきません。 できる範囲でのご助力で充分ですので、どうぞご無理なさらぬようお願いします。
hiroki-o

2026/01/15 21:14

出しても1万円以内です。遊びのプログラミングの題材としては、個人的に面白いと思ったので。
suchiepai

2026/01/17 07:08 編集

とりあえずご報告を。 質問については、英語でのやり取りに気後れして最終手段としていた作者への問い合わせを、 bsdfanさんの勧めどおりやってみます。 またそれとは別に、hiroki-oさんにいただいたbleakとUUIDの示唆により、おそらく soundgearのバッテリーレベルは取得できたようです。 一応書いておきますと、通常BLEでは UUID battery service 0000180F-0000-1000-8000-00805f9b34fb UUID battery level 00002a19-0000-1000-8000-00805f9b34fb のreadから取得できますが、soundgearはどちらも持っていませんでした。 そこでAIに助けてもらいながら、 3つの増減するreadまたはnotify特性の整数(L R Case)が取れる UUIDをさがしたところ、メーカーの独自UUIDとして見つけました。 AIいわく、独自UUIDはよく使われているそうです。 以下がnotifyで受け取った値ですが、 7、8、10番目が増減しています。()内はdecです。 aa:25:0d:01:01:01:55(85):5a(90):00:46(70):84:10:b9:10:00:00 ← L:85%, R:90%, C:70%? aa:25:0d:01:01:01:4a(74):4f(79):00:46(70):08:10:44:10:00:00 aa:25:0d:01:01:01:49(73):4f(79):00:46(70):06:10:44:10:00:00 ← ここで一旦切断して充電 aa:25:0d:01:01:01:64(100):63(99):00:5a(90):16:11:f7:10:00:00 aa:25:0d:01:01:01:5b(91):5c(92):00:5a(90):c2:10:cb:10:00:00 Bluetooth Battery Mnitorの数字とも一致していましたので、確定でいいかな、と。 作者への問い合わせの返事がありましたら、hiroki-oさんをベストアンサーとして 解決としたいと思います。
hiroki-o

2026/01/17 07:41

素晴らしいです。 それを回答に書いて(個人的にはサンプルソースがあれば嬉しいがご自由に)、自己解決にしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問