気の向くままに辿るIT/ICT/IoT
システム開発

Debian GNU/LinuxでBluetoothデバイスの電池残量を取得する方法

ホーム前へ次へ
*BSD/PC-UNIX/Linuxって?

Debian GNU/LinuxでBluetoothデバイスの電池残量を取得する方法

Debian GNU/LinuxでBluetoothデバイスの電池残量を取得する方法

2023/09/20

 Linux、ここでは、Debian bookwormでBluetoothデバイスの電池残量を取得してみた話。

経緯

 スマホでは設定アプリから辿ると表示されるBluetoothヘッドセット|イヤホンやBluetoothスピーカーなどBluetoothデバイスのバッテリ残量をLinuxパソコンでも知りたいし、表示したい。

GNOME拡張機能で電池残量を取得

 と思ったらgithub.com/TheWeirdDev/Bluetooth_Headset_Battery_Levelによれば、GNOME拡張機能やバッテリ残量取得スクリプトを使う方法がある模様。

GNOME拡張機能におけるDebian bullseyeとbookwormでの違い

 今回、電池残量取得を前にBluetoothヘッドセットのマイクの認識においてPulseAudioでは未対応、PipeWireは対応、PipeWireはbullseyeよりbookwormの方が簡単に入れられるということでbookwormについてはPulseAudioからPipeWireへ移行しました。

 よって、もしかするとbullseyeとbookwormではなく、PulseAudioとPipeWireの、または合わせ技による違いかもしれません。

 ちなみにarm64 Raspberry Pi OS bullseyeにおけるPulseAudioのバージョンは、[14.2-2+rpt1]、amd64 Debian bookwormにおけるPipeWireのバージョンは、[0.3.65-3]。

 そんな中、GNOME拡張機能における[gnome-browser-connector](旧chrome-gnome-shell)は、ディストロによって新旧分かれる模様でDebianでもbullseyeでは(PulseAudioでは?)旧パッケージ名のみインストールされました。

 一方、bookwormでは(PipeWireでは?)、旧パッケージ名でインストールすると新旧何れもバージョン42.1-3がインストールされました。

 ただ、GNOME拡張機能というだけあってGNOME以外のデスクトップ環境では対応がマチマチ、また、GNOMEでもDebian bookworm(PipeWire)については、ほぼパーフェクトも、Raspberry Pi OS bullseye(PulseAudio)では、GNOME Wayland/Xorg/Classicですら未完であり、未完ながらも若干状況が異なる結果に。

 と言ってもGNOME以外のデスクトップ環境については対応しているというよりは、おそらくBlueman、もしくは一部GNOME系に依存している部分があるためにそう見えるということかと。

 また、スクリプトのところでも書いていますが、GUIへのBluetooth機器のバッテリ残量表示反映においてもgnome-browser-connectorとchrome-gnome-shellの何れか、または両方がインストールされていることに加え、/etc/bluetooth/main.confとsystemdのbluetooth.serviceファイルの双方でExperimentalフラグを立てる必要がありました。

 尚、今回検証したのは、

 Debian bookwormのCinnamon、MATE、GNOME Wayland|Xorg、KDE Plasma Wayland|Xorg|Openbox、LXDE。

 Raspberry Pi OS bullseyeのCinnamon、GNOME Wayland|Xorg|Classic、LXDE。

 ブラウザについては、FirefoxとChromium、前者は両OS共にバージョン[102.13.0esr]、後者はbullseyeが[115.0.5790.98]、bookwormが[114.0.5735.198]。

 まず、メニューからGNOME拡張機能パネルを表示できたのは、bookwormのGNOME Wayland|Xorg、bullseyeのGNOME Wayland|Classic、GNOMEのXorgは、メニュー上に日本語化されていない[Extention Manager]はありましたが起動せず。

 他のデスクトップ環境では、メニューにGNOME拡張機能パネルがあったとしても起動するとログインは不要のはずも以下のメッセージが表示されました。

 「何か問題が起きています。大変申し訳ありませんが、インストール済み拡張機能一覧を取得できませんでした。GNOMEにログインしていることを確認した上で再試行してください。」

 また、GNOME拡張機能をインストールしたことで一部のデスクトップ環境では、ステータスバー上にBluetooth機器用アイコンとアイコンをクリックすると開くその下のメニューは表示されるようになったものの、[Bluetooth battery indicator]アドオン画像のようなバッテリ残量は表示されない...。

 と思いきや、そもそもステータスバー上に%表示されない仕様なのか、されなくなったのか、後述の[bluetooth battery indicator]パネルで設定したバッテリアイコンやヘッドセットなどのアイコンのみ表示されるようになりました(bullseye/bookworm共に)。

 これが表示されたのは、まさにGNOMEオンリー、bookwormのGNOME Wayland|XorgとbullseyeのGNOME Wayland|Xorg|Classic。

