Raspberry Piで動くBME280環境センサ読み取りスクリプトのPython3対応

投稿者: | 2022年2月19日

I2Cで繋がる BME280 環境センサを使った、 Raspberry Pi による環境計測とデータ送信の仕組みを Python2 で組んでから数年。当時、Pythonほぼ初めての自分が作ったスクリプトを試行錯誤しながら Python3 対応してみました。

現在の環境を確認

環境センサBME280や照度センサBH1750とRaspberry Piを組み合わせたシステムをこれまで何度か記事にしてきましたが、その中で実際に動くプログラムはPythonで記述されています。

そのプログラムをPython3へ対応させるに当たり、検証に使うのは初代Raspberry PiにBME280とBH1750を2つずつ繋いだ、こちらのシステムです。

図1.Raspberry Pi冗長化環境センサシステム

図1.Raspberry Pi冗長化環境センサシステム

OSは次の通りで、Debian BusterベースのRaspberry Pi OSが入っています。

このシステムには既に2つの異なるバージョンのPythonが同居していますが、デフォルトはPython2.7です。

 

デフォルトをPython3へ

これら2つのPythonを維持したまま、そのデフォルトをPython3系に変えるのに、 update-alternatives コマンドを使います。まずこのコマンド初回起動では、以下のように未だ設定が無いことを指摘されますが、これは正常動作。

次に2つのPythonを次のように登録します。

そして始めのコマンドをもう一度実行すると、2つのPythonに設定された優先順位が表示されます。

上記の自動設定で問題が無ければ(Python3がデフォルト)Enterキーのみ、Python2をデフォルトにしたい場合はここでその選択番号1を入力します。

以上で、Python3がPythonのデフォルトになりました。

 

 pipはどうなっている?

今後に備えて、pip, pip2, pip3がこのシステムではどうなっているのか、確認してみました。

これまでpipとpip3をなんとなく使い分けていましたが、この環境ではどれでも同じでした。

 

Python2版環境センサ読取りスクリプト

Raspberry PiのI2Cインターフェイスにぶら下がった、BME280(温湿度気圧)とBH1750(照度)から計測値を読取り、ThingSpeakへ送信する環境ステーションで稼働しているのが、次のPython2ベースのスクリプトです(2種のセンサはそれぞれデバイスアドレスを違えた2個ずつの計4つの冗長構成)。

このスクリプトがPython3で正常動作するよう、デバッグを進めます。

 

デバッグ (1) print構文

まず怒られるのはprint構文ですが、エラーメッセージの中で正しい記述法まで提示してもらえるのですぐ気づきます。

 

デバッグ (2) smbus

基本的な構文ミスに続いては、インポートモジュール関連のエラーが挙がります。このsmbusはBH1750照度センサとの通信に必要なライブラリです。

これはPython3用のsmbusライブラリを apt パッケージマネージャから以下の要領でインストールすると解決します。

使い方はPython2の頃と互換なので、インポートさえ出来てしまえば、旧来のスクリプトをそのまま使えました。

 

デバッグ (3) Adafruit_Python_BME280

数年ぶりにAdafruit Python BME280のGitHubページを開いてみると、既にライブラリは非推奨とされてメンテナンスも終了していて、

図2.非推奨となったAdafruit_Python_BME280

図2.非推奨となったAdafruit_Python_BME280

開発はAdafruit CircuitPython BME280ライブラリへ移行されていました。

Adafruit_Python_BME280ライブラリの導入では、依存するAdafruit_Python_GPIOライブラリも共に git clone する必要があったりと手間が多いものでしたが、新しいAdafruit_CircuitPython_BME280ライブラリは、 pip3 から簡単にインストール可能です。

上記インストールの終了メッセージに於いて、パスのことをアドバイスされますが、結果的にはパスを通さなくとも動作しました。もしうまく呼び出せないようであれば、 ~/.profile の下方に次のスクリプトを追記すると良いでしょう(編集後、次回新セッションより反映)。

ライブラリの呼び出し方に使い方に関しては、公式ドキュメントが用意されています。

今回はスクリプトでは、おおよそ次のように変更すれば良さそうです。新ライブラリでもデバイスアドレスを指定して呼び出すことも出来るので一安心。また、公式ドキュメントでは海抜ゼロでの気圧を定数として与えて海抜を算出していますが、これを逆にしています。

 

Python3版環境センサ読取りスクリプト完成

以上のデバッグを経て、Python3で動作するスクリプトは出来上がりました。

実行結果は次のようになり、ThingSpeakへもこれまで通りデータを送信してくれました。

 

vnstatレポートメール送信スクリプトのPython3対応

このRaspberry Piには、 vnstat から毎朝ネットワークインターフェイスの集計レポートをメール送信するしくみもあって、このスクリプトも次のようにPythonで組んでいます。

仕組みはシンプルなのですが、利用しているemailライブラリの構成がPython3では少し異なるようです。逆に言うとライブラリのインポート以外の修正は必要ないので、スクリプトの冒頭を以下のようにPythonのバージョンを見てインポート方法を切り替えることで、汎用的に使えるようになります。

実行すると次のようなメールが発出されます。

図3.受信したvnstatレポートメール

図3.受信したvnstatレポートメール

 

 

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA