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に格納しました。
なぜ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]がないためエラーとなっていました。
データの格納に成功したので、今後データ閲覧用のアプリケーションを作成していきたいと思います。
コメントを残す