GNOME拡張機能パネルとBluetoothバッテリインジケータパネル

 GNOME拡張機能パネルから開いた[bluetooth battery indicator]パネルがこれ。

 このパネルは、メニューから選択したGNOME拡張機能パネルからのみならず、GNOMEステータスバー上のBluetooth機器用アイコンクリックで表示される[設定]から、また、後述のブラウザ用GNOME Shellからも表示できたりします。

 先のステータスバー上のBluetooth機器用アイコンは、デフォルトはバッテリアイコンのようですが、このパネルの[Icon]で選択・変更できるようになっています。

 選択肢としては、現状、Default、Headphones、Mouse、Keyboard、Headset、Game Controller、Batteryとなっています。

 そこのBluetooth機器名横にある%sourceセレクトボックスで[Python script]の他、[Bluetoothctl]、[UPower]が選択可能となっているので、これらでもバッテリ残量は取得できるっぽいです。

 後述の通り、[Python script]、[UPower]での電池残量取得方法はわかりましたが、[bluetoothctl]で電池残量...bluetoothctl --helpしてもイマイチわからない...。

Bluetooth電池残量も表示される電源パネル GNOME on Xorg/Debian 12.0 bookworm amd64

 上部ステータスバー右の電源やWi-Fiなどがまとまっているパネルにあるバッテリアイコン(横の数値は、ノートPCのバッテリ容量)をクリックしてGNOME拡張機能パネルが開いてみました。

 するとGNOME拡張機能パネルの電源タブにBluetooth機器の電池残量インジケーターとパーセントが表示されました。

 が、今回検証した中で電源タブ内にBluetooth機器のバッテリ残量及びバッテリインジケータが表示されたのは、Debian bookwormのGNOME on Xorgだけでした。

 もちろん、Bluetoothイヤホンのみならず、ダイソーのWS001などBluetoothスピーカーほかについても電池残量も含めた各種情報を取得できます。

電池残量インジケータが表示されたGUIパネルBluetoothマネージャBlueman

 Blueman(Bluetoothマネージャ:GTKによるGUIパネル)上にも追加で電池残量のインジケータが表示されるようになりました(グレーアウトされて無効なのかと思いきや、単にグレーな配色のインジケータで電池残量増減で伸縮することを確認済み)。

 こうなったのは、Debian bookwormにおいては、KDE Plasma、Cinnamon、MATE、LXDEだけです。

 Raspberry Pi OS bullseyeでは、GNOME Wayland、Cinnamon、LXDEでBluemanが起動しましたが、電池残量インジケータはありませんでした。

 bullseyeのGNOME Waylandを除くGNOMEでは、GNOME拡張機能に集約する意図でもあるのか?そもそもメニューにも[Bluetoothマネージャ]はありません。

 他のデスクトップでは表示されるということは、インストールはされているのでCLIで端末からblueman-managerとして起動すれば表示はされますが、そのパネルにも電池残量インジケータはありませんでした。

