リモート開発メインのソフトウェア開発企業のエンジニアブログです

Raspberry pi でBME280の値をRealtimeDatabaseに格納してみた

検証環境:RaspberryPi3modelB RaspberryPiOSLite(64bit) AE-BME280

前説

最近暑くなってきて室内温度が気になってきたので、温度計を買おうかと思ったのですが、

以前買った温度湿度センサーがあったため思いとどまり、自作しようと考えました。

昔同じ内容のものを作ったのですが、今回はfirebaseを使ってやっています。

前準備

OSの書き込み、IPアドレスの固定化、ssh接続を公開鍵方式でおこなう等は省略します。

AE-BME280との接続

以下の記事を参考にさせていただきました。

Python用モジュールの準備

sudo apt-get update
sudo apt-get install i2c-tools
sudo apt-get install python-smbus
sudo apt install python3-pip
sudo pip install smbus2
pip install python-dotenv   #.envファイルの使用
pip3 install firebase-admin #RealtimeDatabase用 

BME280の動作確認

以下の記事を参考にさせていただきました。

python3 bme280_sample.py

を実行すると

temp : 21.44℃
pressure : 1022.76hPa
hum : 37.77 %

というように表示されます。この数値をFirebase RealtimeDatabaseに格納しました。

Moba Pro

なぜRealtimeDatabaseなのか

センサーのデータを定期的に格納したいとき複雑な機能は必要ありません。

いわゆるmBaaSとも呼ばれるサービスはいくつかあり、

以前試用していた、ニフクラMobileBackendや、今回のFirebase、AWSのAmplifyなどが存在します。

MobileBackendではJSが使えたりRESTAPIが使えたりするのですが、

今回は無料でかつpythonも使えるFirebaseRealtimeDatabaseを試用しました。

RealtimeDatabaseの認証情報の準備

秘密鍵の生成を押下するとjsonファイルがダウンロードできます。

今回はこのjsonを[firebase.json]としました。

Realtime Databaseのルール設定

{
  "rules": {  
    "users":{
      "$uid":{
      	".read": "auth.uid !== null",
      	".write": "auth.uid !== null && auth.uid === $uid" 
      }
    }
  }
}

最低限認証されていなければ読み書き出来ないように、

writeはuidを利用して1段階多くしました。

.envファイルの準備

githubに公開する都合上、.envファイルに環境変数を定義しています。

cronで実行する都合上ファイルパスは絶対パスで記述したほうが良いと思います。

.env

DATABASE_URL=https://[データベースのURL]
ENV_LOCATION=[.envファイルの絶対パス]
FIREBASE_LOCATION=[RealtimeDatabaseの認証情報のjsonへの絶対パス]
FIREBASE_UID=[認証用UID 適当なStringでもOK]

RealtimeDatabaseへのデータの格納

https://github.com/TKano-Null/temp_viewer_checker

特に追加した点を見ます。※他にも変更した点がありますが、githubを参照してください。

def postData(data):
        t = data[0]
        p = data[1]
        h = data[2]

        date = time.time()
        env = os.environ.get("ENV_LOCATION")
        load_dotenv(env)
        url = os.environ.get("DATABASE_URL")
        uid = os.environ.get("FIREBASE_UID")
        firebase = os.environ.get("FIREBASE_LOCATION")
        cred = credentials.Certificate(firebase)
        firebase_admin.initialize_app(cred, {
                'databaseURL': url,
                'databaseAuthVariableOverride': {
                'uid': uid
                }
        })
        users_ref = db.reference('/users/'+ uid +'/tempdata')
        users_ref.push({
                'date': date,
                'temp': t,
                'humi': h,
                'pres': p
        })

引数のdata配列にそれぞれセンサーの値を格納します。

タイムスタンプ用に[date]に現在日時をUNIX時間を入れています。

[cred]にはダウンロードした[firebase.json]のパスを指定しています。

下記のようにデータが格納されます。

https://xxxxxxx.firebaseio.com/
    users
        xxxxUIDxxxx
            tempdata
                -NTfdPiB8xxPS9xqXDTm
                     date:2023-04-23T10:06:12
                     humi:48.20058577353762
                     pres:101823.59695935075
                     temp:25.40604123212397

Cronで定期実行

sudo apt-get install postfix
crontab -e

今回は5分ごとに実行します。

*/5 * * * * python3 /home/username/temp_viewer/temp_viewer_checker.py

詰まった点

cronで実行したときエラーとなって実行することが出来ませんでした。

RaspberryPiOSLiteには[postfix]がないためエラーとなっていました。

データの格納に成功したので、今後データ閲覧用のアプリケーションを作成していきたいと思います。

← 前の投稿

FirebaseRealtimeDatabaseのJSONデータをFlutterのRestAPIで表示

次の投稿 →

Kinesis Data Firehose の PutRecordBatch のリトライ方法

コメントを残す