Pythonを動かすための環境

Pythonスクリプトを動かす

ということで、本日もこのTODOリストの作業を行っていきます。

  • Switchbotの温湿度計からの情報をRaspberryPiZeroで取得する
    • もしくはZabbixサーバで情報取得

前回の確認でbluetoothデバイスが存在して、近隣デバイスのSCANが可能であることがわかりました。 あとは、別サーバで動いているPythonスクリプトがちゃんと動くかどうかの確認です。

Python3がインストールされているので、まずはbleライブラリ等々のインストールですね。

pipが入ってないのでpipのインストール aptじゃなくてパッケージを直で入れる方法もあるけど、なんやかんや依存関係が解消されないんでとりあえずaptでインストール。

$ sudo apt install python3-pip

さてbleライブラリのインストール。 libglibが必要になるようなので、まずはそれを入れてからpipでbluepyをインストール。

$ sudo apt-get install libglib2.0-dev
$ sudo pip3 install bluepy

Switchbotからどうやって情報を取得しているのかについては、先人の知恵をお借りしております。 HomeAssistantにデータを投げるためのMQTTを使っているんですが、それをまとめてくれた方がいるのでそのスクリプトを拝借してる感じですね。

ronschaeffer/sbm2mqtt: Grab SwitchBot Meter data from Bluetooth Low Energy advertisements and publish them to an MQTT topic for use with Home Assistant, etc.

動作に必要なmqttのパッケージをインストール。

$ sudo pip3 install paho-mqtt
$ git clone https://github.com/ronschaeffer/sbm2mqtt.git

設定ファイルを書いて実行するだけなんですが、エラーが出ましたね。

bluepy.btle.BTLEManagementError: Failed to execute management command 'le on' (code: 17, error: Invalid Index)

“le on"はBluetoothのLow enegyに関するコマンドだと思うので、もしかしてLE対応してないのでしょうか。 まずはデバイスの確認を。

$ sudo hciconfig -a

hci1:   Type: Primary  Bus: UART

        HCI Version: 4.0 (0x6)  Revision: 0x3000
        LMP Version: 4.0 (0x6)  Subversion: 0x4406
        Manufacturer: Broadcom Corporation (15)

Bluetooth4.0なのでLE対応だと思うんですが、どうなんですかねぇ。もうちょいプリミティブなスクリプトから動かすべきじゃないかという気もしてきたので、一旦テスト用スクリプトを持ってきて動かしてみますが、同じエラー。 これはハードウェア的に対応してないのかな。

調べること数分。 どうやら、Bluetoothデバイスが2つ存在しているように見えてます。

$ sudo hciconfig -a
hci1:   Type: Primary  Bus: UART

hci0:   Type: Primary  Bus: USB

hci0が何者なのかわかっていないんですが、こいつでのスキャンが優先されていてエラーが出ているようですね。 さてさてこいつが何者なのか。

と思って、サーバを見たらBluetooth5.0と書かれたドングルが。 なんか以前に試して失敗したのを思い出しました。たぶんこのドングルがhci0なんでしょうね。 引っこ抜いて再確認。

$ sudo hciconfig -a
hci1:   Type: Primary  Bus: UART

hci1だけになりました。いやでもhci0にしたいなぁということでまずは再起動。そんなに稼働中のサーバを再起動させちゃいけないのはわかってるんですが、まあ自宅サーバなんでね、とりあえずサクッと。

$ sudo hciconfig -a
hci0:   Type: Primary  Bus: UART

無事にhci0になったのでスクリプト等々動かしてみますと。

スクリプト自体はシンプルにデータ取得するだけのものですので、内容は割愛。 無事に実行できました。

$ sudo python3 test_switchbot.py
battery: 100
temperature: 27.7
humidity: 73

あとは本丸の方のスクリプトを実行してみてって感じですが、これも問題なく動作。 これで一件落着という感じですね。しかし動作しないドングルをそのまま指してたなんて…

だがしかし

意気揚々とcronに設定したもののスクリプトが動作しない。 確認したら、sudoはずすと実行できないことがわかりました。まあbluetooth関連のものがいじれないユーザってのが問題なんでしょうねぇ。

ということで、実行したいユーザをbluetoothグループに追加してあげます。

$ sudo usermod -G bluetooth user
$ id user
uid=1000(user) gid=1000(user) groups=1000(user),123(bluetooth)

これでuserがbluetooth周りのコマンドが実行できるようになりましたが、まだスクリプトの実行ができない。 この辺は初歩の初歩っぽいんだけど、すっかり頭から抜け落ちていて困りますわ。

調べたところ以下のissueを見つけました。

Cannot use bluepy without sudo · Issue #313 · IanHarvey/bluepy

ああ、なんかライブラリに権限与えるんだっけかと思い出し、以下を実行。

$ sudo setcap 'cap_net_raw,cap_net_admin+eip' /usr/local/lib/python3.8/dist-packages/bluepy/bluepy-helper

無事にスクリプトが実行できるようになりました。 前にやってるはずなんですが、メモとか取ってなくて忘れちゃってるパターンですねぇ。反省。