Bluetooth機器接続時・BluetoothマネージャBluemanの各種インジケータをポイント時に追加表示された電池残量レベル

 ただし、ペアリング・接続済みのBluetooth機器がある場合、インジケータ部をポイント(マウスオーバー)すると各種情報の中にバッテリ残量が%表示されています。

 これに関してはBluemanを起動できるデスクトップ環境においてbullseyeのデスクトップは未対応、bookwormのデスクトップは対応済みでした。

 一方、Bluetooth機器が接続する際に「接続しました」的ポップアップ表示時にもバッテリ残量が%表示される場合がありますが、これはbullseyeとbookwormでくっきり対応が別れました。

 bullseyeでは未対応だったようでポップアップ上にバッテリ残量が表示されるデスクトップはありませんでしたが、bookwormでは、KDE Plasma Wayland|Xorg|Openbox、GNOME Wayland|Xorg、Cinnamon、MATE、LXDEにおいて、このポップアップ上にBluetooth機器のバッテリ残量が表示されました。

GNOME拡張機能ブラウザアドオンGNOME Shell integrationで電池残量を取得

GNOME Shell integration

 一方、GNOME拡張機能のブラウザアドオンとしてGNOME Shell integrationがあります。

 FirefoxやChromiumなどそれぞれにアドオンがあり、これをインストールしておくとブラウザからもBluetooth機器のバッテリ残量表示方法などを指定できる[bluetooth battery indicator]をインストールすることもでき、そこから当該パネルを開くこともできるようになります。

GNOME Shellインストール済み拡張機能タブ

 環境に不足がなければ、例えば、[インストール済み拡張機能]タブは、こんな感じで表示されます。

 このように表示されたのは、bookwormのGNOME Wayland|Xorg。

 尚、もし、[拡張機能]タブで任意の拡張機能をインストールしようとしたら、ON|OFFスイッチがグレーアウトされていてクリックできない!という状況に遭遇した場合、この[インストール済み拡張機能]タブ上の[Shellの設定]にある[Disable all extensitons]などがONになっていないか確認、なっていたらOFFにします(そうすれば先のスイッチも切り替えられるようになります)。

注意メッセージ付きGNOME Shellインストール済み拡張機能タブ

 次のような、なんらかのアドバイスがある程度では、拡張機能を使うことはできます。

[Your native host connector do not support following APIs: v6. Probably you should upgrade native host connector or install plugins for missing APIs. Refer documentation for instructions.]

 このように表示されたのは、bullseyeのGNOME Wayland|Xorg|Classic。

エラーメッセージ付きGNOME Shellインストール済み拡張機能タブ

 こんなエラーメッセージがあると、さすがに拡張機能を使うことはできません。

[Unable to locate GNOME Shell settings or version. Make sure it is installed and running.]

 このように表示されたのは、bookwormのKDE Plasma Wayland|Xorg|Openbox、Cinnamon、MATE、LXDEとbullseyeのCinnamon、LXDEです。

 何か策があるのかについては、探っていませんが、つまり、GNOME Shellについては、GNOME以外は全滅という結果に。

Pythonスクリプトで電池残量を取得

debian_bookworm $ cd path/to/
debian_bookworm $ git clone https://github.com/TheWeirdDev/Bluetooth_Headset_Battery_Level
debian_bookworm $ cd Bluetooth_Headset_Battery_Level
debian_bookworm $ ./bluetooth_battery.py $(bluetoothctl info | awk '/^Device/ {print $2}') | awk '{print $6}'
 
** %
debian_bookworm $

 続いてBluetooth機器バッテリ残量取得用Pythonスクリプトについて。

 Bluetooth機器の電池残量表示用Pythonスクリプトについては、gitするリンク先の通りにgit cloneしてBluetooth_Headset_Battery_Levelディレクトリに移動。

 Bluetoothヘッドセットをペアリング・接続した状態で端末から[./bluetooth_battery.py $(bluetoothctl info | awk '/^Device/ {print $2}') | awk '{print $6}']で残量(**%)部分のみ取得できました。

UPowerで電池残量を取得

debian_bookworm $ systemctl cat bluetooth.service
# /lib/systemd/system/bluetooth.service
...
debian_bookworm $ sudo vi /lib/systemd/system/bluetooth.service
...
#ExecStart=/usr/libexec/bluetooth/bluetoothd
ExecStart=/usr/libexec/bluetooth/bluetoothd --experimental
...
debian_bookworm $ sudo systemctl daemon-reload
debian_bookworm $ sudo systemctl restart bluetooth.service
debian_bookworm $ upower -d
...
Device: /org/freedesktop/UPower/devices/headset_dev_**_**_**_**_**_**
 native-path:    /org/bluez/hci0/dev_**_**_**_**_**_**
 model:          DAISO_BT005
...
 headset
  percentage:    ** %
...
...
debian_bookworm $

 続いてupowerコマンドでのBluetooth機器バッテリ残量取得方法について。

 upowerコマンドで確認するためには、/etc/bluetooth/main.conf、もしくは併せて、systemdのbluetooth.serviceファイルでExperimentalフラグを渡します。

 main.confの場合、[Experimental=true]を追記。

 bluetooth.serviceファイルの場合、[ExecStart=/usr/libexec/bluetooth/bluetoothd]に[--experimental](または、[-E])オプションを追記。

 何れも保存終了後、daemon-reload、systemctl restart bluetooth.service、upower -d。

 どうやら何れか一方ではダメなようで両方追記して確認したところ、upower -dの表示結果にDAISO_BT005などbluetooth機器も列挙されるようになり、他と同様、[percentage:]行にバッテリ残量が表示されました。([**_**_**_**_**_**]部は当該Bluetooth機器のMACアドレス)

 ちなみに一方だけだと[0% (should be ignored)]となり正しい値を得られず、他方、冒頭書いたように、これら両方のファイルにおいてExperimentalフラグを立てて有効にすることでGUIでもBluetooth機器を接続した際の「接続しました」ポップアップに電池残量が表示されたり、bookwormのXorgベースGNOME のみとは言え、GNOME電源パネルにインジケータ&電池残量が表示されたりしました。

 尚、Debian系でもRaspberry Pi OS bullseyeでは(PulseAudioでは?)対処前後ともにDisplayDeviceしか表示されず、Debian bookwormでは(PipeWireでは?)対処前でも(ノートPCだからかバッテリほか)DisplayDevice以外の情報もあり、対処後に至ってはbluetooth機器も表示されるようになりました。

 pythonスクリプトでは、時間と負荷がかかっているように見受けられ、これによるのか、電池残量確認後、時折、BT005が切断されたこともありましたが、upower -dではスムースに結果を得ることができ、そうしたこともありませんでした。

 また、後者では、定期的(1分ごと?)に取得しているようで[updated:]行に年月日・時分秒、カッコ書きで何秒前という情報も表示されます。

debian_bookworm $ upower --show-info /org/freedesktop/UPower/devices/headset_dev_**_**_**_**_**_** | grep percentage | awk '{print $2}'
 
** %
debian_bookworm $

 よって比較的頻繁に取得する必要があるならなおのこと、リアルタイムではないものの、UPowerコマンドでこのように取得した方が良さそうです。

bluetoothctlで電池残量を取得

 それにしてもbluetoothctlコマンドでどうやって電池残量を取得できるんでしょ?、できるなら、また、リアルタイムで高速なら、一番よさげなんですけどね。

 ごにょごにょするとbluetoothctl infoに表示される、更にsudo付けるんだよという情報はありますが、ディストロやバージョンによるのか、bluetoothctlでのBluetooth機器のバッテリ残量については、未だお目にかかることはできていません。

備考

 2023/07/27付いろいろなOSでBluetoothイヤホン・ヘッドホンを使うから転載。

ホーム前へ次へ